summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author Eric Hameleers <alien@slackware.com>2020-07-31 16:13:18 +0200
committer Eric Hameleers <alien@slackware.com>2020-07-31 16:13:18 +0200
commit703149752c6265b36973d2c1f0f5a69721e3128a (patch)
tree7ded0d801771d5705f48ffbfb48f37dd4829439e
parentdd005500c624d127321ff3fe14a0c29bfa8d67f7 (diff)
parentcd7ff1719433fbb3b6a8304596be173bc1b91b00 (diff)
downloadktown-master.tar.gz
ktown-master.tar.xz
Merge branch 'elogind'HEADmaster
-rw-r--r--PKGLIST1386
-rw-r--r--README.5_20.08 (renamed from README.5_20.06)164
-rwxr-xr-xdeps/alldeps.SlackBuild10
-rwxr-xr-xdeps/dbus/dbus.SlackBuild2
-rw-r--r--deps/espeak-ng/.deps1
-rw-r--r--deps/espeak-ng/.url1
-rwxr-xr-xdeps/espeak-ng/espeak-ng.SlackBuild118
-rw-r--r--deps/espeak-ng/slack-desc19
-rw-r--r--deps/flite/.url1
-rwxr-xr-xdeps/flite/flite.SlackBuild117
-rw-r--r--deps/flite/slack-desc19
-rw-r--r--deps/hack-font-ttf/.url4
-rw-r--r--deps/hack-font-ttf/CHANGELOG.md743
-rw-r--r--deps/hack-font-ttf/LICENSE.md64
-rwxr-xr-xdeps/hack-font-ttf/hack-font-ttf.SlackBuild86
-rw-r--r--deps/hack-font-ttf/slack-desc19
-rwxr-xr-xdeps/mlt/mlt.SlackBuild6
-rw-r--r--deps/mlt/patches/mlt_qt515.patch49
-rw-r--r--deps/noto-cjk-font-ttf/.url1
-rw-r--r--deps/noto-cjk-font-ttf/70-noto-cjk.conf147
-rw-r--r--deps/noto-cjk-font-ttf/HISTORY321
-rw-r--r--deps/noto-cjk-font-ttf/LICENSE92
-rw-r--r--deps/noto-cjk-font-ttf/NEWS40
-rwxr-xr-xdeps/noto-cjk-font-ttf/noto-cjk-font-ttf.SlackBuild83
-rw-r--r--deps/noto-cjk-font-ttf/slack-desc19
-rw-r--r--deps/noto-font-ttf/.url1
-rwxr-xr-xdeps/noto-font-ttf/noto-font-ttf.SlackBuild98
-rw-r--r--deps/noto-font-ttf/slack-desc19
-rw-r--r--deps/pcaudiolib/.url1
-rwxr-xr-xdeps/pcaudiolib/pcaudiolib.SlackBuild117
-rw-r--r--deps/pcaudiolib/slack-desc19
-rw-r--r--deps/pipewire/.url1
-rw-r--r--deps/pipewire/doinst.sh15
-rwxr-xr-xdeps/pipewire/pipewire.SlackBuild143
-rw-r--r--deps/pipewire/slack-desc20
-rw-r--r--deps/qca-qt5/.url3
-rwxr-xr-xdeps/qca-qt5/qca-qt5.SlackBuild4
-rwxr-xr-xdeps/speech-dispatcher/speech-dispatcher.SlackBuild4
-rwxr-xr-xdeps/updates.SlackBuild101
-rw-r--r--kde/build/digikam1
-rw-r--r--kde/build/krita1
-rw-r--r--kde/build/sddm-qt52
-rw-r--r--kde/cmake/sddm-qt51
-rw-r--r--kde/cmake/xdg-desktop-portal-kde2
-rw-r--r--kde/modules/frameworks1
-rw-r--r--kde/modules/kdepim1
-rw-r--r--kde/patch/akonadi.patch12
-rw-r--r--kde/patch/akonadi/akonadi_mariadb_qtsql.patch91
-rw-r--r--kde/patch/akonadi/akonadi_rename-header.patch77
-rw-r--r--kde/patch/akonadi/akonadi_revert-abs-path.patch70
-rw-r--r--kde/patch/akonadi4.patch1
-rw-r--r--kde/patch/amarok.patch1
-rw-r--r--kde/patch/ark.patch8
-rw-r--r--kde/patch/ark/ark_cve-2020-16116.patch47
-rw-r--r--kde/patch/ark/ark_kdebug357057.patch37
-rw-r--r--kde/patch/baloo5.patch5
-rw-r--r--kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff69
-rw-r--r--kde/patch/baloo5/baloo_def_indexing_disabled.patch12
-rw-r--r--kde/patch/calligra.patch15
-rw-r--r--kde/patch/calligra/calligra3_poppler-0.71.patch131
-rw-r--r--kde/patch/calligra/calligra3_poppler-0.72.patch29
-rw-r--r--kde/patch/calligra/calligra3_poppler-0.73.patch32
-rw-r--r--kde/patch/calligra/calligra3_qt511.patch135
-rw-r--r--kde/patch/calligra/calligra3_qt513.patch22
-rw-r--r--kde/patch/calligraplan.patch13
-rw-r--r--kde/patch/calligraplan/calligraplan.kcalcore.1.patch47
-rw-r--r--kde/patch/calligraplan/calligraplan.kcalcore.2.patch85
-rw-r--r--kde/patch/calligraplan/calligraplan.kcalendarcore.patch34
-rw-r--r--kde/patch/calligraplan/calligraplan.missingheader.patch25
-rw-r--r--kde/patch/calligraplan/calligraplan.qt-5.15.patch10
-rw-r--r--kde/patch/calligraplan/calligraplan.qt-511.patch125
-rw-r--r--kde/patch/cantor.patch4
-rw-r--r--kde/patch/cantor/cantor_julia.patch193
-rw-r--r--kde/patch/cantor/cantor_python.patch31
-rw-r--r--kde/patch/digikam.patch12
-rw-r--r--kde/patch/digikam/digikam_clang_fix.patch38
-rw-r--r--kde/patch/digikam/digikam_databasemodel.patch13337
-rw-r--r--kde/patch/digikam/digikam_imagemagick7.patch40
-rw-r--r--kde/patch/dolphin.patch1
-rw-r--r--kde/patch/falkon.patch2
-rw-r--r--kde/patch/falkon/falkon.qt-5.15.diff20
-rw-r--r--kde/patch/gwenview.patch4
-rw-r--r--kde/patch/gwenview/gwenview-17.04.1_dataloss.patch131
-rw-r--r--kde/patch/kaccounts-integration.patch4
-rw-r--r--kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch28
-rw-r--r--kde/patch/kalgebra.patch1
-rw-r--r--kde/patch/kalzium.patch3
-rw-r--r--kde/patch/kalzium/kalzium_kf_5.31.patch156
-rw-r--r--kde/patch/kate.patch5
-rw-r--r--kde/patch/kate/kate-15.12.0.patch31
-rw-r--r--kde/patch/kcalc.patch5
-rw-r--r--kde/patch/kcalc/kcalc-kdebug_360105.patch15
-rw-r--r--kde/patch/kcalcore.patch4
-rw-r--r--kde/patch/kcalcore/kcalcore_libical3.patch109
-rw-r--r--kde/patch/kcoreaddons.patch5
-rw-r--r--kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch27
-rw-r--r--kde/patch/kde-baseapps.patch5
-rw-r--r--kde/patch/kde-baseapps/dolphin_kdebug_327224.patch57
-rw-r--r--kde/patch/kde-cli-tools.patch6
-rw-r--r--kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch11
-rw-r--r--kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff59
-rw-r--r--kde/patch/kde-dev-utils.patch3
-rw-r--r--kde/patch/kde-dev-utils/build_with_kf548.patch156
-rw-r--r--kde/patch/kde-gtk-config.patch4
-rw-r--r--kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch622
-rw-r--r--kde/patch/kde-runtime.patch8
-rw-r--r--kde/patch/kde-runtime/kde-runtime.kdebug324470.diff49
-rw-r--r--kde/patch/kde-runtime/kde-runtime_gpgme.patch133
-rw-r--r--kde/patch/kde-workspace.patch4
-rw-r--r--kde/patch/kde-workspace/kde-workspace.desktopnames.diff34
-rw-r--r--kde/patch/kdeconnect-kde.patch1
-rw-r--r--kde/patch/kdelibs.patch3
-rw-r--r--kde/patch/kdelibs/fixbic-4.14.6.patch47
-rw-r--r--kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch11
-rw-r--r--kde/patch/kdelibs4support.patch4
-rw-r--r--kde/patch/kdelibs4support/update-FindGettext.patch36
-rw-r--r--kde/patch/kdenlive.patch4
-rw-r--r--kde/patch/kdenlive/kdenlive_gcc7.patch32
-rw-r--r--kde/patch/kdepim.patch4
-rw-r--r--kde/patch/kdepim/kdepim-install_kleopatra_headers.patch129
-rw-r--r--kde/patch/kdepimlibs.patch3
-rw-r--r--kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch59
-rw-r--r--kde/patch/kdepimlibs4.patch3
-rw-r--r--kde/patch/kdepimlibs4/kdepimlibs.libical3.diff184
-rw-r--r--kde/patch/kdeplasma-addons.patch4
-rw-r--r--kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch76
-rw-r--r--kde/patch/kdesdk-kioslaves.patch3
-rw-r--r--kde/patch/kdesdk-kioslaves/svn19.patch87
-rw-r--r--kde/patch/kdev-python.patch4
-rw-r--r--kde/patch/kdev-python/kdev-python-5.4.4_python38.patch560
-rw-r--r--kde/patch/kdewebdev.patch6
-rw-r--r--kde/patch/kdewebdev/include-tidy.patch13
-rw-r--r--kde/patch/kholidays.patch8
-rw-r--r--kde/patch/kholidays/kholidays_depfreeze_revert.patch61
-rw-r--r--kde/patch/kholidays/kholidays_isnan.patch30
-rw-r--r--kde/patch/kinfocenter.patch1
-rw-r--r--kde/patch/kio.patch18
-rw-r--r--kde/patch/kio/kio_KDEBUG_399709.patch44
-rw-r--r--kde/patch/kio/kio_dolphin_servicemenus.patch126
-rw-r--r--kde/patch/kio/kio_fix_url_setpath.patch65
-rw-r--r--kde/patch/kio/kio_kdelibs4_docpatch.patch22
-rw-r--r--kde/patch/kirigami2.patch8
-rw-r--r--kde/patch/kirigami2/kirigami_iconview_crash.patch143
-rw-r--r--kde/patch/kirigami2/kirigami_scrollbar.patch25
-rw-r--r--kde/patch/kmail.patch4
-rw-r--r--kde/patch/kmail/kmail_kontact_kdebug_404881.patch75
-rw-r--r--kde/patch/kmplot.patch3
-rw-r--r--kde/patch/kmplot/kmplot_isnan.patch42
-rw-r--r--kde/patch/konsole.patch16
-rw-r--r--kde/patch/konsole/konsole.cursor.antialias.patch83
-rw-r--r--kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch43
-rw-r--r--kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch58
-rw-r--r--kde/patch/konsole/konsole.term.is.konsole.patch24
-rw-r--r--kde/patch/kopete.patch9
-rw-r--r--kde/patch/kopete/kopete_kdebug376348.patch127
-rw-r--r--kde/patch/kopete/kopete_kdebug393372.patch30
-rw-r--r--kde/patch/korundum.patch5
-rw-r--r--kde/patch/korundum/korundum_ruby19.patch31
-rw-r--r--kde/patch/kpat.patch6
-rw-r--r--kde/patch/kpat/kpat_no_freecell_solver_dep.patch1475
-rw-r--r--kde/patch/krita.patch7
-rw-r--r--kde/patch/krita/krita_qt512.patch117
-rw-r--r--kde/patch/krita/krita_qt59.patch26
-rw-r--r--kde/patch/krita/krita_qtabletevents.patch67
-rw-r--r--kde/patch/krunner.patch4
-rw-r--r--kde/patch/krunner/krunner_KDEBUG_423003.patch54
-rw-r--r--kde/patch/kscreenlocker.patch13
-rw-r--r--kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch36
-rw-r--r--kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch112
-rw-r--r--kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch49
-rw-r--r--kde/patch/kstars.patch3
-rw-r--r--kde/patch/kstars/kstars_isnan.patch46
-rw-r--r--kde/patch/ksudoku.patch4
-rw-r--r--kde/patch/ksudoku/ksudoku_qwindowtitle.patch15
-rw-r--r--kde/patch/ktexteditor.patch3
-rw-r--r--kde/patch/ktexteditor/ktexteditor_fix_indentation.patch32
-rw-r--r--kde/patch/ktorrent.patch7
-rw-r--r--kde/patch/ktorrent/ktorrent_systray.patch24
-rw-r--r--kde/patch/ktorrent/ktorrent_taglib_linking.patch248
-rw-r--r--kde/patch/ktp-accounts-kcm.patch4
-rw-r--r--kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch32
-rw-r--r--kde/patch/kwin.patch11
-rw-r--r--kde/patch/kwin/kwin_cmake310.patch52
-rw-r--r--kde/patch/kwin/kwin_qt59_rootwindow_events.patch63
-rw-r--r--kde/patch/kwin/kwin_replace_logind_with_ck2.patch85
-rw-r--r--kde/patch/libkdcraw.patch3
-rw-r--r--kde/patch/libkdcraw/libkdcraw_cmake_minver.patch7
-rw-r--r--kde/patch/libkexiv2.patch3
-rw-r--r--kde/patch/libkexiv2/libkexiv2_cmake_minver.patch7
-rw-r--r--kde/patch/libkface.patch1
-rw-r--r--kde/patch/libkleo.patch4
-rw-r--r--kde/patch/libkleo/libkleo_gcc7.patch27
-rw-r--r--kde/patch/libksysguard.patch4
-rw-r--r--kde/patch/libksysguard/libksysguard_isnan.patch176
-rw-r--r--kde/patch/marble.patch4
-rw-r--r--kde/patch/marble/marble_qt4.patch47
-rw-r--r--kde/patch/messagelib.patch4
-rw-r--r--kde/patch/messagelib/messagelib_CVE-2018-19516.patch20
-rw-r--r--kde/patch/okular.patch3
-rw-r--r--kde/patch/okular/cve-2020-9359.patch32
-rw-r--r--kde/patch/oxygen-gtk2.patch1
-rw-r--r--kde/patch/oxygen-gtk3.patch3
-rw-r--r--kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch29
-rw-r--r--kde/patch/perlqt.patch1
-rw-r--r--kde/patch/plasma-browser-integration.patch1
-rw-r--r--kde/patch/plasma-desktop.patch20
-rwxr-xr-xkde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff60
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch39
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch16
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch25
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff88
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch24
-rw-r--r--kde/patch/plasma-framework.patch11
-rw-r--r--kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch24
-rw-r--r--kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch31
-rw-r--r--kde/patch/plasma-pa.patch5
-rw-r--r--kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch583
-rw-r--r--kde/patch/plasma-wayland-protocols.patch2
-rw-r--r--kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch60
-rw-r--r--kde/patch/plasma-workspace.patch17
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch152
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch23
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch189
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch32
-rw-r--r--kde/patch/plasma5-nm.patch14
-rw-r--r--kde/patch/plasma5-nm/plasma-nm-fixes.patch322
-rw-r--r--kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch73
-rw-r--r--kde/patch/plasma5-nm/plasma-nm_networkmanager.patch17
-rw-r--r--kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch31
-rw-r--r--kde/patch/powerdevil.patch4
-rw-r--r--kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch42
-rw-r--r--kde/patch/pykde4.patch1
-rw-r--r--kde/patch/qqc2-desktop-style.patch5
-rw-r--r--kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch51
-rw-r--r--kde/patch/sddm-theme-breeze.patch2
-rw-r--r--kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff10
-rw-r--r--kde/patch/spectacle.patch7
-rw-r--r--kde/patch/spectacle/spectacle_hidpi.patch28
-rw-r--r--kde/patch/spectacle/spectacle_rect_capture.patch52
-rw-r--r--kde/patch/strigi-multimedia.patch1
-rw-r--r--kde/patch/umbrello.patch10
-rw-r--r--kde/patch/umbrello/umbrello-4.11.4_listitem.patch13
-rw-r--r--kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch33
-rw-r--r--kde/slack-desc/akonadi2
-rw-r--r--kde/slack-desc/akonadi-calendar2
-rw-r--r--kde/slack-desc/akonadi-calendar-tools2
-rw-r--r--kde/slack-desc/akonadi-contacts6
-rw-r--r--kde/slack-desc/akonadi-import-wizard4
-rw-r--r--kde/slack-desc/akonadi-mime6
-rw-r--r--kde/slack-desc/akonadi-notes6
-rw-r--r--kde/slack-desc/akonadi-search6
-rw-r--r--kde/slack-desc/akonadiconsole2
-rw-r--r--kde/slack-desc/akregator2
-rw-r--r--kde/slack-desc/alkimia4
-rw-r--r--kde/slack-desc/analitza2
-rw-r--r--kde/slack-desc/ark2
-rw-r--r--kde/slack-desc/artikulate8
-rw-r--r--kde/slack-desc/attica-framework2
-rw-r--r--kde/slack-desc/audiocd-kio2
-rw-r--r--kde/slack-desc/baloo512
-rw-r--r--kde/slack-desc/baloo5-widgets4
-rw-r--r--kde/slack-desc/blinken2
-rw-r--r--kde/slack-desc/bluez-qt10
-rw-r--r--kde/slack-desc/bomber10
-rw-r--r--kde/slack-desc/bovo6
-rw-r--r--kde/slack-desc/breeze6
-rw-r--r--kde/slack-desc/breeze-grub2
-rw-r--r--kde/slack-desc/breeze-gtk4
-rw-r--r--kde/slack-desc/breeze-icons4
-rw-r--r--kde/slack-desc/calendarsupport2
-rw-r--r--kde/slack-desc/calligra10
-rw-r--r--kde/slack-desc/calligraplan8
-rw-r--r--kde/slack-desc/cantor10
-rw-r--r--kde/slack-desc/cervisia2
-rw-r--r--kde/slack-desc/digikam14
-rw-r--r--kde/slack-desc/discover4
-rw-r--r--kde/slack-desc/dolphin8
-rw-r--r--kde/slack-desc/dolphin-plugins2
-rw-r--r--kde/slack-desc/dragon4
-rw-r--r--kde/slack-desc/drkonqi2
-rw-r--r--kde/slack-desc/elisa6
-rw-r--r--kde/slack-desc/eventviews2
-rw-r--r--kde/slack-desc/extra-cmake-modules6
-rw-r--r--kde/slack-desc/falkon4
-rw-r--r--kde/slack-desc/ffmpegthumbs8
-rw-r--r--kde/slack-desc/filelight2
-rw-r--r--kde/slack-desc/frameworkintegration4
-rw-r--r--kde/slack-desc/granatier6
-rw-r--r--kde/slack-desc/grantlee-editor2
-rw-r--r--kde/slack-desc/grantleetheme4
-rw-r--r--kde/slack-desc/gwenview4
-rw-r--r--kde/slack-desc/incidenceeditor2
-rw-r--r--kde/slack-desc/juk8
-rw-r--r--kde/slack-desc/k3b2
-rw-r--r--kde/slack-desc/kaccounts-integration8
-rw-r--r--kde/slack-desc/kaccounts-providers8
-rw-r--r--kde/slack-desc/kactivities6
-rw-r--r--kde/slack-desc/kactivities-framework6
-rw-r--r--kde/slack-desc/kactivities-stats8
-rw-r--r--kde/slack-desc/kactivitymanagerd10
-rw-r--r--kde/slack-desc/kaddressbook2
-rw-r--r--kde/slack-desc/kajongg12
-rw-r--r--kde/slack-desc/kalarm2
-rw-r--r--kde/slack-desc/kalarmcal2
-rw-r--r--kde/slack-desc/kalgebra6
-rw-r--r--kde/slack-desc/kalzium2
-rw-r--r--kde/slack-desc/kamera4
-rw-r--r--kde/slack-desc/kamoso4
-rw-r--r--kde/slack-desc/kanagram12
-rw-r--r--kde/slack-desc/kapidox6
-rw-r--r--kde/slack-desc/kapman14
-rw-r--r--kde/slack-desc/kapptemplate6
-rw-r--r--kde/slack-desc/karchive10
-rw-r--r--kde/slack-desc/kate14
-rw-r--r--kde/slack-desc/katomic8
-rw-r--r--kde/slack-desc/kaudiocreator6
-rw-r--r--kde/slack-desc/kauth8
-rw-r--r--kde/slack-desc/kbackup8
-rw-r--r--kde/slack-desc/kblackbox6
-rw-r--r--kde/slack-desc/kblocks2
-rw-r--r--kde/slack-desc/kblog10
-rw-r--r--kde/slack-desc/kbookmarks14
-rw-r--r--kde/slack-desc/kbounce6
-rw-r--r--kde/slack-desc/kbreakout2
-rw-r--r--kde/slack-desc/kbruch2
-rw-r--r--kde/slack-desc/kcachegrind6
-rw-r--r--kde/slack-desc/kcalc2
-rw-r--r--kde/slack-desc/kcalcore8
-rw-r--r--kde/slack-desc/kcalendarcore8
-rw-r--r--kde/slack-desc/kcalutils4
-rw-r--r--kde/slack-desc/kcharselect6
-rw-r--r--kde/slack-desc/kcmutils6
-rw-r--r--kde/slack-desc/kcodecs12
-rw-r--r--kde/slack-desc/kcolorchooser2
-rw-r--r--kde/slack-desc/kcompletion16
-rw-r--r--kde/slack-desc/kconfig14
-rw-r--r--kde/slack-desc/kconfigwidgets8
-rw-r--r--kde/slack-desc/kcontacts4
-rw-r--r--kde/slack-desc/kcoreaddons12
-rw-r--r--kde/slack-desc/kcrash6
-rw-r--r--kde/slack-desc/kcron2
-rw-r--r--kde/slack-desc/kdav10
-rw-r--r--kde/slack-desc/kdbusaddons6
-rw-r--r--kde/slack-desc/kde-cli-tools8
-rw-r--r--kde/slack-desc/kde-dev-scripts2
-rw-r--r--kde/slack-desc/kde-dev-utils2
-rw-r--r--kde/slack-desc/kde-gtk-config6
-rw-r--r--kde/slack-desc/kde-wallpapers2
-rw-r--r--kde/slack-desc/kdeaccessibility1
-rw-r--r--kde/slack-desc/kdeadmin2
-rw-r--r--kde/slack-desc/kdebugsettings2
-rw-r--r--kde/slack-desc/kdeclarative12
-rw-r--r--kde/slack-desc/kdeconnect-kde4
-rw-r--r--kde/slack-desc/kdecoration8
-rw-r--r--kde/slack-desc/kded10
-rw-r--r--kde/slack-desc/kdeedu-data2
-rw-r--r--kde/slack-desc/kdegraphics-mobipocket2
-rw-r--r--kde/slack-desc/kdegraphics-thumbnailers8
-rw-r--r--kde/slack-desc/kdelibs4support10
-rw-r--r--kde/slack-desc/kdenetwork-filesharing6
-rw-r--r--kde/slack-desc/kdenlive2
-rw-r--r--kde/slack-desc/kdepim2
-rw-r--r--kde/slack-desc/kdepim-addons2
-rw-r--r--kde/slack-desc/kdepim-apps-libs6
-rw-r--r--kde/slack-desc/kdepim-runtime2
-rw-r--r--kde/slack-desc/kdesdk6
-rw-r--r--kde/slack-desc/kdesdk-kioslaves2
-rw-r--r--kde/slack-desc/kdesdk-thumbnailers6
-rw-r--r--kde/slack-desc/kdesignerplugin8
-rw-r--r--kde/slack-desc/kdesu8
-rw-r--r--kde/slack-desc/kdeutils2
-rw-r--r--kde/slack-desc/kdewebdev6
-rw-r--r--kde/slack-desc/kdewebkit14
-rw-r--r--kde/slack-desc/kdf2
-rw-r--r--kde/slack-desc/kdiagram2
-rw-r--r--kde/slack-desc/kdialog4
-rw-r--r--kde/slack-desc/kdiamond6
-rw-r--r--kde/slack-desc/kdnssd2
-rw-r--r--kde/slack-desc/kdoctools6
-rw-r--r--kde/slack-desc/keditbookmarks2
-rw-r--r--kde/slack-desc/kemoticons8
-rw-r--r--kde/slack-desc/kfilemetadata58
-rw-r--r--kde/slack-desc/kfind10
-rw-r--r--kde/slack-desc/kfloppy2
-rw-r--r--kde/slack-desc/kfourinline8
-rw-r--r--kde/slack-desc/kgamma52
-rw-r--r--kde/slack-desc/kgeography14
-rw-r--r--kde/slack-desc/kget2
-rw-r--r--kde/slack-desc/kglobalaccel8
-rw-r--r--kde/slack-desc/kgoldrunner8
-rw-r--r--kde/slack-desc/kgpg2
-rw-r--r--kde/slack-desc/kguiaddons6
-rw-r--r--kde/slack-desc/khangman6
-rw-r--r--kde/slack-desc/khelpcenter10
-rw-r--r--kde/slack-desc/kholidays8
-rw-r--r--kde/slack-desc/khotkeys12
-rw-r--r--kde/slack-desc/khtml6
-rw-r--r--kde/slack-desc/ki18n14
-rw-r--r--kde/slack-desc/kiconthemes6
-rw-r--r--kde/slack-desc/kid310
-rw-r--r--kde/slack-desc/kidentitymanagement4
-rw-r--r--kde/slack-desc/kidletime10
-rw-r--r--kde/slack-desc/kig2
-rw-r--r--kde/slack-desc/kigo14
-rw-r--r--kde/slack-desc/kile6
-rw-r--r--kde/slack-desc/killbots2
-rw-r--r--kde/slack-desc/kimageformats10
-rw-r--r--kde/slack-desc/kimagemapeditor4
-rw-r--r--kde/slack-desc/kimap2
-rw-r--r--kde/slack-desc/kinfocenter8
-rw-r--r--kde/slack-desc/kinit12
-rw-r--r--kde/slack-desc/kio16
-rw-r--r--kde/slack-desc/kio-extras4
-rw-r--r--kde/slack-desc/kipi-plugins6
-rw-r--r--kde/slack-desc/kirigami-gallery6
-rw-r--r--kde/slack-desc/kirigami28
-rw-r--r--kde/slack-desc/kiriki4
-rw-r--r--kde/slack-desc/kitemmodels6
-rw-r--r--kde/slack-desc/kitemviews8
-rw-r--r--kde/slack-desc/kiten12
-rw-r--r--kde/slack-desc/kitinerary4
-rw-r--r--kde/slack-desc/kjobwidgets6
-rw-r--r--kde/slack-desc/kjots8
-rw-r--r--kde/slack-desc/kjs8
-rw-r--r--kde/slack-desc/kjsembed6
-rw-r--r--kde/slack-desc/kjumpingcube10
-rw-r--r--kde/slack-desc/kldap2
-rw-r--r--kde/slack-desc/kleopatra2
-rw-r--r--kde/slack-desc/klettres8
-rw-r--r--kde/slack-desc/klickety8
-rw-r--r--kde/slack-desc/klines6
-rw-r--r--kde/slack-desc/kmag8
-rw-r--r--kde/slack-desc/kmahjongg6
-rw-r--r--kde/slack-desc/kmail14
-rw-r--r--kde/slack-desc/kmail-account-wizard4
-rw-r--r--kde/slack-desc/kmailtransport4
-rw-r--r--kde/slack-desc/kmbox2
-rw-r--r--kde/slack-desc/kmediaplayer6
-rw-r--r--kde/slack-desc/kmenuedit6
-rw-r--r--kde/slack-desc/kmime2
-rw-r--r--kde/slack-desc/kmines4
-rw-r--r--kde/slack-desc/kmix8
-rw-r--r--kde/slack-desc/kmousetool2
-rw-r--r--kde/slack-desc/kmouth4
-rw-r--r--kde/slack-desc/kmplot10
-rw-r--r--kde/slack-desc/kmymoney4
-rw-r--r--kde/slack-desc/knavalbattle10
-rw-r--r--kde/slack-desc/knetwalk2
-rw-r--r--kde/slack-desc/knewstuff8
-rw-r--r--kde/slack-desc/knights8
-rw-r--r--kde/slack-desc/knotes2
-rw-r--r--kde/slack-desc/knotifications6
-rw-r--r--kde/slack-desc/knotifyconfig6
-rw-r--r--kde/slack-desc/kolf4
-rw-r--r--kde/slack-desc/kollision2
-rw-r--r--kde/slack-desc/kolourpaint2
-rw-r--r--kde/slack-desc/kompare2
-rw-r--r--kde/slack-desc/konqueror10
-rw-r--r--kde/slack-desc/konquest8
-rw-r--r--kde/slack-desc/konsole6
-rw-r--r--kde/slack-desc/kontact2
-rw-r--r--kde/slack-desc/kontactinterface6
-rw-r--r--kde/slack-desc/kopete2
-rw-r--r--kde/slack-desc/korganizer2
-rw-r--r--kde/slack-desc/kpackage6
-rw-r--r--kde/slack-desc/kparts8
-rw-r--r--kde/slack-desc/kpat4
-rw-r--r--kde/slack-desc/kpeople8
-rw-r--r--kde/slack-desc/kpeoplevcard2
-rw-r--r--kde/slack-desc/kpimtextedit8
-rw-r--r--kde/slack-desc/kpkpass2
-rw-r--r--kde/slack-desc/kplotting18
-rw-r--r--kde/slack-desc/kpmcore12
-rw-r--r--kde/slack-desc/kpty8
-rw-r--r--kde/slack-desc/kqtquickcharts6
-rw-r--r--kde/slack-desc/kquickcharts12
-rw-r--r--kde/slack-desc/krdc2
-rw-r--r--kde/slack-desc/krename14
-rw-r--r--kde/slack-desc/kreversi10
-rw-r--r--kde/slack-desc/krfb2
-rw-r--r--kde/slack-desc/krita8
-rw-r--r--kde/slack-desc/kross10
-rw-r--r--kde/slack-desc/kross-interpreters2
-rw-r--r--kde/slack-desc/kruler2
-rw-r--r--kde/slack-desc/krunner10
-rw-r--r--kde/slack-desc/krusader12
-rw-r--r--kde/slack-desc/kscreen210
-rw-r--r--kde/slack-desc/kscreenlocker2
-rw-r--r--kde/slack-desc/kservice8
-rw-r--r--kde/slack-desc/kshisen4
-rw-r--r--kde/slack-desc/ksirk8
-rw-r--r--kde/slack-desc/ksmtp6
-rw-r--r--kde/slack-desc/ksnakeduel12
-rw-r--r--kde/slack-desc/kspaceduel6
-rw-r--r--kde/slack-desc/ksquares8
-rw-r--r--kde/slack-desc/ksshaskpass2
-rw-r--r--kde/slack-desc/kstars16
-rw-r--r--kde/slack-desc/ksudoku10
-rw-r--r--kde/slack-desc/ksysguard10
-rw-r--r--kde/slack-desc/ksystemlog14
-rw-r--r--kde/slack-desc/kteatime8
-rw-r--r--kde/slack-desc/ktexteditor14
-rw-r--r--kde/slack-desc/ktextwidgets6
-rw-r--r--kde/slack-desc/ktimer2
-rw-r--r--kde/slack-desc/ktimetracker6
-rw-r--r--kde/slack-desc/ktnef10
-rw-r--r--kde/slack-desc/ktorrent10
-rw-r--r--kde/slack-desc/ktouch8
-rw-r--r--kde/slack-desc/ktp-accounts-kcm4
-rw-r--r--kde/slack-desc/ktp-approver4
-rw-r--r--kde/slack-desc/ktp-auth-handler4
-rw-r--r--kde/slack-desc/ktp-call-ui4
-rw-r--r--kde/slack-desc/ktp-common-internals4
-rw-r--r--kde/slack-desc/ktp-contact-list4
-rw-r--r--kde/slack-desc/ktp-contact-runner4
-rw-r--r--kde/slack-desc/ktp-desktop-applets8
-rw-r--r--kde/slack-desc/ktp-filetransfer-handler8
-rw-r--r--kde/slack-desc/ktp-kded-module8
-rw-r--r--kde/slack-desc/ktp-send-file4
-rw-r--r--kde/slack-desc/ktp-text-ui4
-rw-r--r--kde/slack-desc/ktuberling8
-rw-r--r--kde/slack-desc/kturtle18
-rw-r--r--kde/slack-desc/kubrick12
-rw-r--r--kde/slack-desc/kunitconversion10
-rw-r--r--kde/slack-desc/kuser2
-rw-r--r--kde/slack-desc/kwallet4
-rw-r--r--kde/slack-desc/kwallet-pam2
-rw-r--r--kde/slack-desc/kwalletmanager4
-rw-r--r--kde/slack-desc/kwave12
-rw-r--r--kde/slack-desc/kwayland2
-rw-r--r--kde/slack-desc/kwayland-integration6
-rw-r--r--kde/slack-desc/kwayland-server2
-rw-r--r--kde/slack-desc/kwebkitpart4
-rw-r--r--kde/slack-desc/kwidgetsaddons14
-rw-r--r--kde/slack-desc/kwin10
-rw-r--r--kde/slack-desc/kwindowsystem12
-rw-r--r--kde/slack-desc/kwordquiz8
-rw-r--r--kde/slack-desc/kwrited6
-rw-r--r--kde/slack-desc/kxmlgui10
-rw-r--r--kde/slack-desc/kxmlrpcclient2
-rw-r--r--kde/slack-desc/labplot12
-rw-r--r--kde/slack-desc/latte-dock12
-rw-r--r--kde/slack-desc/libgravatar4
-rw-r--r--kde/slack-desc/libkcddb2
-rw-r--r--kde/slack-desc/libkcompactdisc6
-rw-r--r--kde/slack-desc/libkdcraw6
-rw-r--r--kde/slack-desc/libkdegames4
-rw-r--r--kde/slack-desc/libkdepim4
-rw-r--r--kde/slack-desc/libkeduvocdocument10
-rw-r--r--kde/slack-desc/libkexiv26
-rw-r--r--kde/slack-desc/libkgapi8
-rw-r--r--kde/slack-desc/libkgeomap10
-rw-r--r--kde/slack-desc/libkipi8
-rw-r--r--kde/slack-desc/libkleo6
-rw-r--r--kde/slack-desc/libkmahjongg8
-rw-r--r--kde/slack-desc/libkomparediff210
-rw-r--r--kde/slack-desc/libksane4
-rw-r--r--kde/slack-desc/libkscreen212
-rw-r--r--kde/slack-desc/libksieve4
-rw-r--r--kde/slack-desc/libksysguard6
-rw-r--r--kde/slack-desc/libktorrent10
-rw-r--r--kde/slack-desc/lokalize2
-rw-r--r--kde/slack-desc/lskat4
-rw-r--r--kde/slack-desc/mailcommon4
-rw-r--r--kde/slack-desc/mailimporter2
-rw-r--r--kde/slack-desc/marble15
-rw-r--r--kde/slack-desc/mbox-importer2
-rw-r--r--kde/slack-desc/messagelib2
-rw-r--r--kde/slack-desc/milou6
-rw-r--r--kde/slack-desc/minuet8
-rw-r--r--kde/slack-desc/modemmanager-qt6
-rw-r--r--kde/slack-desc/networkmanager-qt4
-rw-r--r--kde/slack-desc/okteta2
-rw-r--r--kde/slack-desc/okular10
-rw-r--r--kde/slack-desc/oxygen4
-rw-r--r--kde/slack-desc/oxygen-fonts6
-rw-r--r--kde/slack-desc/oxygen-gtk214
-rw-r--r--kde/slack-desc/oxygen-icons54
-rw-r--r--kde/slack-desc/palapeli12
-rw-r--r--kde/slack-desc/parley2
-rw-r--r--kde/slack-desc/partitionmanager10
-rw-r--r--kde/slack-desc/picmi8
-rw-r--r--kde/slack-desc/pim-data-exporter4
-rw-r--r--kde/slack-desc/pim-sieve-editor6
-rw-r--r--kde/slack-desc/pimcommon2
-rw-r--r--kde/slack-desc/plasma-browser-integration8
-rw-r--r--kde/slack-desc/plasma-desktop16
-rw-r--r--kde/slack-desc/plasma-framework8
-rw-r--r--kde/slack-desc/plasma-integration6
-rw-r--r--kde/slack-desc/plasma-pa4
-rw-r--r--kde/slack-desc/plasma-sdk2
-rw-r--r--kde/slack-desc/plasma-vault12
-rw-r--r--kde/slack-desc/plasma-wayland-protocols6
-rw-r--r--kde/slack-desc/plasma-workspace6
-rw-r--r--kde/slack-desc/plasma-workspace-wallpapers6
-rw-r--r--kde/slack-desc/plasma5-nm6
-rw-r--r--kde/slack-desc/polkit-kde-framework6
-rw-r--r--kde/slack-desc/polkit-kde-kcmodules-framework3
-rw-r--r--kde/slack-desc/powerdevil8
-rw-r--r--kde/slack-desc/poxml10
-rw-r--r--kde/slack-desc/print-manager10
-rw-r--r--kde/slack-desc/prison8
-rw-r--r--kde/slack-desc/pulseaudio-qt8
-rw-r--r--kde/slack-desc/purpose18
-rw-r--r--kde/slack-desc/qqc2-desktop-style14
-rw-r--r--kde/slack-desc/rocs12
-rw-r--r--kde/slack-desc/sddm-kcm8
-rw-r--r--kde/slack-desc/sddm-qt512
-rw-r--r--kde/slack-desc/signon-kwallet-extension6
-rw-r--r--kde/slack-desc/skanlite4
-rw-r--r--kde/slack-desc/solid12
-rw-r--r--kde/slack-desc/sonnet10
-rw-r--r--kde/slack-desc/spectacle4
-rw-r--r--kde/slack-desc/step12
-rw-r--r--kde/slack-desc/svgpart2
-rw-r--r--kde/slack-desc/sweeper2
-rw-r--r--kde/slack-desc/syndication8
-rw-r--r--kde/slack-desc/syntax-highlighting2
-rw-r--r--kde/slack-desc/systemsettings2
-rw-r--r--kde/slack-desc/threadweaver12
-rw-r--r--kde/slack-desc/umbrello2
-rw-r--r--kde/slack-desc/user-manager6
-rw-r--r--kde/slack-desc/wacomtablet8
-rw-r--r--kde/slack-desc/xdg-desktop-portal-kde2
-rw-r--r--kde/slack-desc/yakuake12
-rw-r--r--kde/slack-desc/zeroconf-ioslave2
-rwxr-xr-xkde/src/applications-extra/fetch-krita.sh52
-rwxr-xr-xkde/src/plasma-extra/fetch-wacomtablet.sh52
628 files changed, 2855 insertions, 27720 deletions
diff --git a/PKGLIST b/PKGLIST
index cd64522..b507fd8 100644
--- a/PKGLIST
+++ b/PKGLIST
@@ -1,36 +1,33 @@
current/5/x86/deps/LibRaw-0.19.5-i586-1alien.txz
-current/5/x86/deps/accountsservice-0.6.55-i486-1alien.txz
+current/5/x86/deps/accountsservice-0.6.55-i486-2alien.txz
+current/5/x86/deps/autoconf-archive-2019.01.06-noarch-1alien.txz
current/5/x86/deps/cfitsio-3.420-i586-1alien.txz
current/5/x86/deps/cryfs-0.10.2-i586-3alien.txz
current/5/x86/deps/cryptopp-8.2.0-i586-1alien.txz
+current/5/x86/deps/dbus-1.12.20-i586-1alien.txz
current/5/x86/deps/ddcutil-0.8.5-i586-2alien.txz
current/5/x86/deps/dotconf-1.3-i586-1alien.txz
current/5/x86/deps/drumstick-1.1.2-i586-1alien.txz
current/5/x86/deps/dvdauthor-0.7.2-i586-6alien.txz
-current/5/x86/deps/espeak-ng-1.49.2-i586-1alien.txz
+current/5/x86/deps/elogind-243.7-i486-1alien.txz
current/5/x86/deps/exiv2-0.27.2-i586-1alien.txz
-current/5/x86/deps/flite-2.1-i586-1alien.txz
current/5/x86/deps/freecell-solver-5.0.0-i586-1alien.txz
current/5/x86/deps/frei0r-plugins-1.6.1-i586-2alien.txz
current/5/x86/deps/grantlee-5.2.0-i586-1alien.txz
-current/5/x86/deps/grantlee-qt4-0.5.1-i486-1alien.txz
-current/5/x86/deps/hack-font-ttf-2.020-noarch-1alien.txz
+current/5/x86/deps/grantlee-qt4-0.5.1-i586-2alien.txz
current/5/x86/deps/kdsoap-1.9.0-i586-1alien.txz
current/5/x86/deps/lensfun-0.3.95-i586-2alien.txz
current/5/x86/deps/libappindicator-12.10.0-i486-2alien.txz
current/5/x86/deps/libburn-1.4.8-i586-1alien.txz
current/5/x86/deps/libdbusmenu-gtk-16.04.0-i586-1alien.txz
-current/5/x86/deps/libdbusmenu-qt5-0.9.3+16.04.20160218-i586-1alien.txz
+current/5/x86/deps/libdbusmenu-qt5-0.9.3+16.04.20160218-i586-2alien.txz
current/5/x86/deps/libdmtx-0.7.4-i486-2alien.txz
current/5/x86/deps/libindicator-12.10.1-i486-2alien.txz
current/5/x86/deps/libqalculate-3.10.0-i586-1alien.txz
current/5/x86/deps/libsass-3.5.5-i586-1alien.txz
current/5/x86/deps/md4c-0.4.2-i586-1alien.txz
-current/5/x86/deps/mlt-6.20.0-i586-1alien.txz
-current/5/x86/deps/noto-cjk-font-ttf-2.001-noarch-1alien.txz
-current/5/x86/deps/noto-font-ttf-2015_09_29-noarch-2alien.txz
+current/5/x86/deps/mlt-6.20.0-i586-2alien.txz
current/5/x86/deps/opencv-4.1.1-i586-1alien.txz
-current/5/x86/deps/pcaudiolib-1.1-i586-1alien.txz
current/5/x86/deps/perl-path-tiny-0.108-i586-1alien.txz
current/5/x86/deps/perl-template-toolkit-2.28-i586-1alien.txz
current/5/x86/deps/phonon-4.11.1-i586-1alien.txz
@@ -38,22 +35,24 @@ current/5/x86/deps/phonon-gstreamer-4.10.0-i586-1alien.txz
current/5/x86/deps/phonon-qt4-4.10.2-i586-1alien.txz
current/5/x86/deps/phonon-qt4-gstreamer-4.9.0-i586-1alien.txz
current/5/x86/deps/phonon-vlc-0.11.1-i586-1alien.txz
-current/5/x86/deps/polkit-qt5-1-0.113.0-i586-1alien.txz
+current/5/x86/deps/pipewire-0.3.8-i586-1alien.txz
+current/5/x86/deps/polkit-0.116-i586-4alien.txz
+current/5/x86/deps/polkit-qt5-1-0.113.0-i586-2alien.txz
current/5/x86/deps/poppler-0.68.0-i586-1alien.txz
current/5/x86/deps/python3-random2-1.0.1-i586-3alien.txz
-current/5/x86/deps/qca-qt5-2.3.0-i586-1alien.txz
+current/5/x86/deps/qca-qt5-2.3.1-i586-1alien.txz
current/5/x86/deps/qrencode-4.0.2-i586-1alien.txz
current/5/x86/deps/qtav-1.13.0-i586-1alien.txz
current/5/x86/deps/quazip-0.8.1-i586-1alien.txz
current/5/x86/deps/rttr-0.9.6-i586-2alien.txz
current/5/x86/deps/sassc-3.5.0-i586-1alien.txz
current/5/x86/deps/sni-qt-0.2.6-i486-4alien.txz
-current/5/x86/deps/speech-dispatcher-0.8.8-i586-4alien.txz
+current/5/x86/deps/speech-dispatcher-0.8.8-i586-5alien.txz
current/5/x86/deps/vid.stab-97c6ae2_20150529git-i486-1alien.txz
current/5/x86/kde/applications-extra/alkimia-8.0.3-i586-2alien.txz
current/5/x86/kde/applications-extra/calligra-3.2.1-i586-1alien.txz
current/5/x86/kde/applications-extra/calligraplan-3.2.2-i586-1alien.txz
-current/5/x86/kde/applications-extra/digikam-6.4.0-i586-2alien.txz
+current/5/x86/kde/applications-extra/digikam-7.0.0-i586-1alien.txz
current/5/x86/kde/applications-extra/falkon-3.1.0-i586-1alien.txz
current/5/x86/kde/applications-extra/kaudiocreator-e64e16a_20171004git-i486-1alien.txz
current/5/x86/kde/applications-extra/kdev-php-5.5.1-i586-1alien.txz
@@ -63,386 +62,385 @@ current/5/x86/kde/applications-extra/kdevelop-pg-qt-2.2.1-i586-1alien.txz
current/5/x86/kde/applications-extra/kdiagram-2.7.0-i586-1alien.txz
current/5/x86/kde/applications-extra/kid3-3.8.3-i586-1alien.txz
current/5/x86/kde/applications-extra/kile-2.9.93-i586-3alien.txz
-current/5/x86/kde/applications-extra/kjots-5.0.2-i586-3alien.txz
-current/5/x86/kde/applications-extra/kmymoney-5.0.8-i586-1alien.txz
+current/5/x86/kde/applications-extra/kjots-5.0.2-i586-4alien.txz
+current/5/x86/kde/applications-extra/kmymoney-5.1.0-i586-1alien.txz
current/5/x86/kde/applications-extra/kpmcore-4.1.0-i586-1alien.txz
current/5/x86/kde/applications-extra/krename-5.0.0-i586-2alien.txz
-current/5/x86/kde/applications-extra/krita-4.2.9-i586-2alien.txz
+current/5/x86/kde/applications-extra/krita-4.3.0-i586-1alien.txz
current/5/x86/kde/applications-extra/krusader-2.7.2-i586-1alien.txz
current/5/x86/kde/applications-extra/kstars-3.4.2-i586-1alien.txz
current/5/x86/kde/applications-extra/ktimetracker-5.0.1-i586-1alien.txz
-current/5/x86/kde/applications-extra/ktorrent-5.1.2-i586-1alien.txz
+current/5/x86/kde/applications-extra/ktorrent-5.2.0-i586-1alien.txz
current/5/x86/kde/applications-extra/kwebkitpart-cca571d_20171117git-i486-1alien.txz
current/5/x86/kde/applications-extra/labplot-2.7.0-i586-1alien.txz
-current/5/x86/kde/applications-extra/libktorrent-2.1.1-i586-1alien.txz
+current/5/x86/kde/applications-extra/libktorrent-2.2.0-i586-1alien.txz
current/5/x86/kde/applications-extra/okteta-0.26.3-i586-1alien.txz
current/5/x86/kde/applications-extra/oxygen-gtk2-1.4.6.1-i486-1alien.txz
current/5/x86/kde/applications-extra/partitionmanager-4.1.0-i586-1alien.txz
-current/5/x86/kde/applications-extra/skanlite-2.1.0.1-i586-1alien.txz
-current/5/x86/kde/applications/analitza-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ark-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/artikulate-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/audiocd-kio-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/baloo5-widgets-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/blinken-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/bomber-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/bovo-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/cantor-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/cervisia-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/dolphin-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/dolphin-plugins-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/dragon-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/elisa-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ffmpegthumbs-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/filelight-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/granatier-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/gwenview-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/juk-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/k3b-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kalgebra-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kalzium-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kamera-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kamoso-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kanagram-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kapman-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kapptemplate-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kate-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/katomic-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kbackup-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kblackbox-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kblocks-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kbounce-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kbreakout-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kbruch-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kcachegrind-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kcalc-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kcharselect-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kcolorchooser-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kcron-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kde-dev-scripts-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kde-dev-utils-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdebugsettings-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdeconnect-kde-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdeedu-data-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdegraphics-mobipocket-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdegraphics-thumbnailers-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdenetwork-filesharing-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdenlive-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdesdk-kioslaves-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdesdk-thumbnailers-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdf-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdialog-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kdiamond-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/keditbookmarks-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kfind-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kfloppy-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kfourinline-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kgeography-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kget-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kgoldrunner-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kgpg-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/khangman-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/khelpcenter-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kig-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kigo-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/killbots-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kimagemapeditor-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kio-extras-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kipi-plugins-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kirigami-gallery-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kiriki-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kiten-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kjumpingcube-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/klettres-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/klickety-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/klines-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kmag-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kmahjongg-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kmines-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kmix-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kmousetool-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kmouth-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kmplot-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/knavalbattle-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/knetwalk-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/knights-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kolf-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kollision-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kolourpaint-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kompare-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/konqueror-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/konquest-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/konsole-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kopete-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kpat-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kqtquickcharts-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/krdc-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kreversi-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/krfb-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kross-interpreters-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kruler-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kshisen-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ksirk-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ksnakeduel-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kspaceduel-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ksquares-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ksudoku-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ksystemlog-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kteatime-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ktimer-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ktouch-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/ktuberling-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kturtle-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kubrick-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kwalletmanager-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kwave-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/kwordquiz-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkcddb-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkcompactdisc-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkdcraw-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkdegames-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkeduvocdocument-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkexiv2-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkgeomap-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkipi-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkmahjongg-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libkomparediff2-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/libksane-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/lokalize-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/lskat-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/marble-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/minuet-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/okular-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/palapeli-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/parley-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/picmi-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/poxml-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/print-manager-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/rocs-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/spectacle-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/step-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/svgpart-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/sweeper-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/umbrello-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/yakuake-20.04.1-i586-1alien.txz
-current/5/x86/kde/applications/zeroconf-ioslave-20.04.1-i586-1alien.txz
-current/5/x86/kde/frameworks/attica-framework-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/baloo5-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/bluez-qt-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/breeze-icons-5.70.0-noarch-1alien.txz
-current/5/x86/kde/frameworks/extra-cmake-modules-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/frameworkintegration-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kactivities-framework-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kactivities-stats-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kapidox-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/karchive-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kauth-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kbookmarks-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kcalendarcore-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kcmutils-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kcodecs-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kcompletion-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kconfig-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kconfigwidgets-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kcontacts-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kcoreaddons-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kcrash-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdbusaddons-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdeclarative-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kded-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdelibs4support-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdesignerplugin-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdesu-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdewebkit-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdnssd-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kdoctools-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kemoticons-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kfilemetadata5-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kglobalaccel-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kguiaddons-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kholidays-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/khtml-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/ki18n-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kiconthemes-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kidletime-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kimageformats-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kinit-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kio-5.70.1-i586-1alien.txz
-current/5/x86/kde/frameworks/kirigami2-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kitemmodels-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kitemviews-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kjobwidgets-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kjs-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kjsembed-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kmediaplayer-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/knewstuff-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/knotifications-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/knotifyconfig-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kpackage-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kparts-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kpeople-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kplotting-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kpty-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kquickcharts-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kross-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/krunner-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kservice-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/ktexteditor-5.70.1-i586-1alien.txz
-current/5/x86/kde/frameworks/ktextwidgets-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kunitconversion-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kwallet-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kwayland-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kwidgetsaddons-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kwindowsystem-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kxmlgui-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/kxmlrpcclient-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/modemmanager-qt-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/networkmanager-qt-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/oxygen-icons5-5.70.0-noarch-1alien.txz
-current/5/x86/kde/frameworks/plasma-framework-5.70.1-i586-1alien.txz
-current/5/x86/kde/frameworks/prison-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/purpose-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/qqc2-desktop-style-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/solid-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/sonnet-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/syndication-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/syntax-highlighting-5.70.0-i586-1alien.txz
-current/5/x86/kde/frameworks/threadweaver-5.70.0-i586-1alien.txz
+current/5/x86/kde/applications-extra/skanlite-2.2.0-i586-1alien.txz
+current/5/x86/kde/applications/analitza-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ark-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/artikulate-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/audiocd-kio-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/baloo5-widgets-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/blinken-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/bomber-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/bovo-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/cantor-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/cervisia-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/dolphin-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/dolphin-plugins-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/dragon-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/elisa-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ffmpegthumbs-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/filelight-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/granatier-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/gwenview-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/juk-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/k3b-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kalgebra-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kalzium-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kamera-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kamoso-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kanagram-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kapman-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kapptemplate-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kate-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/katomic-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kbackup-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kblackbox-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kblocks-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kbounce-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kbreakout-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kbruch-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kcachegrind-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kcalc-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kcharselect-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kcolorchooser-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kcron-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kde-dev-scripts-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kde-dev-utils-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdebugsettings-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdeconnect-kde-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdeedu-data-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdegraphics-mobipocket-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdegraphics-thumbnailers-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdenetwork-filesharing-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdenlive-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdesdk-kioslaves-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdesdk-thumbnailers-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdf-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdialog-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kdiamond-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/keditbookmarks-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kfind-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kfloppy-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kfourinline-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kgeography-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kget-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kgoldrunner-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kgpg-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/khangman-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/khelpcenter-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kig-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kigo-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/killbots-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kimagemapeditor-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kio-extras-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kipi-plugins-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kirigami-gallery-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kiriki-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kiten-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kjumpingcube-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/klettres-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/klickety-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/klines-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kmag-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kmahjongg-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kmines-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kmix-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kmousetool-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kmouth-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kmplot-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/knavalbattle-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/knetwalk-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/knights-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kolf-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kollision-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kolourpaint-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kompare-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/konqueror-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/konquest-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/konsole-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kopete-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kpat-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kqtquickcharts-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/krdc-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kreversi-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/krfb-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kross-interpreters-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kruler-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kshisen-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ksirk-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ksnakeduel-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kspaceduel-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ksquares-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ksudoku-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ksystemlog-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kteatime-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ktimer-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ktouch-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/ktuberling-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kturtle-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kubrick-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kwalletmanager-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kwave-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/kwordquiz-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkcddb-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkcompactdisc-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkdcraw-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkdegames-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkeduvocdocument-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkexiv2-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkgeomap-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkipi-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkmahjongg-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libkomparediff2-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/libksane-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/lokalize-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/lskat-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/marble-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/minuet-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/okular-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/palapeli-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/parley-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/picmi-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/poxml-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/print-manager-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/rocs-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/spectacle-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/step-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/svgpart-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/sweeper-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/umbrello-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/yakuake-20.04.3-i586-1alien.txz
+current/5/x86/kde/applications/zeroconf-ioslave-20.04.3-i586-1alien.txz
+current/5/x86/kde/frameworks/attica-framework-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/baloo5-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/bluez-qt-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/breeze-icons-5.72.0-noarch-1alien.txz
+current/5/x86/kde/frameworks/extra-cmake-modules-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/frameworkintegration-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kactivities-framework-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kactivities-stats-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kapidox-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/karchive-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kauth-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kbookmarks-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kcalendarcore-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kcmutils-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kcodecs-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kcompletion-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kconfig-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kconfigwidgets-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kcontacts-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kcoreaddons-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kcrash-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdbusaddons-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdeclarative-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kded-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdelibs4support-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdesignerplugin-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdesu-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdewebkit-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdnssd-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kdoctools-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kemoticons-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kfilemetadata5-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kglobalaccel-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kguiaddons-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kholidays-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/khtml-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/ki18n-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kiconthemes-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kidletime-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kimageformats-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kinit-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kio-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kirigami2-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kitemmodels-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kitemviews-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kjobwidgets-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kjs-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kjsembed-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kmediaplayer-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/knewstuff-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/knotifications-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/knotifyconfig-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kpackage-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kparts-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kpeople-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kplotting-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kpty-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kquickcharts-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kross-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/krunner-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kservice-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/ktexteditor-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/ktextwidgets-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kunitconversion-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kwallet-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kwayland-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kwidgetsaddons-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kwindowsystem-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kxmlgui-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/kxmlrpcclient-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/modemmanager-qt-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/networkmanager-qt-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/oxygen-icons5-5.72.0-noarch-1alien.txz
+current/5/x86/kde/frameworks/plasma-framework-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/prison-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/purpose-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/qqc2-desktop-style-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/solid-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/sonnet-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/syndication-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/syntax-highlighting-5.72.0-i586-1alien.txz
+current/5/x86/kde/frameworks/threadweaver-5.72.0-i586-1alien.txz
current/5/x86/kde/kde4/kdelibs-4.14.38-i586-3alien.txz
-current/5/x86/kde/kdepim/akonadi-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadi-calendar-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadi-calendar-tools-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadi-contacts-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadi-import-wizard-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadi-mime-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadi-notes-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadi-search-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akonadiconsole-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/akregator-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/calendarsupport-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/eventviews-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/grantlee-editor-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/grantleetheme-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/incidenceeditor-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kaddressbook-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kalarm-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kalarmcal-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kblog-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kcalutils-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kdav-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kdepim-addons-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kdepim-apps-libs-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kdepim-runtime-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kidentitymanagement-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kimap-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kitinerary-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kldap-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kleopatra-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kmail-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kmail-account-wizard-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kmailtransport-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kmbox-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kmime-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/knotes-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kontact-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kontactinterface-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/korganizer-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kpimtextedit-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/kpkpass-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/ksmtp-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/ktnef-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/libgravatar-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/libkdepim-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/libkgapi-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/libkleo-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/libksieve-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/mailcommon-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/mailimporter-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/mbox-importer-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/messagelib-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/pim-data-exporter-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/pim-sieve-editor-20.04.1-i586-1alien.txz
-current/5/x86/kde/kdepim/pimcommon-20.04.1-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-calendar-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-calendar-tools-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-contacts-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-import-wizard-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-mime-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-notes-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadi-search-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akonadiconsole-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/akregator-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/calendarsupport-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/eventviews-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/grantlee-editor-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/grantleetheme-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/incidenceeditor-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kaddressbook-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kalarm-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kalarmcal-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kblog-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kcalutils-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kdav-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kdepim-addons-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kdepim-apps-libs-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kdepim-runtime-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kidentitymanagement-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kimap-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kitinerary-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kldap-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kleopatra-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kmail-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kmail-account-wizard-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kmailtransport-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kmbox-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kmime-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/knotes-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kontact-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kontactinterface-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/korganizer-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kpimtextedit-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/kpkpass-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/ksmtp-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/ktnef-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/libgravatar-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/libkdepim-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/libkgapi-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/libkleo-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/libksieve-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/mailcommon-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/mailimporter-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/mbox-importer-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/messagelib-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/pim-data-exporter-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/pim-sieve-editor-20.04.3-i586-1alien.txz
+current/5/x86/kde/kdepim/pimcommon-20.04.3-i586-1alien.txz
current/5/x86/kde/plasma-extra/kpeoplevcard-0.1-i586-1alien.txz
current/5/x86/kde/plasma-extra/latte-dock-0.9.11-i586-1alien.txz
current/5/x86/kde/plasma-extra/oxygen-fonts-5.4.3-i486-1alien.txz
+current/5/x86/kde/plasma-extra/plasma-wayland-protocols-1.1.0-i586-1alien.txz
current/5/x86/kde/plasma-extra/pulseaudio-qt-1.2-i586-1alien.txz
-current/5/x86/kde/plasma-extra/sddm-qt5-0.18.1-i586-4alien.txz
-current/5/x86/kde/plasma-extra/wacomtablet-3.2.0-i586-1alien.txz
-current/5/x86/kde/plasma/bluedevil-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/breeze-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/breeze-grub-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/breeze-gtk-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/drkonqi-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kactivitymanagerd-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kde-cli-tools-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kde-gtk-config-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kdecoration-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kdeplasma-addons-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kgamma5-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/khotkeys-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kinfocenter-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kmenuedit-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kscreen2-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kscreenlocker-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/ksshaskpass-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/ksysguard-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kwallet-pam-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kwayland-integration-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kwin-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/kwrited-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/libkscreen2-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/libksysguard-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/milou-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/oxygen-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-browser-integration-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-desktop-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-integration-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-pa-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-sdk-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-vault-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-workspace-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma-workspace-wallpapers-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/plasma5-nm-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/polkit-kde-framework-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/powerdevil-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/sddm-kcm-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/systemsettings-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/user-manager-5.18.5-i586-1alien.txz
-current/5/x86/kde/plasma/xdg-desktop-portal-kde-5.18.5-i586-1alien.txz
+current/5/x86/kde/plasma-extra/sddm-qt5-0.18.1-i586-6alien.txz
+current/5/x86/kde/plasma-extra/wacomtablet-20200712_a573687-i586-1alien.txz
+current/5/x86/kde/plasma/bluedevil-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/breeze-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/breeze-grub-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/breeze-gtk-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/drkonqi-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kactivitymanagerd-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kde-cli-tools-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kde-gtk-config-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kdecoration-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kdeplasma-addons-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kgamma5-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/khotkeys-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kinfocenter-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kmenuedit-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kscreen2-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kscreenlocker-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/ksshaskpass-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/ksysguard-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kwallet-pam-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kwayland-integration-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kwayland-server-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kwin-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/kwrited-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/libkscreen2-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/libksysguard-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/milou-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/oxygen-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-browser-integration-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-desktop-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-integration-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-pa-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-sdk-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-vault-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-workspace-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma-workspace-wallpapers-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/plasma5-nm-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/polkit-kde-framework-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/powerdevil-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/sddm-kcm-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/systemsettings-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/user-manager-5.19.4-i586-1alien.txz
+current/5/x86/kde/plasma/xdg-desktop-portal-kde-5.19.4-i586-1alien.txz
current/5/x86_64/deps/LibRaw-0.19.5-x86_64-1alien.txz
-current/5/x86_64/deps/accountsservice-0.6.55-x86_64-1alien.txz
+current/5/x86_64/deps/accountsservice-0.6.55-x86_64-2alien.txz
+current/5/x86_64/deps/autoconf-archive-2019.01.06-noarch-1alien.txz
current/5/x86_64/deps/cfitsio-3.420-x86_64-1alien.txz
current/5/x86_64/deps/cryfs-0.10.2-x86_64-3alien.txz
current/5/x86_64/deps/cryptopp-8.2.0-x86_64-1alien.txz
+current/5/x86_64/deps/dbus-1.12.20-x86_64-1alien.txz
current/5/x86_64/deps/ddcutil-0.8.5-x86_64-2alien.txz
current/5/x86_64/deps/dotconf-1.3-x86_64-1alien.txz
current/5/x86_64/deps/drumstick-1.1.2-x86_64-1alien.txz
current/5/x86_64/deps/dvdauthor-0.7.2-x86_64-6alien.txz
-current/5/x86_64/deps/espeak-ng-1.49.2-x86_64-1alien.txz
+current/5/x86_64/deps/elogind-243.7-x86_64-1alien.txz
current/5/x86_64/deps/exiv2-0.27.2-x86_64-1alien.txz
-current/5/x86_64/deps/flite-2.1-x86_64-1alien.txz
current/5/x86_64/deps/freecell-solver-5.0.0-x86_64-1alien.txz
current/5/x86_64/deps/frei0r-plugins-1.6.1-x86_64-2alien.txz
current/5/x86_64/deps/grantlee-5.2.0-x86_64-1alien.txz
-current/5/x86_64/deps/grantlee-qt4-0.5.1-x86_64-1alien.txz
-current/5/x86_64/deps/hack-font-ttf-2.020-noarch-1alien.txz
+current/5/x86_64/deps/grantlee-qt4-0.5.1-x86_64-2alien.txz
current/5/x86_64/deps/kdsoap-1.9.0-x86_64-1alien.txz
current/5/x86_64/deps/lensfun-0.3.95-x86_64-2alien.txz
current/5/x86_64/deps/libappindicator-12.10.0-x86_64-2alien.txz
current/5/x86_64/deps/libburn-1.4.8-x86_64-1alien.txz
current/5/x86_64/deps/libdbusmenu-gtk-16.04.0-x86_64-1alien.txz
-current/5/x86_64/deps/libdbusmenu-qt5-0.9.3+16.04.20160218-x86_64-1alien.txz
+current/5/x86_64/deps/libdbusmenu-qt5-0.9.3+16.04.20160218-x86_64-2alien.txz
current/5/x86_64/deps/libdmtx-0.7.4-x86_64-2alien.txz
current/5/x86_64/deps/libindicator-12.10.1-x86_64-2alien.txz
current/5/x86_64/deps/libqalculate-3.10.0-x86_64-1alien.txz
current/5/x86_64/deps/libsass-3.5.5-x86_64-1alien.txz
current/5/x86_64/deps/md4c-0.4.2-x86_64-1alien.txz
-current/5/x86_64/deps/mlt-6.20.0-x86_64-1alien.txz
-current/5/x86_64/deps/noto-cjk-font-ttf-2.001-noarch-1alien.txz
-current/5/x86_64/deps/noto-font-ttf-2015_09_29-noarch-2alien.txz
+current/5/x86_64/deps/mlt-6.20.0-x86_64-2alien.txz
current/5/x86_64/deps/opencv-4.1.1-x86_64-1alien.txz
-current/5/x86_64/deps/pcaudiolib-1.1-x86_64-1alien.txz
current/5/x86_64/deps/perl-path-tiny-0.108-x86_64-1alien.txz
current/5/x86_64/deps/perl-template-toolkit-2.28-x86_64-1alien.txz
current/5/x86_64/deps/phonon-4.11.1-x86_64-1alien.txz
@@ -450,22 +448,24 @@ current/5/x86_64/deps/phonon-gstreamer-4.10.0-x86_64-1alien.txz
current/5/x86_64/deps/phonon-qt4-4.10.2-x86_64-1alien.txz
current/5/x86_64/deps/phonon-qt4-gstreamer-4.9.0-x86_64-1alien.txz
current/5/x86_64/deps/phonon-vlc-0.11.1-x86_64-1alien.txz
-current/5/x86_64/deps/polkit-qt5-1-0.113.0-x86_64-1alien.txz
+current/5/x86_64/deps/pipewire-0.3.8-x86_64-1alien.txz
+current/5/x86_64/deps/polkit-0.116-x86_64-4alien.txz
+current/5/x86_64/deps/polkit-qt5-1-0.113.0-x86_64-2alien.txz
current/5/x86_64/deps/poppler-0.68.0-x86_64-1alien.txz
current/5/x86_64/deps/python3-random2-1.0.1-x86_64-3alien.txz
-current/5/x86_64/deps/qca-qt5-2.3.0-x86_64-1alien.txz
+current/5/x86_64/deps/qca-qt5-2.3.1-x86_64-1alien.txz
current/5/x86_64/deps/qrencode-4.0.2-x86_64-1alien.txz
current/5/x86_64/deps/qtav-1.13.0-x86_64-1alien.txz
current/5/x86_64/deps/quazip-0.8.1-x86_64-1alien.txz
current/5/x86_64/deps/rttr-0.9.6-x86_64-2alien.txz
current/5/x86_64/deps/sassc-3.5.0-x86_64-1alien.txz
current/5/x86_64/deps/sni-qt-0.2.6-x86_64-4alien.txz
-current/5/x86_64/deps/speech-dispatcher-0.8.8-x86_64-4alien.txz
+current/5/x86_64/deps/speech-dispatcher-0.8.8-x86_64-5alien.txz
current/5/x86_64/deps/vid.stab-97c6ae2_20150529git-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/alkimia-8.0.3-x86_64-2alien.txz
current/5/x86_64/kde/applications-extra/calligra-3.2.1-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/calligraplan-3.2.2-x86_64-1alien.txz
-current/5/x86_64/kde/applications-extra/digikam-6.4.0-x86_64-2alien.txz
+current/5/x86_64/kde/applications-extra/digikam-7.0.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/falkon-3.1.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kaudiocreator-e64e16a_20171004git-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kdev-php-5.5.1-x86_64-1alien.txz
@@ -475,350 +475,352 @@ current/5/x86_64/kde/applications-extra/kdevelop-pg-qt-2.2.1-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kdiagram-2.7.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kid3-3.8.3-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kile-2.9.93-x86_64-3alien.txz
-current/5/x86_64/kde/applications-extra/kjots-5.0.2-x86_64-3alien.txz
-current/5/x86_64/kde/applications-extra/kmymoney-5.0.8-x86_64-1alien.txz
+current/5/x86_64/kde/applications-extra/kjots-5.0.2-x86_64-4alien.txz
+current/5/x86_64/kde/applications-extra/kmymoney-5.1.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kpmcore-4.1.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/krename-5.0.0-x86_64-2alien.txz
-current/5/x86_64/kde/applications-extra/krita-4.2.9-x86_64-2alien.txz
+current/5/x86_64/kde/applications-extra/krita-4.3.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/krusader-2.7.2-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kstars-3.4.2-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/ktimetracker-5.0.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications-extra/ktorrent-5.1.2-x86_64-1alien.txz
+current/5/x86_64/kde/applications-extra/ktorrent-5.2.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/kwebkitpart-cca571d_20171117git-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/labplot-2.7.0-x86_64-1alien.txz
-current/5/x86_64/kde/applications-extra/libktorrent-2.1.1-x86_64-1alien.txz
+current/5/x86_64/kde/applications-extra/libktorrent-2.2.0-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/okteta-0.26.3-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/oxygen-gtk2-1.4.6.1-x86_64-1alien.txz
current/5/x86_64/kde/applications-extra/partitionmanager-4.1.0-x86_64-1alien.txz
-current/5/x86_64/kde/applications-extra/skanlite-2.1.0.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/analitza-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ark-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/artikulate-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/audiocd-kio-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/baloo5-widgets-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/blinken-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/bomber-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/bovo-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/cantor-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/cervisia-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/dolphin-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/dolphin-plugins-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/dragon-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/elisa-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ffmpegthumbs-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/filelight-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/granatier-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/gwenview-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/juk-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/k3b-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kalgebra-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kalzium-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kamera-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kamoso-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kanagram-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kapman-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kapptemplate-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kate-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/katomic-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kbackup-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kblackbox-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kblocks-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kbounce-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kbreakout-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kbruch-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kcachegrind-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kcalc-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kcharselect-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kcolorchooser-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kcron-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kde-dev-scripts-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kde-dev-utils-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdebugsettings-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdeconnect-kde-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdeedu-data-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdegraphics-mobipocket-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdegraphics-thumbnailers-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdenetwork-filesharing-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdenlive-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdesdk-kioslaves-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdesdk-thumbnailers-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdf-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdialog-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kdiamond-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/keditbookmarks-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kfind-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kfloppy-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kfourinline-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kgeography-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kget-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kgoldrunner-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kgpg-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/khangman-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/khelpcenter-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kig-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kigo-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/killbots-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kimagemapeditor-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kio-extras-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kipi-plugins-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kirigami-gallery-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kiriki-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kiten-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kjumpingcube-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/klettres-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/klickety-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/klines-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kmag-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kmahjongg-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kmines-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kmix-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kmousetool-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kmouth-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kmplot-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/knavalbattle-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/knetwalk-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/knights-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kolf-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kollision-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kolourpaint-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kompare-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/konqueror-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/konquest-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/konsole-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kopete-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kpat-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kqtquickcharts-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/krdc-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kreversi-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/krfb-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kross-interpreters-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kruler-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kshisen-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ksirk-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ksnakeduel-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kspaceduel-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ksquares-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ksudoku-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ksystemlog-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kteatime-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ktimer-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ktouch-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/ktuberling-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kturtle-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kubrick-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kwalletmanager-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kwave-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/kwordquiz-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkcddb-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkcompactdisc-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkdcraw-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkdegames-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkeduvocdocument-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkexiv2-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkgeomap-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkipi-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkmahjongg-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libkomparediff2-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/libksane-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/lokalize-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/lskat-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/marble-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/minuet-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/okular-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/palapeli-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/parley-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/picmi-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/poxml-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/print-manager-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/rocs-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/spectacle-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/step-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/svgpart-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/sweeper-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/umbrello-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/yakuake-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/applications/zeroconf-ioslave-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/attica-framework-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/baloo5-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/bluez-qt-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/breeze-icons-5.70.0-noarch-1alien.txz
-current/5/x86_64/kde/frameworks/extra-cmake-modules-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/frameworkintegration-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kactivities-framework-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kactivities-stats-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kapidox-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/karchive-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kauth-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kbookmarks-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kcalendarcore-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kcmutils-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kcodecs-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kcompletion-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kconfig-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kconfigwidgets-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kcontacts-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kcoreaddons-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kcrash-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdbusaddons-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdeclarative-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kded-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdelibs4support-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdesignerplugin-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdesu-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdewebkit-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdnssd-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kdoctools-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kemoticons-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kfilemetadata5-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kglobalaccel-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kguiaddons-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kholidays-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/khtml-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/ki18n-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kiconthemes-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kidletime-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kimageformats-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kinit-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kio-5.70.1-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kirigami2-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kitemmodels-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kitemviews-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kjobwidgets-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kjs-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kjsembed-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kmediaplayer-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/knewstuff-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/knotifications-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/knotifyconfig-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kpackage-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kparts-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kpeople-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kplotting-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kpty-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kquickcharts-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kross-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/krunner-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kservice-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/ktexteditor-5.70.1-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/ktextwidgets-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kunitconversion-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kwallet-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kwayland-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kwidgetsaddons-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kwindowsystem-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kxmlgui-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/kxmlrpcclient-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/modemmanager-qt-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/networkmanager-qt-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/oxygen-icons5-5.70.0-noarch-1alien.txz
-current/5/x86_64/kde/frameworks/plasma-framework-5.70.1-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/prison-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/purpose-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/qqc2-desktop-style-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/solid-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/sonnet-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/syndication-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/syntax-highlighting-5.70.0-x86_64-1alien.txz
-current/5/x86_64/kde/frameworks/threadweaver-5.70.0-x86_64-1alien.txz
+current/5/x86_64/kde/applications-extra/skanlite-2.2.0-x86_64-1alien.txz
+current/5/x86_64/kde/applications/analitza-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ark-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/artikulate-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/audiocd-kio-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/baloo5-widgets-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/blinken-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/bomber-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/bovo-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/cantor-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/cervisia-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/dolphin-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/dolphin-plugins-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/dragon-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/elisa-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ffmpegthumbs-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/filelight-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/granatier-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/gwenview-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/juk-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/k3b-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kalgebra-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kalzium-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kamera-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kamoso-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kanagram-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kapman-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kapptemplate-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kate-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/katomic-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kbackup-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kblackbox-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kblocks-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kbounce-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kbreakout-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kbruch-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kcachegrind-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kcalc-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kcharselect-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kcolorchooser-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kcron-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kde-dev-scripts-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kde-dev-utils-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdebugsettings-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdeconnect-kde-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdeedu-data-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdegraphics-mobipocket-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdegraphics-thumbnailers-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdenetwork-filesharing-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdenlive-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdesdk-kioslaves-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdesdk-thumbnailers-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdf-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdialog-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kdiamond-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/keditbookmarks-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kfind-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kfloppy-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kfourinline-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kgeography-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kget-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kgoldrunner-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kgpg-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/khangman-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/khelpcenter-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kig-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kigo-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/killbots-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kimagemapeditor-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kio-extras-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kipi-plugins-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kirigami-gallery-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kiriki-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kiten-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kjumpingcube-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/klettres-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/klickety-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/klines-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kmag-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kmahjongg-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kmines-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kmix-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kmousetool-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kmouth-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kmplot-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/knavalbattle-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/knetwalk-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/knights-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kolf-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kollision-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kolourpaint-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kompare-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/konqueror-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/konquest-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/konsole-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kopete-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kpat-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kqtquickcharts-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/krdc-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kreversi-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/krfb-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kross-interpreters-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kruler-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kshisen-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ksirk-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ksnakeduel-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kspaceduel-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ksquares-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ksudoku-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ksystemlog-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kteatime-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ktimer-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ktouch-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/ktuberling-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kturtle-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kubrick-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kwalletmanager-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kwave-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/kwordquiz-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkcddb-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkcompactdisc-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkdcraw-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkdegames-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkeduvocdocument-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkexiv2-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkgeomap-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkipi-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkmahjongg-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libkomparediff2-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/libksane-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/lokalize-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/lskat-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/marble-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/minuet-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/okular-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/palapeli-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/parley-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/picmi-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/poxml-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/print-manager-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/rocs-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/spectacle-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/step-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/svgpart-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/sweeper-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/umbrello-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/yakuake-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/applications/zeroconf-ioslave-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/attica-framework-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/baloo5-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/bluez-qt-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/breeze-icons-5.72.0-noarch-1alien.txz
+current/5/x86_64/kde/frameworks/extra-cmake-modules-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/frameworkintegration-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kactivities-framework-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kactivities-stats-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kapidox-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/karchive-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kauth-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kbookmarks-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kcalendarcore-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kcmutils-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kcodecs-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kcompletion-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kconfig-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kconfigwidgets-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kcontacts-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kcoreaddons-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kcrash-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdbusaddons-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdeclarative-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kded-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdelibs4support-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdesignerplugin-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdesu-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdewebkit-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdnssd-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kdoctools-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kemoticons-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kfilemetadata5-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kglobalaccel-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kguiaddons-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kholidays-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/khtml-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/ki18n-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kiconthemes-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kidletime-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kimageformats-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kinit-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kio-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kirigami2-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kitemmodels-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kitemviews-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kjobwidgets-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kjs-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kjsembed-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kmediaplayer-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/knewstuff-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/knotifications-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/knotifyconfig-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kpackage-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kparts-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kpeople-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kplotting-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kpty-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kquickcharts-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kross-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/krunner-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kservice-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/ktexteditor-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/ktextwidgets-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kunitconversion-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kwallet-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kwayland-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kwidgetsaddons-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kwindowsystem-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kxmlgui-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/kxmlrpcclient-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/modemmanager-qt-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/networkmanager-qt-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/oxygen-icons5-5.72.0-noarch-1alien.txz
+current/5/x86_64/kde/frameworks/plasma-framework-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/prison-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/purpose-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/qqc2-desktop-style-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/solid-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/sonnet-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/syndication-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/syntax-highlighting-5.72.0-x86_64-1alien.txz
+current/5/x86_64/kde/frameworks/threadweaver-5.72.0-x86_64-1alien.txz
current/5/x86_64/kde/kde4/kdelibs-4.14.38-x86_64-3alien.txz
-current/5/x86_64/kde/kdepim/akonadi-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadi-calendar-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadi-calendar-tools-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadi-contacts-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadi-import-wizard-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadi-mime-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadi-notes-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadi-search-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akonadiconsole-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/akregator-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/calendarsupport-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/eventviews-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/grantlee-editor-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/grantleetheme-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/incidenceeditor-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kaddressbook-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kalarm-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kalarmcal-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kblog-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kcalutils-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kdav-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kdepim-addons-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kdepim-apps-libs-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kdepim-runtime-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kidentitymanagement-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kimap-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kitinerary-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kldap-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kleopatra-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kmail-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kmail-account-wizard-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kmailtransport-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kmbox-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kmime-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/knotes-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kontact-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kontactinterface-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/korganizer-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kpimtextedit-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/kpkpass-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/ksmtp-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/ktnef-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/libgravatar-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/libkdepim-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/libkgapi-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/libkleo-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/libksieve-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/mailcommon-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/mailimporter-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/mbox-importer-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/messagelib-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/pim-data-exporter-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/pim-sieve-editor-20.04.1-x86_64-1alien.txz
-current/5/x86_64/kde/kdepim/pimcommon-20.04.1-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-calendar-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-calendar-tools-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-contacts-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-import-wizard-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-mime-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-notes-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadi-search-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akonadiconsole-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/akregator-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/calendarsupport-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/eventviews-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/grantlee-editor-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/grantleetheme-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/incidenceeditor-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kaddressbook-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kalarm-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kalarmcal-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kblog-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kcalutils-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kdav-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kdepim-addons-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kdepim-apps-libs-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kdepim-runtime-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kidentitymanagement-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kimap-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kitinerary-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kldap-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kleopatra-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kmail-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kmail-account-wizard-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kmailtransport-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kmbox-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kmime-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/knotes-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kontact-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kontactinterface-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/korganizer-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kpimtextedit-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/kpkpass-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/ksmtp-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/ktnef-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/libgravatar-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/libkdepim-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/libkgapi-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/libkleo-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/libksieve-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/mailcommon-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/mailimporter-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/mbox-importer-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/messagelib-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/pim-data-exporter-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/pim-sieve-editor-20.04.3-x86_64-1alien.txz
+current/5/x86_64/kde/kdepim/pimcommon-20.04.3-x86_64-1alien.txz
current/5/x86_64/kde/plasma-extra/kpeoplevcard-0.1-x86_64-1alien.txz
current/5/x86_64/kde/plasma-extra/latte-dock-0.9.11-x86_64-1alien.txz
current/5/x86_64/kde/plasma-extra/oxygen-fonts-5.4.3-x86_64-1alien.txz
+current/5/x86_64/kde/plasma-extra/plasma-wayland-protocols-1.1.0-x86_64-1alien.txz
current/5/x86_64/kde/plasma-extra/pulseaudio-qt-1.2-x86_64-1alien.txz
-current/5/x86_64/kde/plasma-extra/sddm-qt5-0.18.1-x86_64-4alien.txz
-current/5/x86_64/kde/plasma-extra/wacomtablet-3.2.0-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/bluedevil-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/breeze-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/breeze-grub-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/breeze-gtk-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/drkonqi-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kactivitymanagerd-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kde-cli-tools-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kde-gtk-config-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kdecoration-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kdeplasma-addons-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kgamma5-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/khotkeys-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kinfocenter-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kmenuedit-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kscreen2-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kscreenlocker-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/ksshaskpass-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/ksysguard-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kwallet-pam-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kwayland-integration-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kwin-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/kwrited-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/libkscreen2-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/libksysguard-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/milou-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/oxygen-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-browser-integration-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-desktop-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-integration-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-pa-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-sdk-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-vault-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-workspace-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma-workspace-wallpapers-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/plasma5-nm-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/polkit-kde-framework-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/powerdevil-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/sddm-kcm-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/systemsettings-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/user-manager-5.18.5-x86_64-1alien.txz
-current/5/x86_64/kde/plasma/xdg-desktop-portal-kde-5.18.5-x86_64-1alien.txz
+current/5/x86_64/kde/plasma-extra/sddm-qt5-0.18.1-x86_64-6alien.txz
+current/5/x86_64/kde/plasma-extra/wacomtablet-20200712_a573687-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/bluedevil-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/breeze-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/breeze-grub-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/breeze-gtk-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/drkonqi-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kactivitymanagerd-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kde-cli-tools-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kde-gtk-config-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kdecoration-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kdeplasma-addons-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kgamma5-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/khotkeys-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kinfocenter-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kmenuedit-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kscreen2-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kscreenlocker-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/ksshaskpass-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/ksysguard-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kwallet-pam-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kwayland-integration-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kwayland-server-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kwin-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/kwrited-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/libkscreen2-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/libksysguard-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/milou-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/oxygen-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-browser-integration-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-desktop-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-integration-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-pa-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-sdk-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-vault-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-workspace-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma-workspace-wallpapers-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/plasma5-nm-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/polkit-kde-framework-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/powerdevil-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/sddm-kcm-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/systemsettings-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/user-manager-5.19.4-x86_64-1alien.txz
+current/5/x86_64/kde/plasma/xdg-desktop-portal-kde-5.19.4-x86_64-1alien.txz
diff --git a/README.5_20.06 b/README.5_20.08
index 47abb24..a680e61 100644
--- a/README.5_20.06
+++ b/README.5_20.08
@@ -1,22 +1,26 @@
KDE5
====
-BIG FAT NOTICE:
- This monthly release of Alien's ktown is a major prep test
- for replacing ConsoleKit2 with elogind in Slackware-current.
- Read the instructions carefully! In short:
- - UPGRADE TO THE LATEST slackware-current first.
- - Then, REMOVE the ConsoleKit2 package.
- - Finally, install or upgrade the KDE5 package set.
-
-This is (unsurprisingly) KDE 5_20.06 for Slackware, consisting of
-KDE Frameworks 5.71.0, Plasma 5.19.1 and Applications 20.04.2
+# ------------------------------------------------------------------------- #
+# BIG FAT NOTICE: #
+# Alien's ktown is changing your Slackware-current system and replaces #
+# ConsoleKit2 with elogind. Read the instructions carefully! In short: #
+# - UPGRADE TO THE LATEST slackware-current first. #
+# - Then, REMOVE the ConsoleKit2 package (if it is still installed). #
+# - Finally, install or upgrade the KDE5 package set. #
+# - Ensure you put any *.new files into their correct locations #
+# (a 'slackpkg new-config' will help). #
+# - Reboot. #
+# ------------------------------------------------------------------------- #
+
+This is KDE 5_20.08 for Slackware, consisting of:
+KDE Frameworks 5.72.0, Plasma 5.19.4 and Applications 20.04.3;
on top of Slackware's Qt 5.15.0.
-Upgrading from the previous 5_20.05 should be done with care! If you do not
-follow directions, your system will no longer allow you in!
+Upgrading from the previous 5_20.06 should be done with care, but since you
+should already have migrated to elogind, I do not expect anything will break.
-KDE-5_20.06 is meant to be installed on top of Slackware -current.
+KDE-5_20.08 is meant to be installed on top of Slackware -current.
It will *replace* any version of KDE 4 you might have installed!
The Plasma 5 Desktop has gotten rid of its Qt4 legacy. Since the release of
Applications 17.12 there's nothing left which is based on kdelibs4.
@@ -24,66 +28,41 @@ Slackware-current has begun its slow adoptation of the Plasma5 dependencies.
Most importantly, QT5 and its dependencies are already part of Slackware.
What is the NEWS in this batch of updates:
-- Last month was the first release on top of a PAM-ified Slackware. I thought
- I was done with public updates and continued experimenting in private,
- but then a discussion on LinuxQuestions.org started because some people
- seem to watch my git repository and noticed that I created a new 'elogind'
- branch there. The discussion resolved a dead-end for me and I decided to
- make a deal with Patrick. A new 'ktown' release targeting a fully
- functional Plasma Wayland session.
- And so, this month we take another major step. ConsoleKit2 which has been our
- Session/Seat Manager for a long time, is going to be replaced with elogind.
- The elogind code, similar to eudev which is already in Slackware, is a piece
- of the systemd codebase (notably, systemd-logind) which was extracted and
- modified so that it is no longer depending on systemd at all.
- Slackware needs elogind if we are ever to provide a Wayland desktop next to
- the venerable X.Org desktop environment. It seems like ConsoleKit2 is no
- longer actively maintained and that means, other developers are no longer
- maintaining compatibility with it (ConsoleKit2 and elogind offer similar
- functionality but a program which needs that functionality must explicitly
- carry the code to support both).
- This time we are taking a joint approach.
- Pat Volkerding has modified '/etc/rc.d/rc.M' inside the sysvinit-scripts
- package, and '/etc/pam.d/login' inside the util-linux package in
- slackware-current to be compatible with both ConsoleKit2 and elogind.
- I have added elogind to 'ktown' and rebuilt the Slackware packages dbus and
- polkit to pick up support for elogind (losing support for CK2 in the
- process).
+- In May we had the first release on Plasma5 on a PAM-ified Slackware, and
+ in June I went along and replaced ConsoleKit2 with elogind - a requirement
+ to make a KDE Plasma Wayland graphical session work.
* *
* Note that only one of the two (ConsoleKit2 or elogind) must be installed! *
- * If you install ktown KDE-5_20.06 you need to remove ConsoleKit2! *
+ * If you install ktown KDE-5_20.08 you need to remove ConsoleKit2! *
* *
-- So, this leads to the following package updates in 'deps'.
- * added the package autoconf-archive which was needed to recompile dbus.
- * added elogind (make sure to 'removepkg ConsoleKit2' first!)
- * added recompiled Slackware packages with elogind support: dbus and polkit.
- * recompiled accountsservice to pick up elogind support
- * recompiled polkit-qt5, libdbusmenu-qt5, qca-qt5 against the new Qt5,
- which got an upgrade in Slackware since last month's 'ktown' release.
- * recompiled grantlee-qt4 because I had forgotten to do so after the 2018
- mass rebuild in Slackware... no-one noticed.
-- Frameworks 5.71.0 is an incremental stability release, see also:
- https://kde.org/announcements/kde-frameworks-5.71.0
- The packages which pick up elogind support are: solid.
-- Plasma 5.19.1 is the second increment of the 5.19 cycle, which means
- that I skipped the .0 release.
- See https://kde.org/announcements/plasma-5.19.1 and if you want to
+- The 'deps' section got a bit smaller again this month:
+ * pcaudiolib, espeak-ng, hack-fonts-ttf, noto-fonts-ttf, and
+ noto-cjk-fonts-ttf were moved into the actual Slackware distro;
+ * flite has been removed since Pat decided we will go with just espeak-ng;
+ * a new package 'pipewire' was added as a dependency for krfb and
+ xdg-desktop-portal-kde.
+ * The elogind-aware dbus package was upgraded to match the Slackware version.
+ * Finally, qca-qt5 was upgraded and I recompiled mlt (to fix the broken
+ kdenlive) and speech-dispatcher.
+- Frameworks 5.72.0 is an incremental stability release, see also:
+ https://kde.org/announcements/kde-frameworks-5.72.0
+ A new 'kdav' source tarball got added but that is actually the same package
+ you'll find in KDEPIM. Next batch, the actual kdav package will be built
+ from Frameworks sources.
+- Plasma 5.19.4 is an increment of the 5.19 cycle to add stability & fix bugs.
+ See https://kde.org/announcements/plasma-5.19.4 and if you want to
read more about the goals for 5.19 you should check out:
https://kde.org/announcements/plasma-5.19.0
- There is a new package in here: kwayland-server.
- The packages which pick up elogind support are: plasma-workspace,
- powerdevil, kscreenlocker.
-- In plasma-extra I rebuilt sddm-qt5 to pick up elogind support and added
- plasma-wayland-protocols as dependency for the new kwayland-server in Plasma.
-- Applications 20.04.2 is an incremental bug fix release, see also
- https://kde.org/announcements/releases/2020-06-apps-update/
-- For applications-extra, I tried (and failed) to update krita
- and updated kmymoney.
+- In plasma-extra I rebuilt sddm-qt5 to install man pages correctly, and
+ upgraded plasma-wayland-protocols and wacomtablet.
+- Applications 20.04.3 is an incremental bug fix release, see also
+ https://kde.org/announcements/releases/2020-07-apps-update/
+- For applications-extra I updated digikam, krita, libktorrent and ktorrent,
+ and skanlite. Note that the size of the digikam source tarball 'blew up'
+ due to the addition of new neural network facial recognition data files,
+ but the actual package 'only' grew from 97 to 108 MB.
Further points of interest:
-- If you have a KDE4-based application that needs library support on this
- Plasma 5 desktop, let me know which of the removed packages needs to return
- in 'kde/kde4'!
- There are a couple of *runtime* dependencies that I did not add to the
ktown repository, but you may want to consider installing them yourself:
* vlc - will give phonon another backend to select from.
@@ -97,13 +76,12 @@ Further points of interest:
applications to dock into the Plasma 5 system tray, more dependencies were
needed. Apart from updates to regular Slackware packages the new ones are:
accountsservice, autoconf-archive, cfitsio, cryptopp, cryfs, ddcutil,
- dotconf, drumstick, dvdauthor, elogind , espeak-ng, flite, freecell-solver,
- frei0r-plugins, grantlee-qt4, hack-font-ttf, id3lib, lensfun,
- libappindicator, libburn, libdbusmenu-gtk, libdbusmenu-qt5, libdmtx,
- libindicator, libsass, md4c, mlt, noto-font-ttf, noto-cjk-font-ttf, opencv,
- pcaudiolib, perl-path-tiny, perl-template-toolkit, polkit-qt5-1,
- python3-random2, quazip, qca-qt5, qrencode, qtav, rttr, sassc, sni-qt,
- speech-dispatcher, and vid.stab
+ dotconf, drumstick, dvdauthor, elogind , freecell-solver, frei0r-plugins,
+ grantlee-qt4, lensfun, libappindicator, libburn, libdbusmenu-gtk,
+ libdbusmenu-qt5, libdmtx, libindicator, libsass, md4c, mlt, opencv,
+ perl-path-tiny, perl-template-toolkit, polkit-qt5-1, python3-random2,
+ quazip, qca-qt5, qrencode, qtav, rttr, sassc, sni-qt, speech-dispatcher,
+ and vid.stab .
The phonon and poppler packages were extended so that they now support
Qt5 as well as Qt4. The gpgme package picked up Qt5 support.
Note that the SBo version of 'frei0r-plugins' package is called 'frei0r'.
@@ -119,6 +97,12 @@ Also explained in more detail below, upgrading to this KDE 5 is non-trivial.
You will have to remove old KDE 4 packages manually.
NOTE:
+If this time you removed ConsoleKit2 and installed elogind, be sure to
+reboot your computer before attempting to login. Also be very sure that
+you moved all the *.new files into place before you reboot (the command
+'slackpkg new-config' can help you do that).
+
+NOTE:
If you had installed KDE 4 as your default desktop previously, the removal
of KDE 4 packages will break the symbolic link '/etc/X11/xinit/xinitrc'.
An attempt to run 'startx' in a console will fail with a black screen.
@@ -198,13 +182,19 @@ If you have Slackware 14.2 or -current's default KDE 4.14.3 installed:
Alternatively, in case you are already using an older release of my KDE 5
packages, you need to look up that particular release in the list right below
-(for instance: KDE 5_19.11) and then apply the actions shown for that KDE 5
+(for instance: KDE 5_20.02) and then apply the actions shown for that KDE 5
release *and* all more recent releases, i.e. work your way back up to this
paragraph. Note that some of the old KDE package names were obsoleted along
the way, they were split up, renamed or integrated and that is the reason
for some of the 'removepkg' lines you'll see below.
Here we go:
+If you have my 'ktown' set of KDE 5_20.06 installed:
+- Upgrade to KDE 5_20.08
+ Remove the packages that no longer exist in KDE 5_20.08:
+ # removepkg flite
+ If you do need flite, consider building it from slackbuilds.org.
+
If you have my 'ktown' set of KDE 5_20.05 installed:
- UPGRADE TO THE LATEST slackware-current first.
- Then, REMOVE ConsoleKit2:
@@ -238,14 +228,6 @@ If you have my 'ktown' set of KDE 5_20.01 installed:
# removepkg polkit-kde-kcmodules-framework
If you have my 'ktown' set of KDE 5_19.12 installed:
-- No further actions are needed.
-
-If you have my 'ktown' set of KDE 5_19.11 installed:
-- Upgrade to KDE 5_19.12
- Remove the packages that no longer exist in KDE 5_19.12:
- # removepkg qt-gstreamer
-
-If you have my 'ktown' set of KDE 5_19.10 installed:
- Really? A full re-install may be wiser.
Proceed with installing/upgrading KDE 5 as outlined below.
@@ -322,10 +304,12 @@ A graphical (ncurses) tool for processing these "*.new" files is slackpkg:
# slackpkg new-config
Then reboot your system.
-IF this is the first time you run Plasma5, be aware that Baloo will
-tax your CPU fairly heavily for a while as it indexes the content of
-the files on your hard disk. After this initial indexing operation finishes,
-(could take several hours) Baloo will get out of your way and stay there.
+If this is the first time you run Plasma5, and you enable Baloo file indexing,
+be aware that Baloo will tax your CPU fairly heavily for a while as it indexes
+the content of the files on your hard disk.
+After this initial indexing operation finishes (could take several hours),
+Baloo will get out of your way and stay there.
+This is why indexing is disabled by default.
If all you want is to install the packages I created, then you can skip the
remainder of the README which details how to (re)compile the packages from
@@ -343,10 +327,10 @@ If you want the sources for KDE 5, run the following command to download them
There are a lot of 'dependencies' for KDE 5 which you'll have to compile and
install before attempting to compile KDE 5. Compiling and installing these
-dependencies on Slackware-current is hopefully (have not tested the scripts
-'updates.SlackBuild' and 'alldeps.SlackBuild' in a long time) as easy as this:
+dependencies on Slackware-current is hopefully (have not tested the script
+'alldeps.SlackBuild' in a long time) as easy as this:
# cd sources/deps
- # ./updates.SlackBuild
+ # ./alldeps.SlackBuild
# cd -
The finished packages will be stored in /tmp and will already have been
@@ -362,4 +346,4 @@ Reboot your computer and login to a Plasma session.
==============================================================================
- Eric Hameleers / alien at slackware dot com / 18-jun-2020
+ Eric Hameleers / alien at slackware dot com / 01-aug-2020
diff --git a/deps/alldeps.SlackBuild b/deps/alldeps.SlackBuild
index d3a7d98..6fdb0c4 100755
--- a/deps/alldeps.SlackBuild
+++ b/deps/alldeps.SlackBuild
@@ -15,6 +15,7 @@ QTDIR=/usr/lib${LIBDIRSUFFIX}/qt ; export QTDIR
ALLDEPS=" \
extra-cmake-modules \
+ elogind \
md4c \
sni-qt \
qjson \
@@ -24,10 +25,7 @@ ALLDEPS=" \
phonon-qt4-gstreamer \
python-enum34 \
pyxdg \
- pcaudiolib \
- espeak-ng \
dotconf \
- flite \
speech-dispatcher \
qca-qt5 \
libdbusmenu-qt5 \
@@ -42,9 +40,6 @@ ALLDEPS=" \
cfitsio \
libdmtx \
qrencode \
- hack-font-ttf \
- noto-font-ttf \
- noto-cjk-font-ttf \
lensfun \
opencv \
dvdauthor \
@@ -72,9 +67,8 @@ ALLDEPS=" \
kdsoap \
libqalculate \
exiv2 \
+ pipewire \
"
- # Only needed when adding support for Wayland:
- #elogind \
# Allow for specification of individual packages to be built:
if [ -z "$1" ]; then
diff --git a/deps/dbus/dbus.SlackBuild b/deps/dbus/dbus.SlackBuild
index 56c33c6..eb6364e 100755
--- a/deps/dbus/dbus.SlackBuild
+++ b/deps/dbus/dbus.SlackBuild
@@ -28,7 +28,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PKGNAM=dbus
VERSION=${VERSION:-$(echo $PKGNAM-*.tar.?z | cut -d - -f 2 | rev | cut -f 3- -d . | rev)}
-BUILD=${BUILD:-2}
+BUILD=${BUILD:-1}
NUMJOBS=${NUMJOBS:-" -j$(expr $(nproc) + 1) "}
diff --git a/deps/espeak-ng/.deps b/deps/espeak-ng/.deps
deleted file mode 100644
index 60c2f98..0000000
--- a/deps/espeak-ng/.deps
+++ /dev/null
@@ -1 +0,0 @@
-pcaudiolib
diff --git a/deps/espeak-ng/.url b/deps/espeak-ng/.url
deleted file mode 100644
index a1127ef..0000000
--- a/deps/espeak-ng/.url
+++ /dev/null
@@ -1 +0,0 @@
-https://github.com/espeak-ng/espeak-ng/releases/download/1.49.2/espeak-ng-1.49.2.tar.gz
diff --git a/deps/espeak-ng/espeak-ng.SlackBuild b/deps/espeak-ng/espeak-ng.SlackBuild
deleted file mode 100755
index 5a530da..0000000
--- a/deps/espeak-ng/espeak-ng.SlackBuild
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/bin/sh
-
-# Copyright 2019 Patrick J. Volkerding, Sebeka, MN, USA
-# Copyright 2019 Eric Hameleers, Eindhoven, NL
-# All rights reserved.
-#
-# Redistribution and use of this script, with or without modification, is
-# permitted provided that the following conditions are met:
-#
-# 1. Redistributions of this script must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''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 AUTHOR 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.
-
-
-cd $(dirname $0) ; CWD=$(pwd)
-
-PKGNAM=espeak-ng
-VERSION=${VERSION:-1.49.2}
-BUILD=${BUILD:-1}
-
-TMP=${TMP:-/tmp}
-PKG=$TMP/package-$PKGNAM
-
-# Automatically determine the architecture we're building on:
-if [ -z "$ARCH" ]; then
- case "$(uname -m)" in
- i?86) ARCH=i586 ;;
- arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;;
- # Unless $ARCH is already set, use uname -m for all other archs:
- *) ARCH=$(uname -m) ;;
- esac
- export ARCH
-fi
-
-# Set CFLAGS/CXXFLAGS and LIBDIRSUFFIX:
-if [ "$ARCH" = "i586" ]; then
- SLKCFLAGS="-O2 -march=${ARCH} -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "x86_64" ]; then
- SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
-elif [ "$ARCH" = "arm" ]; then
- SLKCFLAGS="-O2 -march=armv5te"
- LIBDIRSUFFIX=""
-else
- SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
-fi
-
-case "$ARCH" in
- arm*) TARGET=$ARCH-slackware-linux-gnueabi ;;
- *) TARGET=$ARCH-slackware-linux ;;
-esac
-
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
-if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "${PKGNAM}-${VERSION}-${ARCH}-${BUILD}.txz"
- exit 0
-fi
-
-rm -rf $PKG
-mkdir -p $TMP $PKG
-cd $TMP
-rm -rf $PKGNAM-$VERSION
-tar xvf $CWD/$PKGNAM-$VERSION.tar.gz || exit 1
-cd $PKGNAM-$VERSION || exit 1
-chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-[ ! -x configure ] && ./autogen.sh
-
-CFLAGS="$SLKCFLAGS" \
-CXXFLAGS="$SLKCFLAGS" \
-./configure \
- --prefix=/usr \
- --libdir=/usr/lib${LIBDIRSUFFIX} \
- --sysconfdir=/etc \
- --disable-static \
- --build=$TARGET || exit 1
-
-make src/espeak-ng src/speak-ng || exit 1
-make -j1 || exit 1
-make install DESTDIR=$PKG || exit 1
-
-# Add documentation:
-mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
-cp -a \
- AUTHORS CHANGELOG.md COPYING* ChangeLog README.md \
- $PKG/usr/doc/$PKGNAM-$VERSION
-
-# Strip binaries (if any):
-find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-# Add a package description:
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-# Build the package:
-cd $PKG
-/sbin/makepkg -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz
-
diff --git a/deps/espeak-ng/slack-desc b/deps/espeak-ng/slack-desc
deleted file mode 100644
index a4308ab..0000000
--- a/deps/espeak-ng/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description.
-# Line up the first '|' above the ':' following the base package name, and
-# the '|' on the right side marks the last column you can put a character in.
-# You must make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':' except on otherwise blank lines.
-
- |-----handy-ruler------------------------------------------------------|
-espeak-ng: espeak-ng (multi-lingual software speech synthesizer)
-espeak-ng:
-espeak-ng: espeak-ng is a multi-lingual software speech synthesizer.
-espeak-ng: It is a fork of the unmaintained espeak code.
-espeak-ng:
-espeak-ng:
-espeak-ng:
-espeak-ng:
-espeak-ng:
-espeak-ng: Homepage: https://github.com/espeak-ng/espeak-ng
-espeak-ng:
diff --git a/deps/flite/.url b/deps/flite/.url
deleted file mode 100644
index bf3e1c8..0000000
--- a/deps/flite/.url
+++ /dev/null
@@ -1 +0,0 @@
-http://festvox.org/flite/packed/flite-2.1/flite-2.1-release.tar.bz2
diff --git a/deps/flite/flite.SlackBuild b/deps/flite/flite.SlackBuild
deleted file mode 100755
index aba913e..0000000
--- a/deps/flite/flite.SlackBuild
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/bin/sh
-
-# Copyright 2019 Patrick J. Volkerding, Sebeka, MN, USA
-# Copyright 2019 Eric Hameleers, Eindhoven, NL
-# All rights reserved.
-#
-# Redistribution and use of this script, with or without modification, is
-# permitted provided that the following conditions are met:
-#
-# 1. Redistributions of this script must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''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 AUTHOR 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.
-
-
-cd $(dirname $0) ; CWD=$(pwd)
-
-PKGNAM=flite
-VERSION=${VERSION:-2.1}
-BUILD=${BUILD:-1}
-
-TMP=${TMP:-/tmp}
-PKG=$TMP/package-$PKGNAM
-
-# Automatically determine the architecture we're building on:
-if [ -z "$ARCH" ]; then
- case "$(uname -m)" in
- i?86) ARCH=i586 ;;
- arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;;
- # Unless $ARCH is already set, use uname -m for all other archs:
- *) ARCH=$(uname -m) ;;
- esac
- export ARCH
-fi
-
-# Set CFLAGS/CXXFLAGS and LIBDIRSUFFIX:
-if [ "$ARCH" = "i586" ]; then
- SLKCFLAGS="-O2 -march=${ARCH} -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "x86_64" ]; then
- SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
-elif [ "$ARCH" = "arm" ]; then
- SLKCFLAGS="-O2 -march=armv5te"
- LIBDIRSUFFIX=""
-else
- SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
-fi
-
-case "$ARCH" in
- arm*) TARGET=$ARCH-slackware-linux-gnueabi ;;
- *) TARGET=$ARCH-slackware-linux ;;
-esac
-
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
-if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "${PKGNAM}-${VERSION}-${ARCH}-${BUILD}.txz"
- exit 0
-fi
-
-rm -rf $PKG
-mkdir -p $TMP $PKG
-cd $TMP
-rm -rf $PKGNAM-$VERSION-release
-tar xvf $CWD/$PKGNAM-$VERSION-release.tar.?z* || exit 1
-cd $PKGNAM-$VERSION-release || exit 1
-chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-[ ! -x configure ] && ./autogen.sh
-
-CFLAGS="$SLKCFLAGS" \
-CXXFLAGS="$SLKCFLAGS" \
-./configure \
- --prefix=/usr \
- --libdir=/usr/lib${LIBDIRSUFFIX} \
- --sysconfdir=/etc \
- --with-audio=alsa \
- --build=$TARGET || exit 1
-
-make || exit 1
-make install DESTDIR=$PKG || exit 1
-
-# Add documentation:
-mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
-cp -a \
- ACKNOWLEDGEMENTS COPYING README* \
- $PKG/usr/doc/$PKGNAM-$VERSION
-
-# Strip binaries (if any):
-find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-# Add a package description:
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-# Build the package:
-cd $PKG
-/sbin/makepkg -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz
-
diff --git a/deps/flite/slack-desc b/deps/flite/slack-desc
deleted file mode 100644
index e2990b7..0000000
--- a/deps/flite/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description.
-# Line up the first '|' above the ':' following the base package name, and
-# the '|' on the right side marks the last column you can put a character in.
-# You must make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':' except on otherwise blank lines.
-
- |-----handy-ruler------------------------------------------------------|
-flite: flite (lightweight speech synthesis engine)
-flite:
-flite: Flite (or Festival Lite) is a small and fast run-time synthesis engine
-flite: designed for embedded systems and servers.
-flite: Flite is able to load extra voice files at runtime, in its own
-flite: .flitevox format and installed in /usr/share/flite/,
-flite:
-flite:
-flite:
-flite: Homepage: https://www.festvox.org/flite/
-flite:
diff --git a/deps/hack-font-ttf/.url b/deps/hack-font-ttf/.url
deleted file mode 100644
index 0a9120a..0000000
--- a/deps/hack-font-ttf/.url
+++ /dev/null
@@ -1,4 +0,0 @@
-https://github.com/chrissimpkins/Hack/releases/download/v2.020/Hack-v2_020-ttf.tar.xz
-https://raw.githubusercontent.com/chrissimpkins/Hack/master/CHANGELOG.md
-https://raw.githubusercontent.com/chrissimpkins/Hack/master/LICENSE.md
-https://raw.githubusercontent.com/chrissimpkins/Hack/master/README.md
diff --git a/deps/hack-font-ttf/CHANGELOG.md b/deps/hack-font-ttf/CHANGELOG.md
deleted file mode 100644
index db91f4b..0000000
--- a/deps/hack-font-ttf/CHANGELOG.md
+++ /dev/null
@@ -1,743 +0,0 @@
-# Version 2.020
-
-- divided the vertical stroke in the pipe glyph (U+007C), italic and bold italic sets
-- modified U+007C hints in TrueType builds at 6, 7, 10, 11, 12, 13, 14 ppem italic set
-- modified U+007C hints in TrueType builds at 6, 7, 10, 14 ppem bold italic set
-- modified slant angle and stroke length (U+005C), italic and bold italic sets
-- centered U+007C and U+005C, all sets
-- modified zero (U+0030) oval fill hints in regular set
-- added Powerline glyphs to the bold, italic, and bold italic sets
-- U+2502 upper terminal to 1950, lower terminal to -530, all sets
-- U+2503 upper terminal to 1950, lower terminal to -530, all sets
-- U+250C lower terminal to -530, all sets
-- U+250D lower terminal to -530, all sets
-- U+250E lower terminal to -530, all sets
-- U+250F lower terminal to -530, all sets
-- U+2510 lower terminal to -530, all sets
-- U+2511 lower terminal to -530, all sets
-- U+2512 lower terminal to -530, all sets
-- U+2513 lower terminal to -530, all sets
-- U+2514 upper terminal to 1950, all sets
-- U+2515 upper terminal to 1950, all sets
-- U+2516 upper terminal to 1950, all sets
-- U+2517 upper terminal to 1950, all sets
-- U+2518 upper terminal to 1950, all sets
-- U+2519 upper terminal to 1950, all sets
-- U+251A upper terminal to 1950, all sets
-- U+251B upper terminal to 1950, all sets
-- U+251C upper terminal to 1950, lower terminal to -530, all sets
-- U+251D upper terminal to 1950, lower terminal to -530, all sets
-- U+251E upper terminal to 1950, lower terminal to -530, all sets
-- U+251F upper terminal to 1950, lower terminal to -530, all sets
-- U+2520 upper terminal to 1950, lower terminal to -530, all sets
-- U+2521 upper terminal to 1950, lower terminal to -530, all sets
-- U+2522 upper terminal to 1950, lower terminal to -530, all sets
-- U+2523 upper terminal to 1950, lower terminal to -530, all sets
-- U+2524 upper terminal to 1950, lower terminal to -530, all sets
-- U+2525 upper terminal to 1950, lower terminal to -530, all sets
-- U+2526 upper terminal to 1950, lower terminal to -530, all sets
-- U+2527 upper terminal to 1950, lower terminal to -530, all sets
-- U+2528 upper terminal to 1950, lower terminal to -530, all sets
-- U+2529 upper terminal to 1950, lower terminal to -530, all sets
-- U+252A upper terminal to 1950, lower terminal to -530, all sets
-- U+252B upper terminal to 1950, lower terminal to -530, all sets
-- U+252C lower terminal to -530, all sets
-- U+252D lower terminal to -530, all sets
-- U+252E lower terminal to -530, all sets
-- U+252F lower terminal to -530, all sets
-- U+2530 lower terminal to -530, all sets
-- U+2531 lower terminal to -530, all sets
-- U+2532 lower terminal to -530, all sets
-- U+2533 lower terminal to -530, all sets
-- U+2534 upper terminal to 1950, all sets
-- U+2535 upper terminal to 1950, all sets
-- U+2536 upper terminal to 1950, all sets
-- U+2537 upper terminal to 1950, all sets
-- U+2538 upper terminal to 1950, all sets
-- U+2539 upper terminal to 1950, all sets
-- U+253A upper terminal to 1950, all sets
-- U+253B upper terminal to 1950, all sets
-- U+252C upper terminal to 1950, lower terminal to -530, all sets
-- U+252D upper terminal to 1950, lower terminal to -530, all sets
-- U+253E upper terminal to 1950, lower terminal to -530, all sets
-- U+253F upper terminal to 1950, lower terminal to -530, all sets
-- U+2540 upper terminal to 1950, lower terminal to -530, all sets
-- U+2541 upper terminal to 1950, lower terminal to -530, all sets
-- U+2542 upper terminal to 1950, lower terminal to -530, all sets
-- U+2543 upper terminal to 1950, lower terminal to -530, all sets
-- U+2544 upper terminal to 1950, lower terminal to -530, all sets
-- U+2545 upper terminal to 1950, lower terminal to -530, all sets
-- U+2546 upper terminal to 1950, lower terminal to -530, all sets
-- U+2547 upper terminal to 1950, lower terminal to -530, all sets
-- U+2548 upper terminal to 1950, lower terminal to -530, all sets
-- U+2549 upper terminal to 1950, lower terminal to -530, all sets
-- U+254A upper terminal to 1950, lower terminal to -530, all sets
-- U+254B upper terminal to 1950, lower terminal to -530, all sets
-- U+2551 upper terminal to 1950, lower terminal to -530, all sets
-- U+2552 lower terminal to -530, all sets
-- U+2553 lower terminals to -530, all sets
-- U+2554 lower terminals to -530, all sets
-- U+2555 lower terminal to -530, all sets
-- U+2556 lower terminals to -530, all sets
-- U+2557 lower terminals to -530, all sets
-- U+2558 upper terminal to 1950, all sets
-- U+2558 upper terminals to 1950, all sets
-- U+2559 upper terminals to 1950, all sets
-- U+255A upper terminals to 1950, all sets
-- U+255B upper terminal to 1950, all sets
-- U+255C upper terminals to 1950, all sets
-- U+255D upper terminals to 1950, all sets
-- U+255E upper terminal to 1950, lower terminal to -530, all sets
-- U+255F upper terminals to 1950, lower terminals to -530, all sets
-- U+2560 upper terminals to 1950, lower terminals to -530, all sets
-- U+2561 upper terminal to 1950, lower terminal to -530, all sets
-- U+2562 upper terminals to 1950, lower terminals to -530, all sets
-- U+2563 upper terminals to 1950, lower terminals to -530, all sets
-- U+2564 lower terminal to -530, all sets
-- U+2565 lower terminals to -530, all sets
-- U+2566 lower terminals to -530, all sets
-- U+2567 upper terminal to 1950, all sets
-- U+2568 upper terminals to 1950, all sets
-- U+2569 upper terminals to 1950, all sets
-- U+256A upper terminal to 1950, lower terminal to -530, all sets
-- U+256B upper terminals to 1950, lower terminals to -530, all sets
-- U+256C upper terminals to 1950, lower terminals to -530, all sets
-- U+256D lower terminal to -530, all sets
-- U+256E lower terminal to -530, all sets
-- U+256F upper terminal to 1950, all sets
-- U+2570 upper terminal to 1950, all sets
-- U+2571 adjusted horizontal position and length of strokes
-- U+2572 adjusted horizontal position and length of strokes
-- U+2573 adjusted horizontal position and length of strokes
-- U+2575 upper terminal to 1950, all sets
-- U+2577 lower terminal to -530, all sets
-- U+2578 horizontal alignment of superior margin of the stroke (1 unit adjustment)
-- U+2579 upper terminal to 1950, all sets
-- U+257B lower terminal to -530, all sets
-- U+257D upper terminal to 1950, lower terminal to -530, all sets
-- U+257F upper terminal to 1950, lower terminal to -530, all sets
-- updated OpenType name table field 1 0 0
-- updated OpenType name table field 3 1 1033
-- new [Windows installer](https://github.com/source-foundry/Hack-windows-installer)
-- added line spacing adjustment shell scripts
-- added font-tables.py OpenType table reporting script
-- updated dev-versioner.py OpenType table versioning script to support UTF16 big endian encoding of nameID=5, platformID=3 name table
-
-
-# Version 2.019 (release build)
-
-ttf, otf, webfont builds
-
-- removed SVG from webfont releases
-- Corrected U+2588 glyph shape in regular set (had inappropriately small width and height)
-- decreased width U+2580 all sets
-- decreased width U+2581 all sets
-- decreased width U+2582 all sets
-- decreased width U+2583 all sets
-- decreased width U+2584 all sets
-- decreased width U+2585 all sets
-- decreased width U+2586 all sets
-- decreased width U+2857 all sets
-- adjusted left sidebearing U+2589 all sets
-- adjusted left sidebearing U+258A all sets
-- adjusted left sidebearing U+258B all sets
-- adjusted left sidebearing U+258C all sets
-- adjusted left sidebearing U+258D all sets
-- adjusted left sidebearing U+258E all sets
-- adjusted left sidebearing U+258F all sets
-- adjusted right sidebearing U+2590 all sets
-- decreased width of U+2594 all sets
-- adjusted right sidebearing U+2595 all sets
-- adjusted left sidebearing U+2596 all sets
-- adjusted right sidebearing U+2597 all sets
-- adjusted left sidebearing U+2598 all sets
-- decreased width of U+2599 all sets
-- decreased width of U+259A all sets
-- decreased width of U+259B all sets
-- decreased width of U+259C all sets
-- adjusted right sidebearing U+259D all sets
-- decreased width of U+259E all sets
-- decreased width of U+259F all sets
-- increased upper terminal position to 1950 units U+2580 all sets
-- increased upper terminal position to 1950 units U+2588 all sets
-- increased upper terminal position to 1950 units U+2589 all sets
-- increased upper terminal position to 1950 units U+258A all sets
-- increased upper terminal position to 1950 units U+258B all sets
-- increased upper terminal position to 1950 units U+258C all sets
-- increased upper terminal position to 1950 units U+258D all sets
-- increased upper terminal position to 1950 units U+258E all sets
-- increased upper terminal position to 1950 units U+258F all sets
-- increased upper terminal position to 1950 units U+2590 all sets
-- increased upper terminal position to 1950 units U+2594 all sets
-- increased upper terminal position to 1950 units U+2595 all sets
-- increased upper terminal position to 1950 units U+2598 all sets
-- increased upper terminal position to 1950 units U+2599 all sets
-- increased upper terminal position to 1950 units U+259A all sets
-- increased upper terminal position to 1950 units U+259B all sets
-- increased upper terminal position to 1950 units U+259C all sets
-- increased upper terminal position to 1950 units U+259D all sets
-- increased upper terminal position to 1950 units U+259E all sets
-- increased upper terminal position to 1950 units U+259F all sets
-- reverted Cyrillic lower case es glyph (U+0441) to Latin lower case c shape
-- reverted Cyrillic upper case es glyph (U+0421) to Latin upper case C shape
-
-
-# Version 2.018 (release build)
-
-ttf, otf, webfont builds
-
-Patch for missing glyphs in regular set:
-
-- added U+016C (upper case U breve), regular set - Issue #21
-- added U+016D (lower case u breve), regular set - Issue #21
-
-
-# Version 2.017 (release build)
-
-ttf, otf, webfont builds
-
-Changes vs. release v2.015:
-
-- increased vertical position of the tilde (U+007E) to improve alignment with other glyphs - Issue #23
-- increased width of the vertical stroke on the dollar symbol (U+0024) - Issue #92
-- modified Cyrillic upper case C (U+0421) to differentiate from Latin C - Issues #22 & #29
-- modified Cyrillic lower case c (U+0441) to differentiate from Latin c - Issues #22 & #29
-- modified upper case theta (U+0398) to differentiate from lower case theta - Issue #36
-- added U+0132 (IJ) glyph - Issue #52
-- added U+0133 (ij) glyph - Issue #52
-- added U+013F (upper case L dot) glyph - Issue #52
-- added U+0140 (lower case l dot) glyph - Issue #52
-- added U+0162 (upper case T cedilla) glyph - Issue #52
-- added U+0163 (lower case t cedilla) glyph - Issue #52
-- added U+0138 (kgreenlandic) glyph - Issue #52
-- added U+266A (musical note) glyph - Issue #52
-- added U+0149 (lower case n apostrophe) - Issue #52
-- added U+1EF9 (lower case y tilde) glyph - Issue #102
-- added U+1EF8 (upper case Y tilde) glyph - Issue #102
-- added U+1EBD (lower case e tilde) glyph - Issue #102
-- added U+1EBC (upper case E tilde) glyph - Issue #102
-- added U+2116 (numero) glyph - Issues #22 & #114
-- added U+01A4 (p hook) glyph - Issue #105
-- added U+0108 (upper case C circumflex) - Issue #21
-- added U+0109 (lower case c circumflex) - Issue #21
-- added U+011C (upper case G circumflex) - Issue #21
-- added U+011D (lower case g circumflex) - Issue #21
-- added U+0124 (upper case H circumflex) - Issue #21
-- added U+0125 (lower case h circumflex) - Issue #21
-- added U+0134 (upper case J circumflex) - Issue #21
-- added U+0135 (lower case j circumflex) - Issue #21
-- added U+015C (upper case S circumflex) - Issue #21
-- added U+015D (lower case s circumflex) - Issue #21
-- added U+016C (upper case U breve) - Issue #21
-- added U+016D (lower case u breve) - Issue #21
-- added U+20B7 (spesmilo) - Issue #21
-- fixed missing null glyph (U+0000) in regular, italic, bolditalic sets
-- removed duplicate CR glyph (U+000D) in all sets - Issue #149
-- updated ttfautohint to version 1.4.1 for TrueType (.ttf) build instruction sets
-
-# Version 2.016 (testing build)
-
-- increased vertical position of the tilde (U+007E) to improve alignment with other glyphs - Issue #23
-- increased width of the vertical stroke on the dollar symbol (U+0024) - Issue #92
-- modified Cyrillic upper case C (U+0421) to differentiate from Latin C - Issues #22 & #29
-- modified Cyrillic lower case c (U+0441) to differentiate from Latin c - Issues #22 & #29
-- modified upper case theta (U+0398) to differentiate from lower case theta - Issue #36
-- added U+1EF9 (lower case y tilde) glyph - Issue #102
-- added U+1EF8 (upper case Y tilde) glyph - Issue #102
-- added U+1EBD (lower case e tilde) glyph - Issue #102
-- added U+1EBC (upper case E tilde) glyph - Issue #102
-- added U+2116 (numero) glyph - Issues #22 & #114
-- added U+01A4 (p hook) glyph - Issue #105
-- added U+0108 (upper case C circumflex) - Issue #21
-- added U+0109 (lower case c circumflex) - Issue #21
-- added U+011C (upper case G circumflex) - Issue #21
-- added U+011D (lower case g circumflex) - Issue #21
-- added U+0124 (upper case H circumflex) - Issue #21
-- added U+0125 (lower case h circumflex) - Issue #21
-- added U+0134 (upper case J circumflex) - Issue #21
-- added U+0135 (lower case j circumflex) - Issue #21
-- added U+015C (upper case S circumflex) - Issue #21
-- added U+015D (lower case s circumflex) - Issue #21
-- added U+016C (upper case U breve) - Issue #21
-- added U+016D (lower case u breve) - Issue #21
-- added U+20B7 (spesmilo) - Issue #21
-- updated ttfautohint to version 1.4 for TrueType (.ttf) build instruction sets
-
-
-# Version 2.015 (release build)
-
-ttf, otf, webfont builds
-
-Changes vs. release v2.013:
-
-- new vertical metrics = decreased line spacing height - Issues #28, #32, #39, #41, #95, #103
-- adjusted vertical position of the colon to a higher position, improves alignment with other punctuation glyphs (U+003A) - Issue #66
-- changed vertical position of the dash (U+002D) so that regular and oblique, bold and bold oblique are properly aligned - Issue #107
-- updated hinting algorithm for bold set (improved point position over stem of lowercase j/i for some text sizes) - Issue #84
-- underscore (U+005F) centered, increased width, increased height & aligned vertical position closer to baseline - Issues #97, #98, #100, 103,
-- increased vertical position of dieresis mark on lowercase u dieresis (U+00FC) - Issue #61
-- increased vertical position of dieresis mark on lowercase i dieresis (U+00EF)
-- increased vertical position of dieresis mark on lowercase e dieresis (U+00EB)
-- decreased vertical position of the asterisk (U+002A) - Issue #34
-- new design for ascii tilde - broader curves, taller glyph with goal to improve appearance at small text sizes where it tended to render like a dash (U+007E) - Issue #37
-- new ttf build autohinting script (./postbuild_processing/tt-hinting/autohint.sh)
-- new ttf build autohinting Control Instructions File - bold set (./postbuild_processing/tt-hinting/Hack-Bold-TA.txt)
-- new ttf build release script (./postbuild_processing/tt-hinting/release.sh)
-- new web font release script (./postbuild_processing/webfonts/releasewebfonts.sh)
-- new vfb to UFO source file conversion script (./tools/makeufo.sh)
-- new UFO source file types - includes separate source files for TrueType (`*-TT.ufo`) and PostScript (`*-PS.ufo`) releases
-- source file path changes: now includes separate `ufo` and `vfb` directories under the `./source` repository directory
-- Hack Open Font license updated to version 2.0. The license changes better define the Hack project as a derivative project of the Bitstream Vera Sans Mono typeface project and are intended to make the license more consistent with the Bitstream Vera libre, open source license under which Hack is co-licensed. There are no new restrictions on use of the fonts with these license changes. Embedding permissions are made explicit in this version of the Hack Open Font license.
-
-
-# Version 2.014 (testing build)
-
-- ttf only build for testing
-- updated hinting algorithm for bold set (corrected incorrect point position of lowercase j/i at some sizes) - Issue #84
-- adjusted vertical metrics - Issues #28, #32, #39, #41, #95, #103
-- centered, increased width, & adjusted vertical position of underscore - Issues #97, #98, #100, 103,
-- increased vertical position of dieresis mark on lowercase u dieresis (U+00FC) - Issue #61
-- increased vertical position of dieresis mark on lowercase i dieresis (U+00EF)
-- increased vertical position of dieresis mark on lowercase e dieresis (U+00EB)
-- decreased vertical position of the asterisk (U+002A) - Issue #34
-- new design for ascii tilde (U+007E) - Issue #37
-
-
-# Version 2.013 (release build)
-
-ttf, otf, webfont builds
-
-Changes vs. release v2.010
-
-- Fixed missing middle dot glyph (U+00B7), adjusted width of U+00B7 em box to address spacing issues in editors that highlight empty spaces (Issues #27 & 46)
-- Powerline glyph alignment and size adjustments (Issue #33)
-- Fixed name tables to address:
- - incorrect oblique rendering with Java type renderers on OS X (Issue #26)
- - incorrect italic + bold + bold oblique rendering in some syntax highlighters (Issues #42, #50, #60)
- - backslash character took inappropriate vertical alignment because of incorrect slant angle in some editors (Issue #67)
-- Changed oblique and bold oblique font names to "Hack Italic" and "Hack Bold Italic" to address Windows listings
-- Changed oblique and bold oblique webfont names to "hack-italic-webfont.[xxx]" and "hack-bolditalic-webfont.[xxx]"
-- Changed oblique and bold oblique basic Latin + Latin-1 webfont subsets to the names "hack-italic-latin-webfont.[xxx]" and "hack-bolditalic-latin-webfont.[xxx]"
-- Changed license name from "Modified SIL Open Font License" to "Hack Open Font License" to comply with SIL regulations for SIL Open Font License modifications
-- Removed all license references to SIL to comply with SIL regulations for modifications of the SIL Open Font License
-- Removed SIL Open Font License preamble from the Hack Open Font License to comply with SIL regulations for modifications of the SIL Open Font License
-- Removed the following statement from Hack Open Font License condition #3: "This restriction only applies to the primary font name as presented to the users." to address a reserved font name conflict with the Bitstream Vera license
-- Modified the build directory structure for the Hack web fonts
-- Added Hack webfont CSS files to the build directory
-
-# Version 2.012 (testing build)
-
-- ttf only build for testing
-- Powerline glyph alignment and size adjustments (Issue #33)
-- Fixed name tables to address:
- - incorrect oblique rendering with Java type renderers on OS X (Issue #26)
- - incorrect italic + bold + bold oblique rendering in some syntax highlighters (Issues #42, #50, #60)
- - backslash character took inappropriate vertical alignment because of incorrect slant angle in some editors (Issue #67)
-
-# Version 2.011 (testing build)
-
-- ttf only build for testing
-- fixed missing middle dot glyph (U+00B7), adjusted width of U+00B7 em box to address spacing issues in editors that highlight empty spaces (Issues 27 & 46)
-
-
-# Version 2.010
-
-### New Glyphs
-
-- New glyphs for Revised Western European (ISO-8859-15, Latin-9) character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for Central European (ISO-8859-2, Latin-2) character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for South European (ISO-8859-3, Latin-3) character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for Vietnamese character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for Pan African Latin character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for Cyrillic (ISO-8859-5) character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for Greek (ISO-8859-7) character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for Armenian character set (shapes from DejaVu Sans Mono typeface)
-- New glyphs for Georgian character set (shapes from DejaVu Sans Mono typeface)
-- New punctuation glyphs
-- New Powerline glyphs
-- New number glyphs
-- New scientific inferior numerals
-- New superscript numerals
-- New subscript numerals
-- New symbol glyphs
-- New **dotlessi**
-- New **iacute**
-- New **icircumflex**
-- New **idieresis**
-- New **igrave**
-- New **imacron**
-- New **iogonek**
-- New **itilde**
-- New **uppercase upsilon**
-- New **uppercase upsilon tonos**
-- New uni0069
-- New uni0457
-- New uni0458
-
-
-### Modified Glyphs
-
-##### Latin Character Set
-
-- Modified **uppercase Q** - added flared tail and modified tail angle
-- Modified **uppercase F** - central arm lowered to fill open gap at the base
-- Modified **lowercase a** - added curved tail/spur
-- Modified **lowercase b** - decreased width of terminal, opened angle
-- Modified **lowercase d** - decreased width of terminal, opened angle
-- Modified **lowercase g** - decreased width of terminal, opened angle
-- Modified **lowercase i** - rounded corners of the dot, oriented dot position left of center relative to vertical stem, adjusted vertical position of the horizontal stem to x-height, lengthened the vertical stem to slightly overshoot baseline with the curved tail, decreased width of horizontal stem
-- Modified **lowercase j** - rounded corners of the dot, oriented dot position left of center relative to vertical stem
-- Modified **lowercase l** - lengthened the vertical stem to overshoot the baseline with the curved tail
-- Modified **lowercase m** - decreased width of terminal, opened angle
-- Modified **lowercase n** - decreased width of terminal, opened angle
-- Modified **lowercase p** - decreased width of terminal, opened angle
-- Modified **lowercase q** - decreased width of terminal, opened angle
-- Modified **lowercase r** - decreased width of terminal, opened angle
-- Modified **lowercase t** - added angle to the upper terminal, increased length of the vertical stem to allow the curved tail to slightly overshoot the baseline
-- Modified **lowercase y** - modified curves
-- Modified **0** - modified width and length of central oval fill, improved symmetry of the oval fill in all sets
-- Modified **2** - rounded the upper left corner of the base, decreased width of the spine of the hook
-- Modified **Abreve** - modified curves
-- Modified **Aogonek** - modified curve, decreased the width of the tail to meet typeface metrics
-- Modified **Eogonek** - modified tail curve
-- Modified **Iogonek** - modified tail curve
-- Modified **Itilde** - modified tilde curve
-- Modified **Ohorn** - modified horn curve
-- Modified **Oslash** - modified curves
-- Modified **Oslashacute** - modified curves
-- Modified **Otilde** - modified tilde curve
-- Modified **Racute** - modified bowl and leg curves
-- Modified **Rcaron** - modiifed bowl and leg curves
-- Modified **Rcommaaccent** - modified bowl and leg curves
-- Modified **Scommaaccent** - modified curves
-- Modified **Tcommaaccent** - modified comma accent curves
-- Modified **Ucircumflex** - modified curves
-- Modified **Udieresis** - modified curves
-- Modified **Ugrave** - modified curves
-- Modified **Uhorn** - modified curves
-- Modified **Uhungarumlaut** - modified curves
-- Modified **Umacron** - modified curves
-- Modified **Uogonek** - modified curves
-- Modified **Uring** - modified curves
-- Modified **Utilde** - modified curves
-- Modified **agrave** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **aacute** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **abreve** - decreased width of upper terminal to create an angled stem
-- Modified **acircumflex** - decreased width of terminal, opened angle
-- Modified **atilde** - decreased width of terminal, opened angle
-- Modified **adieresis** - decreased width of terminal, opened angle
-- Modified **amacron** - decreased width of upper terminal to create an angled stem
-- Modified **aring** - decreased width of terminal, opened angle
-- Modified **dcroat** - decreased width of terminal, opened angle
-- Modified **dcaron** - decreased width of lower terminal to create angled stem
-- Modified **ecaron** - modified curves
-- Modified **ecircumflex** - modified curves
-- Modified **edieresis** - modified curves
-- Modified **egrave** - modified curves
-- Modified **emacron** - modified curves
-- Modified **eogonek** - modified curves
-- Modified **gbreve** - modified curves of bowl and tail
-- Modified **gcaron** - modified curves of bowl and tail, decreased width of upper terminal to create angled stem
-- Modified **gcommaaccent** - modified curves of bowl and tail, decreased width of upper terminal to create angled stem
-- Modified **gdotaccent** - modified curves of bowl and tail, decreased width of upper terminal to create angled stem
-- Modified **hbar** - adjusted curves
-- Modified **dotlessi** - decreased width of horizontal stem
-- Modified **iacute** - decreased width of horizontal stem
-- Modified **icircumflex** - decreased width of horizontal stem
-- Modified **idieresis** - decreased width of horizontal stem
-- Modified **igrave** - decreased width of horizontal stem
-- Modified **imacron** - decreased width of horizontal stem
-- Modified **iogonek** - decreased width of horizontal stem
-- Modified **itilde** -decreased width of horizontal stem
-- Modified **nacute** - adjusted curves
-- Modified **ncaron** - adjusted curves
-- Modified **ncommaaccent** - adjusted curves
-- Modified **eng** - adjusted curves, decreased the upper terminal width to create an angled stem
-- Modified **nacute** - decreased width of upper terminal to create angled stem
-- Modified **ncaron** - decreased width of upper terminal to create angled stem
-- Modified **ncommaaccent** - decreased width of upper terminal to create angled stem
-- Modified **ntilde** - adjusted curves
-- Modified **ohorn** - adjusted curves
-- Modified **ohungarumlaut** - adjusted curves
-- Modified **omacron** - adjusted curves
-- Modified **oslash** - adjusted curves
-- Modified **oslashacute** - adjusted curves
-- Modified **otilde** - adjusted curves
-- Modified **racute** - adjusted curves, decreased width of upper terminal to create angled stem
-- Modified **rcaron** - adjusted curves, decreased width of upper terminal to create angled stem
-- Modified **rcommaaccent** - adjusted curves, decreased width of upper terminal to create angled stem
-- Modified **sacute** - adjusted curves
-- Modified **scedila** - adjusted curves
-- Modified **scommaaccent** - adjusted curves
-- Modified **lowercase t** - decreased length of the left terminal to angle the horizontal stem
-- Modified **tbar** - decreased length of the left terminal to angle the horizontal stem
-- Modified **tcaron** - decreased length of the left terminal to angle the horizontal stem
-- Modified **tcommaaccent** - adjusted curves, decreased length of the left terminal to angle the horizontal stem
-- Modified **uhorn** - adjusted curves, decreased width of lower terminal to create angled stem
-- Modified **uhungarumlaut** - adjusted curves, decreased width of lower terminal to create angled stem
-- Modified **umacron** - adjusted curves, decreased width of lower terminal to create angled stem
-- Modified **uogonek** - adjusted curves, decreased width of lower terminal to create angled stem
-- Modified **uring** - adjusted curves, decreased width of lower terminal to create angled stem
-- Modified **utilde** - adjusted curves, decreased width of lower terminal to create angled stem
-- Modified **yacute** - adjusted curves
-- Modified **ycircumflex** - adjusted curves
-- Modified **ydieresis** - adjusted curves
-- Modified **ygrave** - adjusted curves
-- Modified **zdotaccent** - rounded corners of dot
-- Modified **gbreve** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **ntilde** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **ugrave** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **uacute** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **ucircumflex** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **udieresis** - decreased width of terminal, opened angle in regular and bold sets
-- Modified **exclamdown** - rounded corners of the dot
-- Modified **dieresis** - rounded corners
-- Modified **questionmarkdown** - rounded corners of the dot
-- Modified **ordfeminine** - decreased width of lower terminal on the a character to create angled stem
-- Modified **Adieresis** - rounded corners of dieresis component of glyph
-- Modified **Edieresis** - rounded corners of dieresis component of glyph
-- Modified **Idieresis** - rounded corners of dieresis component of glyph
-- Modified **Odieresis** - rounded corners of dieresis component of glyph
-- Modified **Udieresis** - rounded corners of dieresis component of glyph
-- Modified **Ydieresis** - rounded corners of dieresis component of glyph
-- Modified **adieresis** - rounded corners of dieresis component of glyph
-- Modified **edieresis** - rounded corners of dieresis component of glyph
-- Modified **idieresis** - rounded corners of dieresis component of glyph
-- Modified **odieresis** - rounded corners of dieresis component of glyph
-- Modified **udieresis** - rounded corners of dieresis component of glyph
-- Modified **ydieresis** - rounded corners of dieresis component of glyph
-- Modified **Idotaccent** - rounded corners of the dot
-- Modified **dotaccent** - rounded corners of the dot
-- Modified **ellipsis** - rounded corners of the dots
-- Modified **periodcentered** - rounded corners of the dot
-
-
-##### Greek Character Set
-
-- Modified **upsilondieresistonos** - adjusted vertical position to properly position on the baseline
-- Modified **iotadieresistonos** - adjusted vertical position to properly position on the baseline
-- Modified **eth** - altered curve of the neck
-- Modified **uppercase eta** - modified the curves
-- Modified **uppercase theta** - modified the curves
-- Modified **uppercase omicron** - modified the curves
-- Modified **uppercase rho** - modified the curves
-- Modified **uppercase psi** - modified the curves
-- Modified **uppercase upsilon** - new glyph style (change from Latin Y shape)
-- Modified **uppercase omega** - modified the curves
-- Modified **uppercase alphatonos** - adjusted right and left sidebearings, corrected position of the tonos symbol
-- Modified **uppercase epsilontonos** - adjusted right and left sidebearings, corrected position of the tonos symbol
-- Modified **uppercase etatonos** - adjusted right and left sidebearings, corrected position of the tonos symbol
-- Modified **uppercase iotatonos** - adjusted right and left sidebearings, corrected position of the tonos symbol
-- Modified **uppercase omicrontonos** - adjusted right and left sidebearings, corrected position of the tonos symbol
-- Modified **uppercase upsilontonos** - adjusted right and left sidebearings, corrected position of the tonos symbol
-- Modified **uppercase omegatonos** - adjusted right and left sidebearings, corrected position of the tonos symbol
-- Modified **uppercase iotadieresis** - rounded the dieresis points
-- Modified **uppercase upsilondieresis** - new upsilon shape, rounded the dieresis points
-- Modified **lowercase alpha** - adjusted curves
-- Modified **lowercase beta** - adjusted curves
-- Modified **lowercase gamma** - adjusted curves
-- Modified **lowercase delta** - adjusted curves
-- Modified **lowercase epsilon** - adjusted curves
-- Modified **lowercase zeta** - adjusted curves
-- Modified **lowercase eta** - decreased width of the top terminal to create angled stem, adjusted curves
-- Modified **lowercase theta** - adjusted curves
-- Modified **lowercase iota** - adjusted curves
-- Modified **lowercase lambda** - adjusted curves
-- Modified **lowercase mu** - adjusted curves
-- Modified **lowercase nu** - adjusted curves
-- Modified **lowercase xi** - adjusted curves
-- Modified **lowercase omicron** - adjusted curves
-- Modified **lowercase pi** - adjusted curves
-- Modified **lowercase rho** - adjusted curves
-- Modified **lowercase sigmafinal** - adjusted curves
-- Modified **lowercase sigma** - adjusted curves
-- Modified **lowercase tau** - adjusted curves
-- Modified **lowercase upsilon** - adjusted curves
-- Modified **lowercase phi** - adjusted curves
-- Modified **lowercase chi** - adjusted curves
-- Modified **lowercase psi** - adjusted curves
-- Modified **lowercase omega** - adjusted curves
-- Modified **lowercase iotatonos** - adjusted curves
-- Modified **lowercase iotadieresis** - rounded points of the dieresis, adjusted curves
-- Modified **iotadieresistonos** - rounded corners of points of dieresis mark, appropriately positioned tonos mark, adjusted curves
-- Modified **lowercase upsilontonos** - adjusted curves
-- Modified **lowercase upsilondieresis** - rounded points of dieresis mark, adjusted curves
-- Modified **upsilondieresistonos** - rounded corners of points of dieresis mark, appropriately positioned tonos mark, adjusted curves
-- Modified **lowercase omicrontonos** - adjusted curves
-- Modified **lowercase omegatonos** - adjusted curves
-- Modified **lowercase alphatonos** - adjusted curves
-- Modified **lowercase epsilontonos** - adjusted curves
-- Modified **lowercase etatonos** - decreased width of top terminal to create angled stem, adjusted curves
-
-
-##### Cyrillic Character Set
-
-- Modified curves in uni0411, uni0412, uni0401, uni0417, uni041B, uni041E, uni0420, uni0421, uni0423, uni040E, uni0424, uni0427, uni042F, uni042C, uni042A, uni042B, uni0409, uni040A, uni0405, uni0404, uni042D, uni0408, uni040B, uni042E, uni0402, uni0462, uni0472, uni0494, uni0498, uni04AA, uni04BA, uni04CB, uni04D0, uni04D2, uni04D6, uni04D8, uni04DA, uni04DC, uni04DE, uni04E0, uni04E4, uni04E6, uni04E8, uni04EA, uni04EC, uni04EE, uni04F0, uni04F2, uni04F4, uni04F8, uni0510, uni051A, uni0430, uni0431, uni0432, uni0434, uni0435, uni0450, uni0451, uni0437, uni0439, uni043B, uni043E, uni0440, uni0441, uni0443, uni045E, uni0444, uni0447, uni044F, uni044C, uni044A, uni044B, uni0459, uni045A, uni0455, uni0454, uni044D, uni0456, uni0457, uni0458, uni045B, uni044E, uni0452, uni0463, uni0473, uni0499, uni04AB, uni04BB, uni04CC, uni04D1, uni04D3, uni04D7, uni04D9, uni04DB, uni04DD, uni04DF, uni04E1, uni04E5, uni04E7, uni04E9, uni04EB, uni04ED, uni04EF, uni04F1, uni04F3, uni04F5, uni04F9, uni0511, uni051B, uni04D5
-- Rounded corners of points of dieresis marks in uni0401, uni0407, uni04D2, uni04DA, uni04DC, uni04DE, uni04E4, uni04E6, uni04EA, uni04EC, uni04F0, uni04F4, uni04F8, uni0451, uni0457, uni04D3, uni04DB, uni04DD, uni04DF, uni04E5, uni04E7, uni04EB, uni04ED, uni04F1, uni04F5, uni04F9
-- Rounded corners of dots in uni0456, uni0458
-- Modified **lowercase i** glyphs (uni0456, uni0457) so that they are consistent with the shape of the Hack Latin lowercase i
-- Modified **uni0430** - decreased width of lower terminal to create angle
-- Modified **uni0440** - decreased width of upper terminal to create angle
-- Modified **uni04D1** - decreased width of lower terminal to create angle
-- Modified **uni04D3** - decreased width of lower terminal to create angle
-- Modified **uni051B** - decreased width of upper terminal to create angle
-- Numerous metrics changes to better align the Cyrillic glyphs in a fixed width format
-
-##### Armenian Character Set
-
-- Modified curves in uni0531, uni0532, uni0533, uni0534, uni0535, uni0536, uni0538, uni0539, uni053A, uni053B, uni053D, uni053E, uni053F, uni0540, uni0541, uni0542, uni0543, uni0544, uni0545, uni0546, uni0547, uni0548, uni0549, uni054A, uni054B, uni054C, uni054D, uni054E, uni054F, uni0550, uni0551, uni0553, uni0554, uni0555, uni0556, uni0561, uni0562, uni0563, uni0564, uni0565, uni0566, uni0568, uni0569, uni056A, uni056B, uni056D, uni056E, uni056F, uni0570, uni0571, uni0572, uni0573, uni0574, uni0575, uni0576, uni0577, uni0578, uni0579, uni057A, uni057B, uni057C, uni057D, uni057E, uni057F, uni0580, uni0581, uni0583, uni0584, uni0585, uni0586, uni0587
-- Modified **uni0563** - decreased width of the upper terminal to create angle
-- Modified **uni0564** - decreased width of the upper terminal to create angle
-- Modified **uni0566** - decreased width of the upper terminal to create angle
-- Modified **uni0568** - decreased width of the upper terminal to create angle
-- Modified **uni0569** - decreased width of the upper terminal to create angle
-- Modified **uni0572** - decreased width of the upper terminal to create angle
-- Modified **uni0573** - decreased width of the upper terminal to create angle
-- Modified **uni0574** - decreased width of the upper terminal to create angle
-- Modified **uni0576** - decreased width of the upper terminal to create angle
-- Modified **uni0578** - decreased width of the upper terminal to create angle
-- Modified **uni057C** - decreased width of the upper terminal to create angle
-- Modified **uni057D** - decreased width of the upper terminal to create angle
-- Modified **uni0580** - decreased width of the upper terminal to create angle
-- Modified **uni0581** - decreased width of the upper terminal to create angle
-- Modified **uni0584** - decreased width of the upper terminal to create angle
-
-
-##### Georgian Character Set
-
-- Modified curves in uni10D0, uni10D1, uni10D2, uni10D3, uni10D4, uni10D5, uni10D6, uni10D7, uni10D8, uni10D9, uni10DA, uni10DB, uni10DC, uni10DD, uni10DE, uni10DF, uni10E0, uni10E1, uni10E2, uni10E3, uni10E4, uni10E5, uni10E6, uni10E7, uni10E8, uni10E9, uni10EA, uni10EB, uni10EC, uni10ED, uni10EE, uni10EF, uni10F0, uni10F1, uni10F2, uni10F3, uni10F4, uni10F5, uni10F6, uni10F7, uni10F8, uni10F9, uni10FA, uni10FC, uni055C, uni055E
-- Rounded corners of points in uni10FB, uni0589
-
-
-##### Punctuation Character Set
-
-- Modified curves in uni2047, questiondown, uni203D, uni203F, uni2048, uni2049, uni204B, uni2E18, uni2E1F, uni2E2E, uni2E18.case, questiondown.case, uni208E, uni207E, uni2768, uni2769, uni276B, uni27C5, uni27C6, uni2987, uni2988, uni055C, uni055E, uni061F, H18533, circle, uni25EF, uni25D0, uni25D1, uni25D2, uni25D3, uni25D6, uni25D7, uni25D4, uni25D5, uni25F4, uni25F5, uni25F6, uni25F7, uni25CD, uni25C9, uni25CE, openbullet, invbullet, invcircle, uni25DA, uni25DB, uni25E0, uni25E1, uni25DC, uni25DD, uni25DE, uni25DF, ampersand, copyright, registered, section, degree
-- Modified **dong** - decreased width of the lower terminal to create an angled stem
-- Modified **uni20A5** - decreased width of the upper terminal to create an angled stem
-- Modified **uni225D** - decreased width of the lower terminal on the d character to create an angled stem
-- Modified **uni225E** - decreased width of the upper terminal to create an angled stem
-
-
-##### Symbol Character Set
-
-- Modified curves in cent, colonmonetary, dong, euro, florin, lira, peseta, sterling, uni0E3F, uni20A0, uni20A2, uni20A5, uni20A8, uni20AA, uni20AF, uni20B0, uni20B1, uni20B2, uni20B4, uni20B5, uni20B9, approxequal, asciitilde, circlemultiply, circleplus, congruent, element, emptyset, infinity, integral, integralbt, integraltp, intersection, notelement, notsubset, partialdiff, percent, perthousand, propersubset, propersuperset, proportional, reflexsubset, reflexsuperset, similar, suchthat, therefore, uni2031, uni2126, uni2201, uni220A, uni220C, uni220D, uni2218, uni221B, uni222C, uni222D, uni2235, uni2236, uni2237, uni2238, uni2239, uni223A, uni223B, uni223D, uni2241, uni2242, uni2243, uni2244, uni2246, uni2247, uni2249, uni224A, uni224B, uni224C, uni224E, uni224F, uni2250, uni2251, uni2252, uni2253, uni2254, uni2255, uni2256, uni2257, uni2258, uni225D, uni225E, uni225F, uni2272, uni2273, uni2274, uni2275, uni227C, uni227D, uni227E, uni227F, uni2285, uni2288, uni2289, uni228B, uni228D, uni2296, uni2298, uni2299, uni229A, uni229B, uni229C, uni229D, uni22B8, uni22CD, uni22D0, uni22D1, uni22DE, uni22DF, uni22E0, uni22E1, uni22E6, uni22E7, uni22E8, uni22E9, uni22EF, uni23A8, uni23AC, uni27DC, uni2A00, uni2A6A, uni2A6B, union, uni219C, uni219D, uni21AD, uni21A9, uni21AA, uni21AB, uni21AC, uni21B6, uni21B7, uni21BA, uni21BB, uni21F4, H18533, circle, uni25EF, uni25D0, uni25D1, uni25D2, uni25D3, uni25D6, uni25D7, uni25D4, uni25D5, uni25F4, uni25F5, uni25F6, uni25F7, uni25CD, uni25C9, uni25CE, openbullet, invbullet, invcircle, uni25DA, uni25DB, uni25E0, uni25E1, uni25DC, uni25DD, uni25DE, uni25DF, at, ampersand, copyright, registered, section, degree, uni0606, uni03F6
-
-### Metrics Changes
-
-- Changed line gap / typo line gap to 275 units
-- Modified **uppercase P** - increased right sidebearing to equal sidebearing of uppercase O glyph
-- Modified **uppercase Z** - changed to right = left sidebearing (shifts orientation to left) for regular, bold, oblique sets
-- Modified **uppercase Z** - reduced left sidebearing for bold oblique set, not necessary to make this equal as with above sets
-- Modified **lowercase a** - reduced left sidebearing
-- Modified **lowercase c** - reduced left sidebearing
-- Modified **lowercase e** - increased left sidebearing
-- Modified **lowercase g** - increased left sidebearing
-- Modified **lowercase i** - increased left sidebearing
-- Modified **lowercase j** - increased left sidebearing
-- Modified **lowercase k** - reduced left sidebearing
-- Modified **lowercase r** - reduced left sidebearing
-- Modified **3** - increased left sidebearing
-- Modified **Zacute** - centered glyph (reduced left sidebearing, increased right sidebearing)
-- Modified **Zcaron** - centered glyph (reduced left sidebearing, increased right sidebearing)
-- Modified **Zdotaccent** - centered glyph (reduced left sidebearing, increased right sidebearing)
-- Modified **aacute** - increased left sidebearing
-- Modified **abreve** - increased left sidebearing
-- Modified **acircumflex** - increased left sidebearing
-- Modified **adieresis** - increased left sidebearing
-- Modified **agrave** - increased left sidebearing
-- Modified **amacron** - increased left sidebearing
-- Modified **aogonek** - increased left sidebearing
-- Modified **aring** - increased left sidebearing
-- Modified **atilde** - increased left sidebearing
-- Modified **kcommaaccent** - decreased left sidebearing
-- Modified **racute** - decreased left sidebearing
-- Modified **rcaron** - decreased left sidebearing
-- Modified **rcommaaccent** - decreased left sidebearing
-- Mofified **Mu** - increased left sidebearing
-- Modified **Zeta** - reduced left sidebearing to center the glyph
-- Modified **Rho** - reduced left sidebearing
-- Modified **Phi** - increased left sidebearing
-- Modified **left guillemet** - increased right sidebearing
-- Modified **right guillemet** - increased left sidebearing
-- Modified **left brace** - increased right sidebearing
-- Modified **right brace** - increased left sidebearing
-- Modified **left bracket** - increased right sidebearing
-- Modified **right bracket** - increased left sidebearing
-- Modified **left parenthesis** - increased right sidebearing
-- Modified **right parenthesis** - increased left sidebearing
-- Adjusted spacing on all diacritic marks in the regular, bold, oblique, and bold oblique set
-
-### True Type Instructions / PostScript Hinting
-
-- New TrueType instructions / PostScript hinting across the entire glyph set
-
-### Removed
-
-- Removed **fi** and **fl** ligatures. Spacing issues that require these ligatures are not present in this monospaced typeface
-
-
-# Version 1.3
-
-### Modified Glyphs
-
-- Curve adjustments & curve smoothing across all glyphs in the font collection
-- hinting improvements
-
-### Build Files
-
-- New binary build system - should result in improved cross-platform compatibility for font binaries
-
-
-# Version 1.2
-
-### Modified Glyphs
-
-- Modified **lowercase i** glyph. Removed serif and added curved tail
-- Modified **hyphen** glyph. Widened
-- Modified **zero** glyph. Adjusted alignment and shape of the oval fill
-- Modified **left parenthesis** glyph. Increased right sidebearing length
-- Modified **right parenthesis** glyph. Increased left sidebearing length
-
-### Source
-
-- Converted to UFO formatted source
-
-
-# Version 1.0.1
-
-- Modified the SIL license to permit dual licensing with the Bitstream Vera license. This modification removed the stipulation that multiple licenses are not possible (preamble and section #5) and was intended to create the new Reserved Font Name Hack for this typeface modification and preserve the right (for myself and others) to define Reserved Font Names for all future fonts derived from this typeface. There are no other modifications to either license under which this font is released.
-- This release did not introduce changes to the glyphs included in the typeface
-
-
-# Version 1.0.0
-- Branched Bitstream Vera Sans Mono 1.10 release
-
-## Changes
-
-### New Glyphs
-
-- New **exclamation point** glyph. Circular full stop point, tapered line, increased weight relative to other characters.
-- New **asterisk** glyph. Glyph shape from Source Code Pro. Modified vertical position of the glyph to orient closer to the ascender.
-- New **period** glyph. Circular full stop point, modified from square glyph.
-- New **comma** glyph. Rounded comma shape from Source Code Pro, modified from square glyph.
-- New **colon** glyph. Circular colon points, modified from square points.
-- New **semicolon** glyph. Circular point and rounded comma shape from Source Code Pro, increased vertical spacing between the shapes
-
-
-### Modified Glyphs
-- Modified **percent** glyph. Increased line length and added vertical line ends.
-- Modified **zero** glyph. Changed circular fill to oval fill.
-- Modified **left square bracket** glyph. Increased height of the glyph.
-- Modified **right square bracket** glyph. Increased height of the glyph.
-- Modified **left curly bracket** glyph. Modified vertical position, increased length of the horizontal stem, decreased left sidebearing
-- Modified **right curly bracket** glyph. Modified vertical position, increased length of the horizontal stem, decreased right sidebearing
-- Modified **question mark** glyph. Changed square full stop point to circular full stop point.
-- Modified **hyphen** glyph. Raised vertical alignment to center `->` character combinations.
-
-### Font Styles
-- **Regular** - includes all changes indicated above
-- **Regular Oblique** - includes all changes indicated above
-- **Bold** - includes all changes indicated above
-- **Bold Oblique** - includes all changes indicated above
-
-
diff --git a/deps/hack-font-ttf/LICENSE.md b/deps/hack-font-ttf/LICENSE.md
deleted file mode 100644
index e9fc8a1..0000000
--- a/deps/hack-font-ttf/LICENSE.md
+++ /dev/null
@@ -1,64 +0,0 @@
-## License
-
-Hack Copyright 2015, Christopher Simpkins with Reserved Font Name "Hack".
-
-Bitstream Vera Sans Mono Copyright 2003 Bitstream Inc. and licensed under the Bitstream Vera License with Reserved Font Names "Bitstream" and "Vera"
-
-DejaVu modifications of the original Bitstream Vera Sans Mono typeface have been committed to the public domain.
-
-
-
-This Font Software is licensed under the Hack Open Font License v2.0 and the Bitstream Vera License.
-
-These licenses are copied below.
-
-
-### Hack Open Font License v2.0
-
-(Version 1.0 - 06 September 2015)
-
-(Version 2.0 - 27 September 2015)
-
-Copyright 2015 by Christopher Simpkins. All Rights Reserved.
-
-DEFINITIONS
-
-"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
-
-PERMISSION AND CONDITIONS
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated source code, documentation, and binary files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, study, copy, merge, embed, modify, redistribute, and/or sell modified or unmodified copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
-
-(1) The above copyright notice and this permission notice shall be included in all modified and unmodified copies of the Font Software typefaces. These notices can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
-
-(2) The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word "Hack".
-
-(3) Neither the Font Software nor any of its individual components, in original or modified versions, may be sold by itself.
-
-TERMINATION
-
-This license becomes null and void if any of the above conditions are not met.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
-
-Except as contained in this notice, the names of Christopher Simpkins and the Author(s) of the Font Software shall not be used to promote, endorse or advertise any modified version, except to acknowledge the contribution(s) of Christopher Simpkins and the Author(s) or with their explicit written permission. For further information, contact: chris at sourcefoundry dot org.
-
-
-
-### BITSTREAM VERA LICENSE
-
-Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
-
-The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces.
-
-The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera".
-
-This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names.
-
-The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
-
-Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.
diff --git a/deps/hack-font-ttf/hack-font-ttf.SlackBuild b/deps/hack-font-ttf/hack-font-ttf.SlackBuild
deleted file mode 100755
index 80e0606..0000000
--- a/deps/hack-font-ttf/hack-font-ttf.SlackBuild
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/sh
-
-# Copyright 2016 Eric Hameleers, Eindhoven, NL
-# Copyright 2016 Patrick J. Volkerding, Sebeka, MN USA
-# All rights reserved.
-#
-# Permission to use, copy, modify, and distribute this software for
-# any purpose with or without fee is hereby granted, provided that
-# the above copyright notice and this permission notice appear in all
-# copies.
-#
-# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
-# 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.
-# -----------------------------------------------------------------------------
-
-
-PKGNAM=hack-font-ttf
-SRCNAM=Hack
-VERSION=${VERSION:-"2.020"}
-SRCVER=$(echo $VERSION |tr . _)
-ARCH=noarch
-BUILD=${BUILD:-1}
-
-CWD=$(pwd)
-TMP=${TMP:-/tmp}
-PKG=$TMP/package-$PKGNAM
-
-rm -rf $PKG
-mkdir -p $TMP $PKG
-
-# Font directory location depends on the X build prefix:
-# Determine what X we're running (the modular X returns the prefix
-# in the next command, while older versions stay silent):
-XPREF=$(pkg-config --variable=prefix x11)
-if [ "$XPREF" = "" ]; then
- XPREF='/usr/X11R6'
- FONTDIR="$XPREF/lib/X11/fonts/TTF"
-else
- FONTDIR="/usr/share/fonts/TTF"
-fi
-mkdir -p $PKG$FONTDIR
-
-# Install the TTF fonts:
-cd $PKG$FONTDIR/
-tar xvf $CWD/${SRCNAM}-v${SRCVER}-ttf.tar.xz || exit 1
-chown -R root:root .
-chmod 644 $PKG$FONTDIR/*
-
-# Post-install script:
-mkdir -p $PKG/install
-cat << EOT > $PKG/install/doinst.sh
-# Update X font indexes and the font cache:
-if [ -x .$XPREF/bin/mkfontdir ]; then
- chroot . $XPREF/bin/mkfontscale $FONTDIR
- chroot . $XPREF/bin/mkfontdir $FONTDIR
-fi
-if [ -x .$XPREF/bin/fc-cache ]; then
- chroot . $XPREF/bin/fc-cache $FONTDIR
-fi
-EOT
-
-# Add documentation:
-mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
-cp -a \
- $CWD/CHANGELOG.md $CWD/LICENSE.md $CWD/README.md \
- $PKG/usr/doc/$PKGNAM-$VERSION
-find $PKG/usr/doc -type f -exec chmod 644 {} \;
-
-# Add a package description:
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-# Build the package:
-cd $PKG
-/sbin/makepkg -l y -c n $TMP/${PKGNAM}-${VERSION}-${ARCH}-${BUILD}.txz
-
diff --git a/deps/hack-font-ttf/slack-desc b/deps/hack-font-ttf/slack-desc
deleted file mode 100644
index 03c97d1..0000000
--- a/deps/hack-font-ttf/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description. Line
-# up the first '|' above the ':' following the base package name, and the '|'
-# on the right side marks the last column you can put a character in. You must
-# make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':'.
-
- |-----handy-ruler------------------------------------------------------|
-hack-font-ttf: hack-font-ttf (TrueType font based on Bitstream Vera Mono)
-hack-font-ttf:
-hack-font-ttf: Hack is a typeface designed for writing source code.
-hack-font-ttf: It expands upon the contributions of the Bitstream Vera
-hack-font-ttf: & DejaVu projects.
-hack-font-ttf: Hack includes monospaced regular, bold, oblique, and bold oblique
-hack-font-ttf: sets to cover all of your syntax highlighting needs.
-hack-font-ttf:
-hack-font-ttf:
-hack-font-ttf: hack-font-ttf home: http://sourcefoundry.org/hack/
-hack-font-ttf:
diff --git a/deps/mlt/mlt.SlackBuild b/deps/mlt/mlt.SlackBuild
index 361bcae..e6139cb 100755
--- a/deps/mlt/mlt.SlackBuild
+++ b/deps/mlt/mlt.SlackBuild
@@ -28,7 +28,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PKGNAM=mlt
VERSION=${VERSION:-6.20.0}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
PYTHONSITEPKG=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
@@ -84,6 +84,10 @@ rm -rf $PKGNAM-$VERSION
tar xvf $CWD/$PKGNAM-$VERSION.tar.?z* || exit 1
cd $PKGNAM-$VERSION || exit 1
+# Apply patches:
+# Make mlt compile against Qt 5.15:
+cat $CWD/patches/mlt_qt515.patch | patch -p1 --verbose || exit 1
+
# Fix bogus permissions:
chown -R root:root .
find . \
diff --git a/deps/mlt/patches/mlt_qt515.patch b/deps/mlt/patches/mlt_qt515.patch
new file mode 100644
index 0000000..edc1837
--- /dev/null
+++ b/deps/mlt/patches/mlt_qt515.patch
@@ -0,0 +1,49 @@
+From f58b44d73442986eeffec7431e59b7d19d214c1b Mon Sep 17 00:00:00 2001
+From: Heiko Becker <heirecka@exherbo.org>
+Date: Tue, 24 Mar 2020 21:17:05 +0100
+Subject: [PATCH] Fix build with Qt 5.15.0
+
+QPainterPath is no longer included via qtransform.h (since
+5.15.0-beta2, 50d2acdc93b4de2ba56eb67787e2bdcb21dd4bea in qtbase.git).
+---
+ src/modules/qt/filter_qtext.cpp | 1 +
+ src/modules/qt/graph.cpp | 1 +
+ src/modules/qt/producer_qtext.cpp | 1 +
+ 3 files changed, 3 insertions(+)
+
+diff --git a/src/modules/qt/filter_qtext.cpp b/src/modules/qt/filter_qtext.cpp
+index c3de1fadc..c3e10f1a3 100644
+--- a/src/modules/qt/filter_qtext.cpp
++++ b/src/modules/qt/filter_qtext.cpp
+@@ -21,6 +21,7 @@
+ #include <framework/mlt.h>
+ #include <framework/mlt_log.h>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QString>
+
+ static QRectF get_text_path( QPainterPath* qpath, mlt_properties filter_properties, const char* text, double scale )
+diff --git a/src/modules/qt/graph.cpp b/src/modules/qt/graph.cpp
+index 6d4d669ca..7e91bb12f 100644
+--- a/src/modules/qt/graph.cpp
++++ b/src/modules/qt/graph.cpp
+@@ -18,6 +18,7 @@
+ */
+
+ #include "graph.h"
++#include <QPainterPath>
+ #include <QVector>
+ #include <math.h>
+
+diff --git a/src/modules/qt/producer_qtext.cpp b/src/modules/qt/producer_qtext.cpp
+index 603c2b780..ff95a8e26 100644
+--- a/src/modules/qt/producer_qtext.cpp
++++ b/src/modules/qt/producer_qtext.cpp
+@@ -26,6 +26,7 @@
+ #include <QImage>
+ #include <QColor>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QFont>
+ #include <QString>
+ #include <QTextCodec>
diff --git a/deps/noto-cjk-font-ttf/.url b/deps/noto-cjk-font-ttf/.url
deleted file mode 100644
index 3314f59..0000000
--- a/deps/noto-cjk-font-ttf/.url
+++ /dev/null
@@ -1 +0,0 @@
-https://github.com/googlefonts/noto-cjk/archive/NotoSansV2.001.tar.gz
diff --git a/deps/noto-cjk-font-ttf/70-noto-cjk.conf b/deps/noto-cjk-font-ttf/70-noto-cjk.conf
deleted file mode 100644
index c1052bb..0000000
--- a/deps/noto-cjk-font-ttf/70-noto-cjk.conf
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
-<fontconfig>
- <match target="pattern">
- <test name="lang">
- <string>ja</string>
- </test>
- <test name="family">
- <string>serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Serif CJK JP</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>ko</string>
- </test>
- <test name="family">
- <string>serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Serif CJK KR</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>zh-cn</string>
- </test>
- <test name="family">
- <string>serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Serif CJK SC</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>zh-tw</string>
- </test>
- <test name="family">
- <string>serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Serif CJK TC</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>ja</string>
- </test>
- <test name="family">
- <string>sans-serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans CJK JP</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>ko</string>
- </test>
- <test name="family">
- <string>sans-serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans CJK KR</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>zh-cn</string>
- </test>
- <test name="family">
- <string>sans-serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans CJK SC</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>zh-tw</string>
- </test>
- <test name="family">
- <string>sans-serif</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans CJK TC</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>ja</string>
- </test>
- <test name="family">
- <string>monospace</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans Mono CJK JP</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>ko</string>
- </test>
- <test name="family">
- <string>monospace</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans Mono CJK KR</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>zh-cn</string>
- </test>
- <test name="family">
- <string>monospace</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans Mono CJK SC</string>
- </edit>
- </match>
-
- <match target="pattern">
- <test name="lang">
- <string>zh-tw</string>
- </test>
- <test name="family">
- <string>monospace</string>
- </test>
- <edit name="family" mode="prepend">
- <string>Noto Sans Mono CJK TC</string>
- </edit>
- </match>
-</fontconfig>
diff --git a/deps/noto-cjk-font-ttf/HISTORY b/deps/noto-cjk-font-ttf/HISTORY
deleted file mode 100644
index 6149710..0000000
--- a/deps/noto-cjk-font-ttf/HISTORY
+++ /dev/null
@@ -1,321 +0,0 @@
--------------------
-Prior Release Notes
--------------------
-
-Noto Sans CJK 2.000 Release Notes
-==================================
-
-19 November 2018
-
-This is an update to Noto Sans CJK.
-
-Changes
-Version 2.000
-Build Date: November 2, 2018. Built By: Dr. Ken Lunde (小林劍󠄁). Release Date: November 19, 2018.
-Compared to the previous release—Version 1.004 that was released on 2015-06-16—a large number of chang- es were made, far too many to list here. Listed below are some of the more significant changes that were made in this release:
-• A second flavor of Traditional Chinese, for Hong Kong and supporting the HKSCS-2016 standard, was add- ed, which increased the total number of font resources by 16, from 72 to 88.
-• 155 new mappings have been added to the CMap resources. 66 are from BMP code points, 22 are from Plane 1 code points, and the remaining 67 are from Plane 2 code points. Among the 67 new Plane 2 code points, 57 are from Extension B, two are from Extension C, three are from Extension E, and the remaining five are from Extension F.
-• As a result of removing approximately 1,750 glyphs in order to make room for approximately 1,750 new glyphs, the CID assignments of the glyphs necessarily—and drastically—changed. The CID assignments of exactly 200 glyphs are unchanged from Version 1.004: 0–107, 2570–2633, 47223–47232, 47262–47272, 47281–47286, and 65484.
-• The Traditional Chinese form of the Radical #162 辶 component was improved.
-• The URO is complete up through U+9FEF (Unicode Version 11.0).
-• The glyphs for some of the kana were tweaked.
-• The glyphs and support for bopomofo, along with their tone marks, were improved. This involved adding the 'GDEF' (Glyph Definition) table, the 'mark' (Mark Positioning) GPOS feature, and the 'ruby' (Ruby Nota- tion Forms) GSUB feature.
-• The language and script declarations in the 'locl' and 'vert' GSUB features were improved.
-• The 13-page glyph synopsis PDFs for the 500 pre-composed high-frequency hangul syllables have been incorporated into the Unicode-base glyph synopsis PDFs, and are bookmarked under the “Korean” book- mark.
-• Placeholder glyphs for U+32FF, uni32FF (CID+2184) and uni32FF-V (CID+65359), are included. This character has been reserved for the two-ideograph square ligature that represents the name of Japan’s forthcoming new era which starts on 2019-05-01, and will be the only character added in Unicode Version 12.1.
-• Like Source Han Serif, the CIDFont and CMap resources do not include XUID arrays.
-• Like Source Han Serif, there are no mappings for the range U+0000 through U+001F.
-• Like Source Han Serif, the code points that correspond to Halfwidth Jamo variants map to glyphs that cor- respond to code points in the Hangul Compatibility Jamo block. In other words, the glyphs for half-width jamo have been removed.
-• Like Source Han Serif, the 'name' table does not includes any Macintosh (PlatformID=1) strings.
-• Like Source Han Serif, the Regular weight is now style-linked to the Bold weight. This means that the Bold weight may not appear in the font menu, particularly when using applications that support style-linking as a way to make text bold.
-• Like Source Han Serif, the 'vert' GPOS feature is included.
-• Like Source Han Serif, the deprecated 'hngl' (Hangul) GSUB feature is not included in the Korean fonts and font instances.
-
-
-Known Issues
-Please report all issues in the GitHub repository so that they can be properly tracked and addressed, and for greater visibility among the user community. The Wiki also conveys some useful information about upcoming releases. Also, be sure to thoroughly check the closed issues prior to submitting a new issue, being sure to exercise the search feature.
-Because these fonts exercise several architectural limits, particularly the ones that include 65,535 glyphs, some environments may have difficulties using them properly, sometimes due to implementation limits or poor assumptions. If this is the case, please report such issues so that they can be recorded and tracked. You are also strongly encouraged to contact the developer of such environments to report the same.
-
-General
-• While not an issue per se, all of the fonts include placeholder (aka blank) glyphs for U+32FF, uni32FF (CID+2184) and uni32FF-V (CID+65359), which is the code point that has been reserved for the two-ideo- graph square ligature form of the name of Japan’s forthcoming new era that takes effect on 2019-05-01. U+32FF is expected to be included in Unicode Version 12.1. The purpose of including the placeholder glyphs is to facilitate a dot-release shortly after the official announcement of the era name is made.
-• The glyphs for the four CJK Unified Ideographs Extension G ideographs, which are made accessible via the 'ccmp' GSUB feature using their IDSes, will be mapped from the appropriate Plane 3 code points as soon as their code points have been deemed stable enough to implement.
-
-
-Noto Serif CJK 1.001 Release Notes
-==================================
-
-May 8, 2017
-
-This is an update to Noto Serif CJK 1.000. It was built by Dr. Ken Lunde (小林劍󠄁)
-on May 1, 2017 and released on May 8, 2017.
-
-
-General Notes
-
-• The OS/2.usWeightClass value for ExtraLight was changed from 250 to 200.
-See https://github.com/googlei18n/noto-cjk/issues/86/ .
-
-• Mappings for U+3164 and U+2D544 (Extension F) were added to all CMap resources,
-and the Adobe-Japan1 IVS <U+2D544,U+E0100> was added to the Japanese IVS definition
-file, SourceHanSerif_JP_sequences.txt.
-See https://github.com/adobe-fonts/source-han-serif/issues/37/ .
-
-• The glyphs for U+2EC1 ⻁, U+2EEA ⻪, U+2F2C 屮, and U+4EBD 亽 now map to
-uni864EuE0101-JP, uni9EFE-CN, uni5C6E-CN, and uni4EBD-CN, respectively, in
-all CMap resources.
-See https://github.com/adobe-fonts/source-han-serif/issues/37/ .
-
-• The glyphs for the 52 half-width jamo—U+FFA0 through U+FFBE, U+FFC2 through U+FFC7,
-U+FFCA through U+FFCF, U+FFD2 through U+FFD7, and U+FFDA through U+FFDC—now map to
-the glyphs for compatibility jamo (U+3131 through U+3164).
-
-• The alternate proportional digits and punctuation, along with the alternate
-half-width punctuation, were added to the scope of the ‘fwid’, ‘hwid’, and ‘pwid’ GSUB features.
-
-Simplified Chinese
-
-• CN glyphs for U+35EB 㗫, U+385C 㡜, U+5015 倕, U+57F5 埵, U+618F 憏, U+63EF 揯, U+6456 摖, U+6660 晠,
-U+66A9 暩, U+68B1 梱, U+6F08 漈, U+76E4 盤, U+7808 砈, U+78DC 磜, U+7A07 稇, U+7A44 穄, U+7BA0 箠,
-U+83D9 菙, U+92EE 鋮, U+9318 錘, U+969B 際, U+9BCE 鯎, and U+9C36 鰶 were added.
-See https://github.com/adobe-fonts/source-han-serif/issues/40/.
-
-• The glyphs for U+2F22 夊, U+2F58 爻, U+4F8D 侍, U+62FF 拿, U+6301 持, U+6641 晁, U+6C35 氵, U+6DE6 淦,
-U+6DFC 淼, U+6EB4 溴, and U+81EC 臬 now map to uni590A-CN, uni723B-CN, uni4F8D-JP, uni62FF-JP,
-uni6301-JP, uni6641-JP, uni6C35-JP, uni6DE6-JP, uni6DFC-JP, uni6EB4-JP, and uni81EC-JP, respectively.
-See https://github.com/adobe-fonts/source-han-serif/issues/37/.
-
-• The CN glyphs uni3E76-CN, uni414D-CN, uni4A60-CN, uni4BD5-CN, uni4C53-CN, uni4F5B-CN, uni4FB9-CN,
-uni596E-CN, uni5957-CN, uni5A17-CN, uni5EAD-CN, uni5EF7-CN, uni5F73-CN, uni602B-CN, uni62C2-CN,
-uni633A-CN, uni6883-CN, uni6C11-CN, uni6C1F-CN, uni6CB8-CN, uni6D8F-CN, uni6E88-CN, uni70F6-CN,
-uni73FD-CN, uni7829-CN, uni7D8E-CN, uni7ECB-CN, uni8121-CN, uni8247-CN, uni8713-CN, uni8A94-CN,
-uni8B04-CN, uni92CC-CN, uni94E4-CN, uni95AE-CN, uni9F2E-CN, uniFF1B-CN, uniFE14-CN, and u2CD9F-CN
-were tweaked or corrected.
-See https://github.com/adobe-fonts/source-han-serif/issues/36/ and
-https://github.com/adobe-fonts/source-han-serif/issues/39/.
-
-Traditional Chinese—TW
-
-• TW glyphs for U+4FB9 侹, U+5EAD 庭, U+5EF7 廷, U+633A 挺, U+6883 梃, U+6D8F 涏, U+6DEB 淫, U+73FD 珽,
-U+7D8E 綎, U+7F54 罔, U+8713 蜓, U+8DA3 趣, U+92CC 鋌, U+95AE 閮, and U+9832 頲 were added.
-See https://github.com/adobe-fonts/source-han-serif/issues/40/.
-
-• The glyphs for U+2F61 瓦, U+2FCC 黽, U+504F 偏, U+5553 啓, U+555F 啟, U+58F3 壳, U+58FE 壾, U+591A 多,
-U+61DC 懜, U+627F 承, U+6902 椂, U+6903 椃, U+6947 楇, U+7171 煱, U+76EC 盬, U+77A2 瞢, U+77D2 矒,
-U+8019 耙, U+803B 耻, U+8B04 謄, and U+9BF1 鯱 now map to uni74E6-JP, uni9EFD-JP, uni504FuE0101-JP,
-uni5553uE0101-JP, uni555F-JP, uni58F3-JP, uni58FE-JP, uni591A-JP, uni61DC-JP, uni627F-JP, uni6902-JP,
-uni6903-JP, uni6947-JP, uni7171-JP, uni76EC-CN, uni77A2uE0101-JP, uni77D2-JP, uni8019-JP, uni803B-JP,
-uni8B04-CN, and uni9BF1-JP, respectively.
-See https://github.com/adobe-fonts/source-han-serif/issues/37/.
-
-• The glyphs uni511A-TW, uni5922-TW, uni5A6C-TW, uni5FB5-TW, uni61F5-TW, uni750B-TW, uni750D-TW,
-uni7AC5-TW, uni7D73-TW, uni83E1-TW, uni858E-TW, uni85A8-TW, uni8609-TW, uni9138-TW, uni91C5-TW, and
-uniFF0C-TW were tweaked or corrected.
-See https://github.com/adobe-fonts/source-han-serif/issues/36/ and
-https://github.com/adobe-fonts/source-han-serif/issues/39/.
-
-Japanese
-
-• The JP glyphs uni3CDA-JP, uni3D93-JP, uni507D-JP, uni5316uE0101-JP, uni595C-JP, uni6C2B-JP, uni70BA-JP,
-uni7669-JP, uni81F7-JP, uni8285-JP, uni82B1uE0101-JP, and uni9B58-JP were tweaked or corrected.
-See https://github.com/adobe-fonts/source-han-serif/issues/36/ and
-https://github.com/adobe-fonts/source-han-serif/issues/39/.
-
-• The glyphs for a small number of kana, to include annotated versions thereof, were tweaked in very minor
-ways.
-
-Korean
-
-• The glyphs for U+5173 关 and U+5BE7 寧 now map to uni5173-CN and uni5BE7uE0100-JP, respectively.
-See https://github.com/adobe-fonts/source-han-serif/issues/37/.
-
-• The glyphs uniC625, uniC73D, uni1178, uni118C.vjmo01, uni1190.vjmo01, uni1192.vjmo01, uni11ED,
-uni11ED.tjmo01, uni11ED.tjmo02, uni11ED.tjmo03, uni11ED.tjmo04, uniD7B5, uniD7B5.vjmo01,
-uniD7F5, uniD7F5.tjmo01, uniD7F5.tjmo02, uniD7F5.tjmo03, uniD7F5.tjmo04, uniD7F6, uniD7F6.tjmo01,
-uniD7F6.tjmo02, uniD7F6.tjmo03, uniD7F6.tjmo04, uni1112uni119Euni11D9, uni1140uni1175uni11D9, and
-uni114Cuni116Funi11D9 were corrected.
-See https://github.com/adobe-fonts/source-han-serif/issues/39/.
-
-• The no-op uni115F to uni115F substitutions were removed from the six “ljmo_0n” lookups, referenc-
-es to uni115F were removed from the six “ljmo_xxxxxx” lookups, and glyph classes are now used for the
-“ljmo_xxxxxx,” “vjmo_xxxxxx,” and “tjmo_xxxxxx” lookups.
-
-Noto Serif CJK 1.000 Release Notes
-==================================
-
-April 4, 2017 (addendum)
-
-Please note that due to GitHub restrictions the all-in-one Serif .ttc is not
-available via this repo as it exceeds the 100MB GitHub limit. Please use the
-links under "Super OpenType/CFF Collection (Super OTC)" on this page instead:
-http://www.google.com/get/noto/help/cjk
-
-
-April 3, 2017
-
-Introducing Noto Serif CJK 1.000
-
-This introduces a serif-style companion to Noto Sans CJK. These fonts are again
-offered in seven weights, though they are slightly different-- ExtraLight,
-Light, Regular, Medium, SemiBold, Bold, and Black. Unlike the Sans there are no
-monospace (ASCII-only) versions of these fonts.
-
-The packaging options are the same as for the Sans: you can choose from an
-all-in-one CJK TTC, seven weight-specific CJK TTCs, twenty-eight CJK OTF files
-(four languages x seven weights) that default to one of the four supported
-languages, and twenty-eight region-specific OTF files (four regions x seven
-weights) that support a region-specific subset of the full character repertoire.
-
-The character repertoire is shared among all the Serif CJK fonts but there are
-slight differences between them and the Sans CJK. About 50 characters, mostly
-new in Unicode 8.0 and 9.0, have been added, and about 1700 Plane 2 characters
-(mostly CJK Unified Ideographs Extension B) have been temporarily removed (Hong
-Kong support will be added in Version 2.000). The Serif CJK fonts support
-approximately 43,000 characters with 65535 glyphs, the maximum number of glyphs
-possible in a single font. Most of the additional glyphs are regional variants,
-there are also specific japanese variants, ideographic variation sequences,
-vertical variants, precomposed Korean Jamo, and others.
-
-As with Sans CJK, Noto Serif CJK was developed under an open source license by
-Adobe Systems, Inc. and is almost identical to their Source Han Serif. Please
-see the detailed Adobe release notes for more information.
-
-Noto Serif CJK is licensed under the SIL Open Font License, Version 1.1.
-
-
-Noto Sans CJK 1.004 Release Notes
-=================================
-
-June 15, 2015
-
-- Restore correct vertical Japanese Kana forms
-
-The vertical kana glyphs that are made accessible via the 'vert' GSUB feature were
-inadvertently reverted to their Version 1.000 forms (except for those that were added in
-Version 1.002, meaning CIDs 65496 through 65505) in Version 1.002, which affected CIDs
-65166 through 65251, 65256 through 65258, 65260 through 65352, 65354 through 65369, and
-65471 through 65484. The correct forms, which were present in Version 1.001, are now
-included.
-
-
-Noto Sans CJK 1.003 Release Notes
-=================================
-
-June 8, 2015
-
-- Regularized the vertical metrics across all weights by setting the O/2.uWinAscent and
- O/2.uWinDescent values to 1160 and 320 respectively and using those sames values in the
- horizontal header (hhea) table.
-- The ‘locl’ GSUB feature was reconfigured to be usable in a broader range of contexts.
-
-
-Noto Sans CJK 1.002 Release Notes
-=================================
-
-April 20, 2015
-
-This release includes a license change, the addition of several new font instances, and a
-number of bug fixes.
-
-----------------------
-License Change
-----------------------
-The open source license is changed from Apache License, Version 2.0 to SIL Open Font
-License, Version 1.1.
-
----------------------------
-New Font Instances
----------------------------
-In total eight (4 languages x 2 weights) monospaced half-width OTF fonts were added, in
-regular and bold weights.
-
- - Noto Sans Mono CJK SC Regular and Bold
- - Noto Sans Mono CJK JP Regular and Bold
- - Noto Sans Mono CJK KR Regular and Bold
- - Noto Sans Mono CJK TC Regular and Bold
-
-The monospace fonts differ from the existing ones only in that the default (encoded)
-glyphs for ASCII (U+0020 to U+007E), U+00A0 ( ), U+00A5 (¥), U+2011 (‑), and U+20A9 (₩)
-are half-width instead of proportional.
-
-The new monospace fonts can be found in:
- - All-in-one CJK super OTC font (now includes 36 font instances)
- - CJK OTF fonts with different default language (two additional font instances for each
- language)
- - NotoSansCJK-Regular.ttc and NotoSansCJK-Bold.ttc (four additional font instances in
- each)
-
-Although eight new font instances were added, the footprint of the super OTC only
-increased by 1M or so, mainly due to the four additional 'cmap' tables. Two of the seven
-OTC now contain eight font instances.
-
---------------
-Bug Fixes
---------------
-The Noto issues that have been fixed include:
-
- - https://code.google.com/p/noto/issues/detail?id=74
- - https://code.google.com/p/noto/issues/detail?id=126
- - https://code.google.com/p/noto/issues/detail?id=136
- - https://code.google.com/p/noto/issues/detail?id=151
- - https://code.google.com/p/noto/issues/detail?id=182
- - https://code.google.com/p/noto/issues/detail?id=193
- - https://code.google.com/p/noto/issues/detail?id=266
-
-In addition to the issues tracked at code.google.com/p/noto/issues, there are also a
-number of fixes to issues tracked at https://github.com/adobe-fonts/source-han-sans.
-Please find the details in the release notes for Source Han Sans.
-
-
-Noto Sans CJK 1.001 Release Notes
-=================================
-
-September 12, 2014
-
-With this release there have been a number of bug fixes and some
-reorganization of the packages. The package reorganization carries with it
-a small name change that affects the name of the file, menu name, and the
-internal PostScript name of the original OTF format font. This is a one
-time name change only and names will be stable going forward.
-
-Bug Fixes
----------
-There have been a number of fixes but the two most obvious ones are the fix
-in the alignment of the traditional Chinese punctuation and adjustment of
-the designs used for traditional Chinese to align better for usage in Hong
-Kong.
-
-https://code.google.com/p/noto/issues/detail?id=38
-https://code.google.com/p/noto/issues/detail?id=54
-
-Package Reorganization
-----------------------
-With this release there was an expansion in the number of file formats and
-combinations in which the fonts are being made available.
-
-There are now four major groups of font files by package in this release.
-These are:
-
-* Super OpenType Collection (Super OTC)
- - This is a new format this release that bundles all 7 weights for all 4
- languages into one large font resource. It is smaller overall than
- the combination of the 28 fonts that would be used otherwise because
- of resource sharing and it is much easier to install.
-
-* OpenType Collection (OTC)
- - Each OTC fully supports each of the four languages. There are 7 of these
- with one for each weight.
-
-* Language Specific OTF
- - Each font file supports each of the four languages by using the OpenType
- ‘locl’ feature. However, by default, when the ‘locl’ feature is not
- used, each font file supports a specific language. That means that
- there are 28 font files - 4 languages x 7 weights.
- - This format of 4 language specific variants is new with this release and
- replaces the previous single language variant that required the use of
- the ‘locl’ feature. This is where the name change occurred as we now
- tag the various versions with the name of the default language.
-
-* Region Specific OTF subsets
- - Each font file supports a region specific subset of the full fonts.
- These contain only the glyphs needed for the specific region. There
- are 28 of these font files - 4 languages x 7 weights.
diff --git a/deps/noto-cjk-font-ttf/LICENSE b/deps/noto-cjk-font-ttf/LICENSE
deleted file mode 100644
index d952d62..0000000
--- a/deps/noto-cjk-font-ttf/LICENSE
+++ /dev/null
@@ -1,92 +0,0 @@
-This Font Software is licensed under the SIL Open Font License,
-Version 1.1.
-
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font
-creation efforts of academic and linguistic communities, and to
-provide a free and open framework in which fonts may be shared and
-improved in partnership with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply to
-any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software
-components as distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to,
-deleting, or substituting -- in part or in whole -- any of the
-components of the Original Version, by changing formats or by porting
-the Font Software to a new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed,
-modify, redistribute, and sell modified and unmodified copies of the
-Font Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components, in
-Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the
-corresponding Copyright Holder. This restriction only applies to the
-primary font name as presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created using
-the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/deps/noto-cjk-font-ttf/NEWS b/deps/noto-cjk-font-ttf/NEWS
deleted file mode 100644
index cf9449a..0000000
--- a/deps/noto-cjk-font-ttf/NEWS
+++ /dev/null
@@ -1,40 +0,0 @@
-Noto Sans CJK 2.001 Release Notes
-==================================
-
-April 9, 2019
-
-This is an update to Noto Sans CJK.
-
-Changes
-Version 2.001
-Build Date: April 4, 2019. Built By: Dr. Ken Lunde (小林劍󠄁). Release Date: April 9, 2019.
-
-Listed below are the changes that were made in this release:
-• The copyright year was changed from “2014, 2015, 2018” to the range “2014–2019.”
-• The placeholder (aka blank) glyphs for U+32FF ㋿, uni32FF-JP (CID+2184) and uni32FF-JP-V (CID+65359),
-which is the code point that represents the two-ideograph square ligature form of the name of Japan’s
-forthcoming new era, 令和 (reiwa), that takes effect on 2019-05-01, are now the actual glyphs. U+32FF will
-be included in Unicode Version 12.1 (2019-05-07).
-• All of the mapping changes that were made to the fonts in this release are provided in the table at the beginning of Issue #202 <https://github.com/adobe-fonts/source-han-sans/issues/202>.
-• All of the glyph corrections that were made to the fonts in this release are provided in the table at the beginning of Issue #204.
-• All of the glyphs that were redesigned in this release are provided in the table at the beginning of Issue #205 <https://github.com/adobe-fonts/source-han-sans/issues/205>.
-• The 45 glyphs that were added in this release, which replaced 45 of the 50 reserved glyphs, are provided in
-the table at the beginning of Issue #206. The glyphs are at CIDs 65485 through 65529. Two of the new glyphs
-are mapped from code points that are now supported.
-• Miscellaneous changes that were made in this release are provided in the table at the beginning of Issue #207 <https://github.com/adobe-fonts/source-han-sans/issues/207>.
-• The following 33 glyphs for ideographs are no longer used, and are expected to be removed in Version 3.000
-(currently unplanned and unscheduled): uni58A6-TW (CID+13852), uni5B0F-TW (CID+15204), uni5B38-TW
-(CID+15300), uni5D45-TW (CID+16313), uni5D93-TW (CID+16476), uni5E61-TW (CID+16819), uni61BE-TW
-(CID+18366), uni64BC-TW (CID+19658), uni6937-TW (CID+21605), uni69F9-CN (CID+21965), uni7158-TW
-(CID+25284), uni71D4-TW (CID+25554), uni720B-JP (CID+25667), uni756A-TW (CID+27154), uni7690-CN
-(CID+27719), uni78FB-TW (CID+28713), uni7BB4-TW (CID+30074), uni7C53-TW (CID+30421), uni7DD8-TW
-(CID+31252), uni7E59-TW (CID+31534), uni7FB3-TW (CID+32075), uni81B0-TW (CID+33147), uni8543-TW
-(CID+35181), uni85E9-TW (CID+35584), uni87E0-TW (CID+36504), uni8B52-TW (CID+38257), uni8B85-TW
-(CID+38372), uni8E6F-TW (CID+39481), uni8F53-TW (CID+39883), uni8F57-TW (CID+39895), uni9407-TW
-(CID+42337), uni9C55-TW (CID+45975), and u24A01-KR (CID+60576).
-• The seven per-weight glyph synopsis PDFs now include 2,090 pages, with the first 132 pages showing all
-65,535 glyphs indexed by CID.
-
-Noto Sans CJK is licensed under the SIL Open Font License, Version 1.1.
-
-See HISTORY for prior release notes.
diff --git a/deps/noto-cjk-font-ttf/noto-cjk-font-ttf.SlackBuild b/deps/noto-cjk-font-ttf/noto-cjk-font-ttf.SlackBuild
deleted file mode 100755
index 0dc3be1..0000000
--- a/deps/noto-cjk-font-ttf/noto-cjk-font-ttf.SlackBuild
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/bin/sh
-
-# Copyright 2015, 2018, 2020 Eric Hameleers, Eindhoven, NL
-# Copyright 2015, 2018, 2020 Patrick J. Volkerding, Sebeka, MN USA
-# All rights reserved.
-#
-# Permission to use, copy, modify, and distribute this software for
-# any purpose with or without fee is hereby granted, provided that
-# the above copyright notice and this permission notice appear in all
-# copies.
-#
-# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
-# 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.
-# -----------------------------------------------------------------------------
-
-
-PKGNAM=noto-cjk-font-ttf
-SANS=NotoSansCJK
-SERIF=NotoSerifCJK-Regular
-VERSION=${VERSION:-"2.001"}
-ARCH=noarch
-BUILD=${BUILD:-1}
-
-CWD=$(pwd)
-TMP=${TMP:-/tmp}
-PKG=$TMP/package-$PKGNAM
-
-rm -rf $PKG
-mkdir -p $TMP $PKG
-
-FONTDIR="/usr/share/fonts/TTF"
-mkdir -p $PKG$FONTDIR
-
-# Unzip the ZIP file with the Super OTC font:
-unzip $CWD/${SANS}.ttc.zip -d $PKG$FONTDIR || exit 1
-rm -rf $PKG$FONTDIR/__MACOSX || exit 1
-# Copy the Serif font:
-install -m0644 $CWD/${SERIF}.ttc $PKG$FONTDIR/${SERIF}.ttc || exit 1
-chown -R root:root $PKG$FONTDIR
-chmod -R u+w,go+r-w,a+rX-st $PKG$FONTDIR
-
-# Add a font configuration file (taken from Arch repository):
-install -Dm644 $CWD/70-noto-cjk.conf -t $PKG/etc/fonts/conf.avail
-
-# Post-install script:
-mkdir -p $PKG/install
-cat << EOT > $PKG/install/doinst.sh
-# Update X font indexes and the font cache:
-if [ -x usr/bin/mkfontdir ]; then
- chroot . /usr/bin/mkfontscale $FONTDIR
- chroot . /usr/bin/mkfontdir $FONTDIR
-fi
-if [ -x usr/bin/fc-cache ]; then
- chroot . /usr/bin/fc-cache $FONTDIR
-fi
-EOT
-
-# Add documentation:
-# Files downloaded from https://github.com/googlei18n/noto-cjk
-mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
-cp -a \
- $CWD/HISTORY $CWD/LICENSE $CWD/NEWS $CWD/README* \
- $PKG/usr/doc/$PKGNAM-$VERSION
-find $PKG/usr/doc -type f -exec chmod 644 {} \;
-
-# Add a package description:
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-# Build the package:
-cd $PKG
-/sbin/makepkg -l y -c n $TMP/${PKGNAM}-${VERSION}-${ARCH}-${BUILD}.txz
-
diff --git a/deps/noto-cjk-font-ttf/slack-desc b/deps/noto-cjk-font-ttf/slack-desc
deleted file mode 100644
index 92f61a8..0000000
--- a/deps/noto-cjk-font-ttf/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description. Line
-# up the first '|' above the ':' following the base package name, and the '|'
-# on the right side marks the last column you can put a character in. You must
-# make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':'.
-
- |-----handy-ruler------------------------------------------------------|
-noto-cjk-font-ttf: noto-cjk-font-ttf (Google's Noto CJK TrueType fonts)
-noto-cjk-font-ttf:
-noto-cjk-font-ttf: Noto CJK 'Super OTC' font: This packaging form carries the fonts for
-noto-cjk-font-ttf: each of Simplified Chinese, Traditional Chinese, Japanese, and
-noto-cjk-font-ttf: Korean multiplied by all 7 weights for each in one single font file.
-noto-cjk-font-ttf: In addition, each language provides monospace versions in Regular
-noto-cjk-font-ttf: and Bold weights. Once installed it will appear in font menus
-noto-cjk-font-ttf: as 36 separate fonts. This format is the easiest to install of all
-noto-cjk-font-ttf: the formats and takes the least space due to sharing between
-noto-cjk-font-ttf: the 36 pieces.
-noto-cjk-font-ttf: noto-cjk-font-ttf home: https://github.com/googlei18n/noto-cjk
diff --git a/deps/noto-font-ttf/.url b/deps/noto-font-ttf/.url
deleted file mode 100644
index d44d13e..0000000
--- a/deps/noto-font-ttf/.url
+++ /dev/null
@@ -1 +0,0 @@
-https://github.com/googlei18n/noto-fonts/archive/v2015-09-29-license-adobe.tar.gz
diff --git a/deps/noto-font-ttf/noto-font-ttf.SlackBuild b/deps/noto-font-ttf/noto-font-ttf.SlackBuild
deleted file mode 100755
index d9f28af..0000000
--- a/deps/noto-font-ttf/noto-font-ttf.SlackBuild
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/bin/sh
-
-# Copyright 2015, 2016 Eric Hameleers, Eindhoven, NL
-# Copyright 2015 Patrick J. Volkerding, Sebeka, MN USA
-# All rights reserved.
-#
-# Permission to use, copy, modify, and distribute this software for
-# any purpose with or without fee is hereby granted, provided that
-# the above copyright notice and this permission notice appear in all
-# copies.
-#
-# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
-# 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.
-# -----------------------------------------------------------------------------
-
-
-PKGNAM=noto-font-ttf
-SRCNAM=noto-fonts
-SRCVER=${SRCVER:-"2015-09-29"}
-VERSION=$(echo $SRCVER | tr - _)
-ARCH=noarch
-BUILD=${BUILD:-2}
-
-CWD=$(pwd)
-TMP=${TMP:-/tmp}
-PKG=$TMP/package-$PKGNAM
-
-rm -rf $PKG
-mkdir -p $TMP $PKG
-
-# Font directory location depends on the X build prefix:
-# Determine what X we're running (the modular X returns the prefix
-# in the next command, while older versions stay silent):
-XPREF=$(pkg-config --variable=prefix x11)
-if [ "$XPREF" = "" ]; then
- XPREF='/usr/X11R6'
- FONTDIR="$XPREF/lib/X11/fonts/TTF"
-else
- FONTDIR="/usr/share/fonts/TTF"
-fi
-mkdir -p $PKG$FONTDIR
-
-cd $TMP
-rm -rf ${PKGNAM}-${SRCVER}
-mkdir ${PKGNAM}-${SRCVER}
-cd ${PKGNAM}-${SRCVER}
-tar xvf $CWD/${SRCNAM}-${SRCVER}-license-adobe.tar.gz || exit 1
-chown -R root:root .
-find . \
- \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
- -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
- -exec chmod 644 {} \;
-cd ${SRCNAM}-${SRCVER}-license-adobe
-
-# Install just the hinted fonts - unhinted fonts for Android and Mac;
-# Android and Mac ignore hinting information embedded in fonts:
-cp -a hinted/*.{ttf,ttc} $PKG$FONTDIR/
-chmod 644 $PKG$FONTDIR/*
-
-# Post-install script:
-mkdir -p $PKG/install
-cat << EOT > $PKG/install/doinst.sh
-# Update X font indexes and the font cache:
-if [ -x .$XPREF/bin/mkfontdir ]; then
- chroot . $XPREF/bin/mkfontscale $FONTDIR
- chroot . $XPREF/bin/mkfontdir $FONTDIR
-fi
-if [ -x .$XPREF/bin/fc-cache ]; then
- chroot . $XPREF/bin/fc-cache $FONTDIR
-fi
-EOT
-
-# Add documentation:
-mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
-cp -a \
- FAQ.md LICENSE README.md \
- $PKG/usr/doc/$PKGNAM-$VERSION
-find $PKG/usr/doc -type f -exec chmod 644 {} \;
-
-# Add a package description:
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-# Build the package:
-cd $PKG
-/sbin/makepkg -l y -c n $TMP/${PKGNAM}-${VERSION}-${ARCH}-${BUILD}.txz
-
diff --git a/deps/noto-font-ttf/slack-desc b/deps/noto-font-ttf/slack-desc
deleted file mode 100644
index 47b1faf..0000000
--- a/deps/noto-font-ttf/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description. Line
-# up the first '|' above the ':' following the base package name, and the '|'
-# on the right side marks the last column you can put a character in. You must
-# make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':'.
-
- |-----handy-ruler------------------------------------------------------|
-noto-font-ttf: noto-font-ttf (Google's Noto TrueType fonts)
-noto-font-ttf:
-noto-font-ttf: Noto's goal is to provide a beautiful reading experience for all
-noto-font-ttf: languages. Currently, Noto covers all major languages of the world
-noto-font-ttf: and many others, including European, African, Middle Eastern, Indic,
-noto-font-ttf: South and Southeast Asian, Central Asian, American, and East Asian
-noto-font-ttf: languages. Support for Simplified Chinese, Traditional Chinese,
-noto-font-ttf: Japanese, and Korean was first added in July 2014.
-noto-font-ttf: All Noto fonts are included, except CJK and Emoji.
-noto-font-ttf:
-noto-font-ttf: noto-font-ttf home: https://github.com/googlei18n/noto-fonts
diff --git a/deps/pcaudiolib/.url b/deps/pcaudiolib/.url
deleted file mode 100644
index 0244645..0000000
--- a/deps/pcaudiolib/.url
+++ /dev/null
@@ -1 +0,0 @@
-https://github.com/espeak-ng/pcaudiolib/archive/1.1.tar.gz
diff --git a/deps/pcaudiolib/pcaudiolib.SlackBuild b/deps/pcaudiolib/pcaudiolib.SlackBuild
deleted file mode 100755
index 272e58c..0000000
--- a/deps/pcaudiolib/pcaudiolib.SlackBuild
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/bin/sh
-
-# Copyright 2019 Patrick J. Volkerding, Sebeka, MN, USA
-# Copyright 2019 Eric Hameleers, Eindhoven, NL
-# All rights reserved.
-#
-# Redistribution and use of this script, with or without modification, is
-# permitted provided that the following conditions are met:
-#
-# 1. Redistributions of this script must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''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 AUTHOR 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.
-
-
-cd $(dirname $0) ; CWD=$(pwd)
-
-PKGNAM=pcaudiolib
-VERSION=${VERSION:-1.1}
-BUILD=${BUILD:-1}
-
-TMP=${TMP:-/tmp}
-PKG=$TMP/package-$PKGNAM
-
-# Automatically determine the architecture we're building on:
-if [ -z "$ARCH" ]; then
- case "$(uname -m)" in
- i?86) ARCH=i586 ;;
- arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;;
- # Unless $ARCH is already set, use uname -m for all other archs:
- *) ARCH=$(uname -m) ;;
- esac
- export ARCH
-fi
-
-# Set CFLAGS/CXXFLAGS and LIBDIRSUFFIX:
-if [ "$ARCH" = "i586" ]; then
- SLKCFLAGS="-O2 -march=${ARCH} -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "x86_64" ]; then
- SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
-elif [ "$ARCH" = "arm" ]; then
- SLKCFLAGS="-O2 -march=armv5te"
- LIBDIRSUFFIX=""
-else
- SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
-fi
-
-case "$ARCH" in
- arm*) TARGET=$ARCH-slackware-linux-gnueabi ;;
- *) TARGET=$ARCH-slackware-linux ;;
-esac
-
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
-if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "${PKGNAM}-${VERSION}-${ARCH}-${BUILD}.txz"
- exit 0
-fi
-
-rm -rf $PKG
-mkdir -p $TMP $PKG
-cd $TMP
-rm -rf $PKGNAM-$VERSION
-tar xvf $CWD/$PKGNAM-$VERSION.tar.gz || exit 1
-cd $PKGNAM-$VERSION || exit 1
-chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-[ ! -x configure ] && ./autogen.sh
-
-CFLAGS="$SLKCFLAGS" \
-CXXFLAGS="$SLKCFLAGS" \
-./configure \
- --prefix=/usr \
- --libdir=/usr/lib${LIBDIRSUFFIX} \
- --sysconfdir=/etc \
- --disable-static \
- --build=$TARGET || exit 1
-
-make || exit 1
-make install DESTDIR=$PKG || exit 1
-
-# Add documentation:
-mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
-cp -a \
- AUTHORS CHANGELOG.md COPYING README.md \
- $PKG/usr/doc/$PKGNAM-$VERSION
-
-# Strip binaries (if any):
-find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-# Add a package description:
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-# Build the package:
-cd $PKG
-/sbin/makepkg -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz
-
diff --git a/deps/pcaudiolib/slack-desc b/deps/pcaudiolib/slack-desc
deleted file mode 100644
index 91f2646..0000000
--- a/deps/pcaudiolib/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description.
-# Line up the first '|' above the ':' following the base package name, and
-# the '|' on the right side marks the last column you can put a character in.
-# You must make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':' except on otherwise blank lines.
-
- |-----handy-ruler------------------------------------------------------|
-pcaudiolib: pcaudiolib (Portable C Audio Library)
-pcaudiolib:
-pcaudiolib: pcaudiolib is a portable C Audio Library.
-pcaudiolib:
-pcaudiolib:
-pcaudiolib:
-pcaudiolib:
-pcaudiolib:
-pcaudiolib:
-pcaudiolib: Homepage: https://github.com/espeak-ng/pcaudiolib
-pcaudiolib:
diff --git a/deps/pipewire/.url b/deps/pipewire/.url
new file mode 100644
index 0000000..c4ce81d
--- /dev/null
+++ b/deps/pipewire/.url
@@ -0,0 +1 @@
+https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/0.3.8/pipewire-0.3.8.tar.bz2
diff --git a/deps/pipewire/doinst.sh b/deps/pipewire/doinst.sh
new file mode 100644
index 0000000..5076597
--- /dev/null
+++ b/deps/pipewire/doinst.sh
@@ -0,0 +1,15 @@
+config() {
+ NEW="$1"
+ OLD="$(dirname $NEW)/$(basename $NEW .new)"
+ # If there's no config file by that name, mv it over:
+ if [ ! -r $OLD ]; then
+ mv $NEW $OLD
+ elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then
+ # toss the redundant copy
+ rm $NEW
+ fi
+ # Otherwise, we leave the .new copy for the admin to consider...
+}
+
+config etc/pipewire/pipewire.conf.new
+
diff --git a/deps/pipewire/pipewire.SlackBuild b/deps/pipewire/pipewire.SlackBuild
new file mode 100755
index 0000000..87cdc60
--- /dev/null
+++ b/deps/pipewire/pipewire.SlackBuild
@@ -0,0 +1,143 @@
+#!/bin/sh
+
+# Copyright 2020 Eric Hameleers, Eindhoven, NL
+# Copyright 2020 Patrick J. Volkerding, Sebeka, MN, USA
+# All rights reserved.
+#
+# Permission to use, copy, modify, and distribute this software for
+# any purpose with or without fee is hereby granted, provided that
+# the above copyright notice and this permission notice appear in all
+# copies.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+# 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.
+# -----------------------------------------------------------------------------
+
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PKGNAM=pipewire
+VERSION=${VERSION:-0.3.8}
+BUILD=${BUILD:-1}
+
+# Automatically determine the architecture we're building on:
+if [ -z "$ARCH" ]; then
+ case "$(uname -m)" in
+ i?86) ARCH=i586 ;;
+ arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;;
+ # Unless $ARCH is already set, use uname -m for all other archs:
+ *) ARCH=$(uname -m) ;;
+ esac
+ export ARCH
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PKGNAM-$VERSION-$ARCH-$BUILD.txz"
+ exit 0
+fi
+
+case "$ARCH" in
+ i?86) SLKCFLAGS="-O2 -march=${ARCH} -mtune=i686"
+ SLKLDFLAGS=""; LIBDIRSUFFIX=""
+ ;;
+ x86_64) SLKCFLAGS="-O2 -fPIC"
+ SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64"
+ ;;
+ arm*) SLKCFLAGS="-O2"
+ SLKLDFLAGS=""; LIBDIRSUFFIX=""
+ ;;
+ *) SLKCFLAGS=${SLKCFLAGS:-"O2"}
+ SLKLDFLAGS=${SLKLDFLAGS:-""}; LIBDIRSUFFIX=${LIBDIRSUFFIX:-""}
+ ;;
+esac
+
+case "$ARCH" in
+ arm*) TARGET=$ARCH-slackware-linux-gnueabi ;;
+ *) TARGET=$ARCH-slackware-linux ;;
+esac
+
+TMP=${TMP:-/tmp}
+PKG=$TMP/package-$PKGNAM
+
+rm -rf $PKG
+mkdir -p $TMP $PKG
+
+cd $TMP
+rm -rf $PKGNAM-$VERSION
+tar xvf $CWD/$PKGNAM-$VERSION.tar.bz2 || exit 1
+cd $PKGNAM-$VERSION || exit 1
+
+chown -R root:root .
+find . \
+ \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
+ -exec chmod 755 {} \+ -o \
+ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
+ -exec chmod 644 {} \+
+
+export LDFLAGS="$SLKLDFLAGS"
+export CXXFLAGS="$SLKCFLAGS"
+export CFLAGS="$SLKCFLAGS"
+mkdir meson-build
+cd meson-build
+ meson setup \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --mandir=/usr/man \
+ --localstatedir=/var \
+ --sysconfdir=/etc \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --buildtype=release \
+ -Djack=false \
+ -Dpipewire-jack=false \
+ .. || exit 1
+
+ # Build and install:
+ "${NINJA:=ninja}" $NUMJOBS || exit 1
+ DESTDIR=$PKG $NINJA install || exit 1
+cd ..
+
+# Do not clobber custom configurations:
+mv $PKG/etc/pipewire/pipewire.conf{,.new}
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+# Strip binaries (if any):
+find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+# Compress the man page(s):
+if [ -d $PKG/usr/man ]; then
+ find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \;
+ for i in $(find $PKG/usr/man -type l -name "*.?") ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+fi
+
+# Add documentation:
+mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
+cp -a \
+ CODE_OF_CONDUCT.md COPYING INSTALL.md LICENSE NEWS PROTOCOL README.md \
+ $PKG/usr/doc/$PKGNAM-$VERSION
+
+# Add a package description and the post-install script:
+mkdir -p $PKG/install
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+# Build the package:
+cd $PKG
+/sbin/makepkg -l y -c n $TMP/${PKGNAM}-${VERSION}-${ARCH}-${BUILD}.txz
+
diff --git a/deps/pipewire/slack-desc b/deps/pipewire/slack-desc
new file mode 100644
index 0000000..bdd8586
--- /dev/null
+++ b/deps/pipewire/slack-desc
@@ -0,0 +1,20 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+pipewire: pipewire (multimedia processing)
+pipewire:
+pipewire: PipeWire is a project that aims to greatly improve handling of
+pipewire: audio and video under Linux. It provides a low-latency, graph based
+pipewire: processing engine on top of audio and video devices that can be
+pipewire: used to support the use cases currently handled by both pulseaudio
+pipewire: and JACK.
+pipewire: PipeWire was designed with a powerful security model particularly
+pipewire: suited for containerized applications.
+pipewire:
+pipewire: See also: https://pipewire.org/
+
diff --git a/deps/qca-qt5/.url b/deps/qca-qt5/.url
index 5c157ae..0d4c99c 100644
--- a/deps/qca-qt5/.url
+++ b/deps/qca-qt5/.url
@@ -1 +1,2 @@
-https://download.kde.org/stable/qca/2.3.0/qca-2.3.0.tar.xz.sig
+https://download.kde.org/stable/qca/2.3.1/qca-2.3.1.tar.xz
+https://download.kde.org/stable/qca/2.3.1/qca-2.3.1.tar.xz.sig
diff --git a/deps/qca-qt5/qca-qt5.SlackBuild b/deps/qca-qt5/qca-qt5.SlackBuild
index 8e24ae4..3bbd1e8 100755
--- a/deps/qca-qt5/qca-qt5.SlackBuild
+++ b/deps/qca-qt5/qca-qt5.SlackBuild
@@ -25,8 +25,8 @@ cd $(dirname $0) ; CWD=$(pwd)
PKGNAM=qca-qt5
SRCNAM=qca
-VERSION=${VERSION:-2.3.0}
-BUILD=${BUILD:-2}
+VERSION=${VERSION:-2.3.1}
+BUILD=${BUILD:-1}
# Automatically determine the architecture we're building on:
if [ -z "$ARCH" ]; then
diff --git a/deps/speech-dispatcher/speech-dispatcher.SlackBuild b/deps/speech-dispatcher/speech-dispatcher.SlackBuild
index 9119959..21b5b13 100755
--- a/deps/speech-dispatcher/speech-dispatcher.SlackBuild
+++ b/deps/speech-dispatcher/speech-dispatcher.SlackBuild
@@ -26,7 +26,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PKGNAM=speech-dispatcher
VERSION=${VERSION:-0.8.8}
-BUILD=${BUILD:-4}
+BUILD=${BUILD:-5}
TMP=${TMP:-/tmp}
PKG=$TMP/package-$PKGNAM
@@ -97,8 +97,8 @@ CXXFLAGS="$SLKCFLAGS" \
--sysconfdir=/etc \
--infodir=/usr/info \
--disable-static \
+ --without-flite \
--build=$TARGET || exit 1
- #--without-flite \
make || exit 1
make install DESTDIR=$PKG || exit 1
diff --git a/deps/updates.SlackBuild b/deps/updates.SlackBuild
deleted file mode 100755
index 31e992a..0000000
--- a/deps/updates.SlackBuild
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/bin/sh
-
-# Build (and install) all KDE dependencies
-# Modified from the KDE Slackware script by Eric Hameleers <alien@slackware.com>
-
-# Set initial variables:
-CWD=$(pwd)
-TMP=${TMP:-/tmp}
-
-# Set the config option variables if they are not already set:
-[ -r ./alldeps.options ] && . ./alldeps.options
-
-# This avoids compiling a version number into KDE's .la files:
-QTDIR=/usr/lib${LIBDIRSUFFIX}/qt ; export QTDIR
-
-ALLDEPS=" \
- extra-cmake-modules \
- md4c \
- sni-qt \
- qca-qt5 \
- libdbusmenu-qt5 \
- phonon \
- phonon-gstreamer \
- phonon-qt4 \
- phonon-qt4-gstreamer \
- python-enum34 \
- pyxdg \
- pcaudiolib \
- espeak-ng \
- dotconf \
- flite \
- speech-dispatcher \
- polkit-qt5-1 \
- grantlee \
- grantlee-qt4 \
- poppler \
- libdbusmenu-gtk \
- libindicator \
- libappindicator \
- cfitsio \
- libdmtx \
- qrencode \
- hack-font-ttf \
- noto-font-ttf \
- noto-cjk-font-ttf \
- lensfun \
- opencv \
- dvdauthor \
- vid.stab \
- frei0r-plugins \
- mlt \
- cracklib \
- libpwquality \
- accountsservice \
- libburn \
- qtav \
- ddcutil \
- id3lib \
- cryptopp \
- cryfs \
- python3-random2 \
- perl-path-tiny \
- perl-template-toolkit \
- freecell-solver \
- drumstick \
- libsass \
- sassc \
- rttr \
- quazip \
- kdsoap \
- libqalculate \
- exiv2 \
- "
- # Only needed when adding support for Wayland:
- #elogind \
-
-# Allow for specification of individual packages to be built:
-if [ -z "$1" ]; then
- MODQUEUE=$ALLDEPS
-else
- MODQUEUE=$*
-fi
-
-for module in \
- $MODQUEUE ;
-do
- cd $module
- ./$module.SlackBuild
- if [ $? = 0 ]; then
- # Yes, I will build with the fresh packages installed:
- upgradepkg --install-new --reinstall ${TMP}/${module}-*.txz
- # Keep MIME database current:
- /usr/bin/update-mime-database /usr/share/mime 1> /dev/null 2> /dev/null &
- rm -rf ${TMP}/package-${module} ${TMP}/${module}-$VERSION
- else
- echo "${module} failed to build."
- exit 1
- fi
- cd - ;
-done
-
diff --git a/kde/build/digikam b/kde/build/digikam
deleted file mode 100644
index 0cfbf08..0000000
--- a/kde/build/digikam
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/kde/build/krita b/kde/build/krita
deleted file mode 100644
index 0cfbf08..0000000
--- a/kde/build/krita
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/kde/build/sddm-qt5 b/kde/build/sddm-qt5
index 7ed6ff8..1e8b314 100644
--- a/kde/build/sddm-qt5
+++ b/kde/build/sddm-qt5
@@ -1 +1 @@
-5
+6
diff --git a/kde/cmake/sddm-qt5 b/kde/cmake/sddm-qt5
index 6f187cb..cd8ebfb 100644
--- a/kde/cmake/sddm-qt5
+++ b/kde/cmake/sddm-qt5
@@ -24,6 +24,7 @@ cd build
-DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_CXX_FLAGS_RELEASE:STRING="$SLKCFLAGS" \
-DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_MANDIR=/usr/man \
-DLIB_SUFFIX=${LIBDIRSUFFIX} \
-DBUILD_MAN_PAGES:BOOL=TRUE \
-DDBUS_CONFIG_FILENAME="org.freedesktop.sddm.conf" \
diff --git a/kde/cmake/xdg-desktop-portal-kde b/kde/cmake/xdg-desktop-portal-kde
index 74dc9f6..26bc0a8 100644
--- a/kde/cmake/xdg-desktop-portal-kde
+++ b/kde/cmake/xdg-desktop-portal-kde
@@ -18,7 +18,7 @@ cd build
-DKDE_INSTALL_SYSCONFDIR=/etc/kde \
-DKDE_INSTALL_USE_QT_SYS_PATHS=ON \
-DBUILD_TESTING=OFF \
- -DENABLE_PIPEWIRE=OFF \
+ -DENABLE_PIPEWIRE=ON \
-DQca-qt5_DIR=/usr/lib${LIBDIRSUFFIX}/cmake/Qca \
..
diff --git a/kde/modules/frameworks b/kde/modules/frameworks
index 7c2ed82..002e935 100644
--- a/kde/modules/frameworks
+++ b/kde/modules/frameworks
@@ -51,6 +51,7 @@ syndication
kquickcharts
# Tier 3, depends on Tier 1 and 2, Qt5, system libraries:
kconfigwidgets
+kdav
kservice
kglobalaccel
kiconthemes
diff --git a/kde/modules/kdepim b/kde/modules/kdepim
index 8f5b281..eb58f35 100644
--- a/kde/modules/kdepim
+++ b/kde/modules/kdepim
@@ -37,7 +37,6 @@ incidenceeditor
messagelib
mailcommon
kleopatra
-kdav
kpkpass
kitinerary
kdepim-addons
diff --git a/kde/patch/akonadi.patch b/kde/patch/akonadi.patch
deleted file mode 100644
index ddab2a8..0000000
--- a/kde/patch/akonadi.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-# Remove hardcoded absolute path to stdlib header.
-# This is Windows-centric and breaks on any linux GCC upgrade.
-# Thanks to Gentoo where I found the following two patches at
-# https://packages.gentoo.org/packages/kde-apps/akonadi
-# No longer needed since 17.04.0.
-#cat $CWD/patch/akonadi/akonadi_revert-abs-path.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/akonadi/akonadi_rename-header.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Temporary fix for non-working Akonadi in combination with mariadb 10.2.8
-# (actually this is a bug in qtsql, not in akonadi or mariadb):
-#cat $CWD/patch/akonadi/akonadi_mariadb_qtsql.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/akonadi/akonadi_mariadb_qtsql.patch b/kde/patch/akonadi/akonadi_mariadb_qtsql.patch
deleted file mode 100644
index 7ec6d7c..0000000
--- a/kde/patch/akonadi/akonadi_mariadb_qtsql.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-Patch taken from https://cgit.kde.org/akonadi.git/patch/?id=b145f47f000978b9d39edc1882849ec7f6b3ef79
-
-Upstream bug reports:
-https://bugs.kde.org/show_bug.cgi?id=383991
-https://bugreports.qt.io/browse/QTBUG-63108
-
-From b145f47f000978b9d39edc1882849ec7f6b3ef79 Mon Sep 17 00:00:00 2001
-From: Heinz Wiesinger <pprkut@liwjatan.at>
-Date: Sun, 17 Sep 2017 10:56:44 +0200
-Subject: Only remove init connections to the database on server shutdown.
-
-Summary:
-With MariaDB 10.2 libmysqlclient was replaced with libmariadb that
-changed how establishing database connections behaves. The MySQL
-QSQL driver calls mysql_server_end() on QSqlDatabase::removeDatabase()
-if the overall connection count dropped to 0 (which it does when
-the init connection is removed).
-A future QSqlDatabase:addDatabase() would call mysql_server_init()
-again, but this no longer works with libmariadb as that one only
-allows calling mysql_server_init() once. Future calls are simply
-ignored.
-
-In order to prevent this from happening we have to keep the
-init connection open until the server shuts down, so the connection
-count only drops to 0 at shutdown and mysql_server_end() isn't
-called before.
-
-This is a workaround for QTBUG-63108
-
-CCBUG: 383991
-
-Reviewers: dvratil, mlaurent
-
-Reviewed By: dvratil
-
-Subscribers: #kde_pim
-
-Tags: #kde_pim
-
-Differential Revision: https://phabricator.kde.org/D7858
----
- src/server/akonadi.cpp | 3 ++-
- src/server/storage/dbconfigmysql.cpp | 4 +++-
- 2 files changed, 5 insertions(+), 2 deletions(-)
-
-diff --git a/src/server/akonadi.cpp b/src/server/akonadi.cpp
-index 4364e63..bcb7e88 100644
---- a/src/server/akonadi.cpp
-+++ b/src/server/akonadi.cpp
-@@ -423,13 +423,14 @@ bool AkonadiServer::createDatabase()
- success = false;
- }
- }
-- QSqlDatabase::removeDatabase(initCon);
- return success;
- }
-
- void AkonadiServer::stopDatabaseProcess()
- {
- if (!DbConfig::configuredDatabase()->useInternalServer()) {
-+ // closing initConnection this late to work around QTBUG-63108
-+ QSqlDatabase::removeDatabase(QStringLiteral("initConnection"));
- return;
- }
-
-diff --git a/src/server/storage/dbconfigmysql.cpp b/src/server/storage/dbconfigmysql.cpp
-index 2bd231d..d565706 100644
---- a/src/server/storage/dbconfigmysql.cpp
-+++ b/src/server/storage/dbconfigmysql.cpp
-@@ -492,7 +492,6 @@ bool DbConfigMysql::startInternalServer()
- }
- }
-
-- QSqlDatabase::removeDatabase(initCon);
- return success;
- }
-
-@@ -520,6 +519,9 @@ void DbConfigMysql::stopInternalServer()
- return;
- }
-
-+ // closing initConnection this late to work around QTBUG-63108
-+ QSqlDatabase::removeDatabase(QStringLiteral("initConnection"));
-+
- disconnect(mDatabaseProcess, static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
- this, &DbConfigMysql::processFinished);
-
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/akonadi/akonadi_rename-header.patch b/kde/patch/akonadi/akonadi_rename-header.patch
deleted file mode 100644
index 73347f0..0000000
--- a/kde/patch/akonadi/akonadi_rename-header.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-commit 248671e8200ff0883877b6d0e56700ef99ff3b51
-Author: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sat Jan 7 14:38:17 2017 +0100
-
- Rename exception.h to exceptionbase.h
-
- REVIEW: 129788
-
-diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
-index 6ac851e..fa996b9 100644
---- a/src/core/CMakeLists.txt
-+++ b/src/core/CMakeLists.txt
-@@ -95,7 +95,7 @@ ecm_generate_headers(AkonadiCore_base_HEADERS
- EntityDeletedAttribute
- EntityDisplayAttribute
- EntityHiddenAttribute
-- Exception
-+ ExceptionBase
- GidExtractorInterface
- IndexPolicyAttribute
- Item
-diff --git a/src/core/exception.cpp b/src/core/exception.cpp
-index f229c1a..14f7330 100644
---- a/src/core/exception.cpp
-+++ b/src/core/exception.cpp
-@@ -17,7 +17,7 @@
- 02110-1301, USA.
- */
-
--#include "exception.h"
-+#include "exceptionbase.h"
-
- #include <QString>
-
-diff --git a/src/core/exception.h b/src/core/exceptionbase.h
-similarity index 100%
-rename from src/core/exception.h
-rename to src/core/exceptionbase.h
-diff --git a/src/core/item.h b/src/core/item.h
-index de71cad..5ec62c8 100644
---- a/src/core/item.h
-+++ b/src/core/item.h
-@@ -23,7 +23,7 @@
-
- #include "akonadicore_export.h"
- #include "attribute.h"
--#include "exception.h"
-+#include "exceptionbase.h"
- #include "tag.h"
- #include "collection.h"
- #include "relation.h"
-diff --git a/src/core/itempayloadinternals_p.h b/src/core/itempayloadinternals_p.h
-index 0a4de3c..1626f10 100644
---- a/src/core/itempayloadinternals_p.h
-+++ b/src/core/itempayloadinternals_p.h
-@@ -32,7 +32,7 @@
-
- #include <boost/shared_ptr.hpp>
-
--#include "exception.h"
-+#include "exceptionbase.h"
-
- //@cond PRIVATE Doxygen 1.7.1 hangs processing this file. so skip it.
- //for more info, see https://bugzilla.gnome.org/show_bug.cgi?id=531637
-diff --git a/src/core/protocolhelper.cpp b/src/core/protocolhelper.cpp
-index f740e9d..c218f0c 100644
---- a/src/core/protocolhelper.cpp
-+++ b/src/core/protocolhelper.cpp
-@@ -23,7 +23,7 @@
- #include "collectionstatistics.h"
- #include "item_p.h"
- #include "collection_p.h"
--#include "exception.h"
-+#include "exceptionbase.h"
- #include "itemserializer_p.h"
- #include "itemserializerplugin.h"
- #include "servermanager.h"
diff --git a/kde/patch/akonadi/akonadi_revert-abs-path.patch b/kde/patch/akonadi/akonadi_revert-abs-path.patch
deleted file mode 100644
index 3b48253..0000000
--- a/kde/patch/akonadi/akonadi_revert-abs-path.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-commit d98e29a07f4acc3bf01f06f25b3eef5522397e2e
-Author: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Thu Jan 5 22:41:02 2017 +0100
-
- Revert "Workaround an include loop on case-insensitive systems"
-
- Do not hardcode absolute patchs to GCC headers.
-
- This reverts commit 59b9d6b79425c9ec1e5df059a2593580048c4adf.
-
- REVIEW: 129788
-
-diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
-index 72589cd..6ac851e 100644
---- a/src/core/CMakeLists.txt
-+++ b/src/core/CMakeLists.txt
-@@ -257,21 +257,6 @@ ecm_generate_headers(AkonadiCore_jobs_HEADERS
- RELATIVE jobs
- )
-
--# This is a workaround for conflict between our "Exception" fancy header and
--# C++ stdlib's "exception" header which occurs in case-insensitive systems.
--# For that reason we generate std_exception.h file, which contains an absolute
--# path to the stdlib's exception header file, which resolves the ambiguity
--# when including <exception> from within Akonadi.
--include(FindStdlibInclude)
--findStdlibInclude("exception" std_exception_file)
--if (NOT "${std_exception_file}" STREQUAL "")
-- configure_file(${CMAKE_CURRENT_SOURCE_DIR}/std_exception.h.in
-- ${CMAKE_CURRENT_BINARY_DIR}/std_exception.h
-- )
--else()
-- message(FATAL_ERROR "stdlib <exception> include absolute path not found")
--endif()
--
- set(akonadicore_dbus_xml ${Akonadi_SOURCE_DIR}/src/interfaces/org.freedesktop.Akonadi.NotificationManager.xml)
- qt5_add_dbus_interface(akonadicore_dbus_SRCS ${akonadicore_dbus_xml} notificationmanagerinterface)
-
-@@ -338,7 +323,6 @@ install(TARGETS
-
- install(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/akonadicore_export.h
-- ${CMAKE_CURRENT_BINARY_DIR}/std_exception.h
- ${AkonadiCore_base_HEADERS}
- ${AkonadiCore_models_HEADERS}
- ${AkonadiCore_jobs_HEADERS}
-diff --git a/src/core/exception.h b/src/core/exception.h
-index d07ca71..2a376df 100644
---- a/src/core/exception.h
-+++ b/src/core/exception.h
-@@ -20,16 +20,11 @@
- #ifndef AKONADI_EXCEPTION_H
- #define AKONADI_EXCEPTION_H
-
--// The std_exception.h file is generated at build-time and #includes C++ stdlib
--// header "exception" by aboslute path. This is to workaround an include loop on
--// case-insensitive systems, where #include <exception> includes our "Exception"
--// fancy header instead of stdlib's exception, causing an endless loop of
--// includes between "Exception" and "exception.h".
--#include "std_exception.h"
--
- #include "akonadicore_export.h"
-+#include <QObject>
-+#include <QByteArray>
-+#include <exception>
-
--class QByteArray;
- class QString;
-
- namespace Akonadi
diff --git a/kde/patch/akonadi4.patch b/kde/patch/akonadi4.patch
index 388c3ea..8ff0118 100644
--- a/kde/patch/akonadi4.patch
+++ b/kde/patch/akonadi4.patch
@@ -1,4 +1,3 @@
# Backport a patch from git master since there will not be another
# official akonadi release after the current 1.13:
cat $CWD/patch/akonadi4/akonadi_dont-leak-old-external-payload-files.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/amarok.patch b/kde/patch/amarok.patch
index 9fc3963..7ede8ad 100644
--- a/kde/patch/amarok.patch
+++ b/kde/patch/amarok.patch
@@ -1,4 +1,3 @@
# Fix a crash in KDE 4.11:
# See also https://bugs.kde.org/show_bug.cgi?id=320855
cat $CWD/patch/amarok/amarok_kdebug_320855.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ark.patch b/kde/patch/ark.patch
index 35ac2d3..3710075 100644
--- a/kde/patch/ark.patch
+++ b/kde/patch/ark.patch
@@ -1,7 +1,5 @@
-# Ark won't open RAR archives unless rar is installed (even for read access).
-# KDEBUG #357057 is fixed in 15.12.1; still needs unrar.
-#cat $CWD/patch/ark/ark_kdebug357057.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Fix a compilation issue in 18.04.0:
-cat $CWD/patch/ark/ark_include_memory.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+#cat $CWD/patch/ark/ark_include_memory.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+# Fix for CVE-2020-16116:
+cat $CWD/patch/ark/ark_cve-2020-16116.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/ark/ark_cve-2020-16116.patch b/kde/patch/ark/ark_cve-2020-16116.patch
new file mode 100644
index 0000000..b3feb1b
--- /dev/null
+++ b/kde/patch/ark/ark_cve-2020-16116.patch
@@ -0,0 +1,47 @@
+From 0df592524fed305d6fbe74ddf8a196bc9ffdb92f Mon Sep 17 00:00:00 2001
+From: Elvis Angelaccio <elvis.angelaccio@kde.org>
+Date: Wed, 29 Jul 2020 23:45:30 +0200
+Subject: [PATCH] Fix vulnerability to path traversal attacks
+
+Ark was vulnerable to directory traversal attacks because of
+missing validation of file paths in the archive.
+
+More details about this attack are available at:
+https://github.com/snyk/zip-slip-vulnerability
+
+Job::onEntry() is the only place where we can safely check the path of
+every entry in the archive. There shouldn't be a valid reason
+to have a "../" in an archive path, so we can just play safe and abort
+the LoadJob if we detect such an entry. This makes impossibile to
+extract this kind of malicious archives and perform the attack.
+
+Thanks to Albert Astals Cid for suggesting to use QDir::cleanPath()
+so that we can still allow loading of legitimate archives that
+contain "../" in their paths but still resolve inside the extraction folder.
+---
+ kerfuffle/jobs.cpp | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/kerfuffle/jobs.cpp b/kerfuffle/jobs.cpp
+index fdaa48695..f73b56f86 100644
+--- a/kerfuffle/jobs.cpp
++++ b/kerfuffle/jobs.cpp
+@@ -180,6 +180,14 @@ void Job::onError(const QString & message, const QString & details)
+
+ void Job::onEntry(Archive::Entry *entry)
+ {
++ const QString entryFullPath = entry->fullPath();
++ if (QDir::cleanPath(entryFullPath).contains(QLatin1String("../"))) {
++ qCWarning(ARK) << "Possibly malicious archive. Detected entry that could lead to a directory traversal attack:" << entryFullPath;
++ onError(i18n("Could not load the archive because it contains ill-formed entries and might be a malicious archive."), QString());
++ onFinished(false);
++ return;
++ }
++
+ emit newEntry(entry);
+ }
+
+--
+GitLab
+
+
diff --git a/kde/patch/ark/ark_kdebug357057.patch b/kde/patch/ark/ark_kdebug357057.patch
deleted file mode 100644
index 76c0bab..0000000
--- a/kde/patch/ark/ark_kdebug357057.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Elvis Angelaccio <elvis.angelaccio@kdemail.net>
-Date: Wed, 23 Dec 2015 16:19:29 +0000
-Subject: Fallback to read-only mode if there are no read-write executables
-X-Git-Url: http://quickgit.kde.org/?p=ark.git&a=commitdiff&h=087e5aab49c60ac5930742fe892fa930048e2f43
----
-Fallback to read-only mode if there are no read-write executables
-
-Commit 2d000a0 introduced executables check when loading a plugin. However the
-current behavior is too restrictive: if one wants only to open a rar or a
-zip archive, there is no need to require also the rar or zip program to be
-installed. Plus, some distributions (e.g. Archlinux) ship only unrar in their
-official repositories.
-
-With this commit, Ark is able to understand that e.g. unrar is installed but
-rar is not. In this case, Ark can and should fallback to read-only mode,
-to disable the Add/Delete actions in the toolbar.
-
-BUG: 357057
-FIXED-IN: 15.12.1
-
-CC: rthomsen6@gmail.com
----
-
-
---- a/kerfuffle/archive_kerfuffle.cpp
-+++ b/kerfuffle/archive_kerfuffle.cpp
-@@ -173,6 +173,9 @@
-
- if (iface->findExecutables(!isReadOnly)) {
- return new Archive(iface, isReadOnly, parent);
-+ } else if (!isReadOnly && iface->findExecutables(false)) {
-+ qCWarning(ARK) << "Failed to find read-write executables: falling back to read-only mode for read-write plugin" << pluginName;
-+ return new Archive(iface, true, parent);
- } else {
- qCWarning(ARK) << "Failed to find needed executables for plugin" << pluginName;
- }
-
diff --git a/kde/patch/baloo5.patch b/kde/patch/baloo5.patch
index 794bcd9..75aa4d1 100644
--- a/kde/patch/baloo5.patch
+++ b/kde/patch/baloo5.patch
@@ -1,3 +1,2 @@
-# Adapt to changes in KAboutData (will be fixed in next release):
-#cat $CWD/patch/baloo5/baloo-4.96.0_kaboutdata.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
+# Disable file indexing by default in Baloo:
+cat $CWD/patch/baloo5/baloo_def_indexing_disabled.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff b/kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff
deleted file mode 100644
index 36ec0d1..0000000
--- a/kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff
+++ /dev/null
@@ -1,69 +0,0 @@
-From: Andreas Hartmetz <ahartmetz@gmail.com>
-Date: Wed, 14 May 2014 02:36:57 +0000
-Subject: Adapt to changes in KAboutData.
-X-Git-Url: http://quickgit.kde.org/?p=baloo.git&a=commitdiff&h=46e3ea7828c8066e75bec87ba0a19d5ef3bd700a
----
-Adapt to changes in KAboutData.
----
-
-
---- a/src/file/kcm/kcm.cpp
-+++ b/src/file/kcm/kcm.cpp
-@@ -58,8 +58,8 @@
- : KCModule(parent, args)
- {
- KAboutData* about = new KAboutData(
-- "kcm_baloofile", "kcm_baloofile", i18n("Configure Desktop Search"),
-- "0.1", QString(), KAboutData::License_GPL,
-+ "kcm_baloofile", i18n("Configure Desktop Search"),
-+ "0.1", QString(), KAboutLicense::GPL,
- i18n("Copyright 2007-2010 Sebastian Trüg"));
- about->addAuthor(i18n("Sebastian Trüg"), QString(), "trueg@kde.org");
- about->addAuthor(i18n("Vishesh Handa"), QString(), "vhanda@kde.org");
-
---- a/src/file/main.cpp
-+++ b/src/file/main.cpp
-@@ -44,9 +44,9 @@
- lowerSchedulingPriority();
- lowerPriority();
-
-- KAboutData aboutData("baloo_file", "baloo_file", i18n("Baloo File"), "0.1",
-+ KAboutData aboutData("baloo_file", i18n("Baloo File"), "0.1",
- i18n("An application to handle file metadata"),
-- KAboutData::License_LGPL_V2);
-+ KAboutLicense::LGPL_V2);
- aboutData.addAuthor(i18n("Vishesh Handa"), i18n("Maintainer"), "me@vhanda.in", "http://vhanda.in");
-
- KAboutData::setApplicationData(aboutData);
-
---- a/src/tools/baloosearch/main.cpp
-+++ b/src/tools/baloosearch/main.cpp
-@@ -55,11 +55,10 @@
- int main(int argc, char* argv[])
- {
- KAboutData aboutData("baloosearch",
-- "baloosearch",
- i18n("Baloo Search"),
- "0.1",
- i18n("Baloo Search - A debugging tool"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2013, Vishesh Handa"));
- aboutData.addAuthor(i18n("Vishesh Handa"), i18n("Maintainer"), "me@vhanda.in");
-
-
---- a/src/tools/balooshow/main.cpp
-+++ b/src/tools/balooshow/main.cpp
-@@ -46,11 +46,10 @@
- int main(int argc, char* argv[])
- {
- KAboutData aboutData("balooshow",
-- "balooshow",
- i18n("Baloo Show"),
- "0.1",
- i18n("The Baloo data Viewer - A debugging tool"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2012, Vishesh Handa"));
- aboutData.addAuthor(i18n("Vishesh Handa"), i18n("Maintainer"), "me@vhanda.in");
-
diff --git a/kde/patch/baloo5/baloo_def_indexing_disabled.patch b/kde/patch/baloo5/baloo_def_indexing_disabled.patch
new file mode 100644
index 0000000..8a12e45
--- /dev/null
+++ b/kde/patch/baloo5/baloo_def_indexing_disabled.patch
@@ -0,0 +1,12 @@
+diff -uar baloo-5.72.0.orig/src/lib/baloosettings.kcfg baloo-5.72.0/src/lib/baloosettings.kcfg
+--- baloo-5.72.0.orig/src/lib/baloosettings.kcfg 2020-07-04 15:03:02.000000000 +0200
++++ baloo-5.72.0/src/lib/baloosettings.kcfg 2020-07-29 19:51:58.891567902 +0200
+@@ -9,7 +9,7 @@
+ <group name="Basic Settings">
+ <entry name="indexingEnabled" key="Indexing-Enabled" type="Bool">
+ <label>Indexing-Enabled</label>
+- <default>true</default>
++ <default>false</default>
+ </entry>
+ </group>
+ <group name="General">
diff --git a/kde/patch/calligra.patch b/kde/patch/calligra.patch
deleted file mode 100644
index a0a45af..0000000
--- a/kde/patch/calligra.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-# Fix build against Qt 5.11:
-#cat $CWD/patch/calligra/calligra3_qt511.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against Qt 5.13:
-#cat $CWD/patch/calligra/calligra3_qt513.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against poppler 0.71:
-#cat $CWD/patch/calligra/calligra3_poppler-0.71.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against poppler 0.72:
-#cat $CWD/patch/calligra/calligra3_poppler-0.72.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against poppler 0.73:
-#cat $CWD/patch/calligra/calligra3_poppler-0.73.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/calligra/calligra3_poppler-0.71.patch b/kde/patch/calligra/calligra3_poppler-0.71.patch
deleted file mode 100644
index 65284a3..0000000
--- a/kde/patch/calligra/calligra3_poppler-0.71.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-diff --git a/filters/karbon/pdf/PdfImport.cpp b/filters/karbon/pdf/PdfImport.cpp
-index 48b08dfa32d..e910dae0756 100644
---- a/filters/karbon/pdf/PdfImport.cpp
-+++ b/filters/karbon/pdf/PdfImport.cpp
-@@ -88,9 +88,9 @@ KoFilter::ConversionStatus PdfImport::convert(const QByteArray& from, const QByt
- SvgOutputDev * dev = new SvgOutputDev(m_chain->outputFile());
- if (dev->isOk()) {
- int rotate = 0;
-- GBool useMediaBox = gTrue;
-- GBool crop = gFalse;
-- GBool printing = gFalse;
-+ bool useMediaBox = true;
-+ bool crop = false;
-+ bool printing = false;
- pdfDoc->displayPages(dev, firstPage, lastPage, hDPI, vDPI, rotate, useMediaBox, crop, printing);
- dev->dumpContent();
- }
-diff --git a/filters/karbon/pdf/SvgOutputDev.cpp b/filters/karbon/pdf/SvgOutputDev.cpp
-index 5692824bc45..43205170991 100644
---- a/filters/karbon/pdf/SvgOutputDev.cpp
-+++ b/filters/karbon/pdf/SvgOutputDev.cpp
-@@ -39,7 +39,7 @@ class SvgOutputDev::Private
- {
- public:
- Private(const QString &fname)
-- : svgFile(fname), defs(0), body(0), state(gTrue)
-+ : svgFile(fname), defs(0), body(0), state(true)
- , brush(Qt::SolidPattern) {}
-
- ~Private() {
-@@ -52,7 +52,7 @@ public:
- QString defsData;
- QTextStream * defs;
- QTextStream * body;
-- GBool state;
-+ bool state;
- QSizeF pageSize;
- QPen pen;
- QBrush brush;
-@@ -62,7 +62,7 @@ SvgOutputDev::SvgOutputDev(const QString &fileName)
- : d(new Private(fileName))
- {
- if (! d->svgFile.open(QIODevice::WriteOnly)) {
-- d->state = gFalse;
-+ d->state = false;
- return;
- }
-
-@@ -75,24 +75,24 @@ SvgOutputDev::~SvgOutputDev()
- delete d;
- }
-
--GBool SvgOutputDev::isOk()
-+bool SvgOutputDev::isOk()
- {
- return d->state;
- }
-
--GBool SvgOutputDev::upsideDown()
-+bool SvgOutputDev::upsideDown()
- {
-- return gTrue;
-+ return true;
- }
-
--GBool SvgOutputDev::useDrawChar()
-+bool SvgOutputDev::useDrawChar()
- {
-- return gFalse;
-+ return false;
- }
-
--GBool SvgOutputDev::interpretType3Chars()
-+bool SvgOutputDev::interpretType3Chars()
- {
-- return gFalse;
-+ return false;
- }
-
- void SvgOutputDev::startPage(int pageNum, GfxState *state, XRef */*xref*/)
-@@ -480,7 +480,7 @@ void SvgOutputDev::drawString(GfxState * state, GooString * s)
-
- void SvgOutputDev::drawImage(GfxState *state, Object */*ref*/, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- int *maskColors, GBool /*inlineImg*/)
-+ int *maskColors, bool /*inlineImg*/)
- {
- ImageStream * imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), colorMap->getBits());
- imgStr->reset();
-@@ -549,7 +549,7 @@ void SvgOutputDev::drawImage(GfxState *state, Object */*ref*/, Stream *str,
-
- void SvgOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- GBool /*interpolate*/, int *maskColors, GBool inlineImg)
-+ bool /*interpolate*/, int *maskColors, bool inlineImg)
- {
- drawImage(state, ref, str, width, height, colorMap, maskColors, inlineImg);
- }
-diff --git a/filters/karbon/pdf/SvgOutputDev.h b/filters/karbon/pdf/SvgOutputDev.h
-index 2a4490848bf..cdb1d4e43b1 100644
---- a/filters/karbon/pdf/SvgOutputDev.h
-+++ b/filters/karbon/pdf/SvgOutputDev.h
-@@ -44,11 +44,11 @@ public:
- explicit SvgOutputDev(const QString &fileName);
- virtual ~SvgOutputDev();
-
-- GBool isOk();
-+ bool isOk();
-
-- virtual GBool upsideDown();
-- virtual GBool useDrawChar();
-- virtual GBool interpretType3Chars();
-+ virtual bool upsideDown();
-+ virtual bool useDrawChar();
-+ virtual bool interpretType3Chars();
- virtual void startPage(int pageNum, GfxState *state, XRef *xref);
- virtual void endPage();
-
-@@ -63,10 +63,10 @@ public:
- // images
- virtual void drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- int *maskColors, GBool inlineImg);
-+ int *maskColors, bool inlineImg);
- virtual void drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- GBool interpolate, int *maskColors, GBool inlineImg);
-+ bool interpolate, int *maskColors, bool inlineImg);
-
- // styles
- virtual void updateAll(GfxState *state);
diff --git a/kde/patch/calligra/calligra3_poppler-0.72.patch b/kde/patch/calligra/calligra3_poppler-0.72.patch
deleted file mode 100644
index 2cab98f..0000000
--- a/kde/patch/calligra/calligra3_poppler-0.72.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-diff --git a/filters/karbon/pdf/SvgOutputDev.cpp b/filters/karbon/pdf/SvgOutputDev.cpp
-index 80f01a5f76f..ea69228dbc1 100644
---- a/filters/karbon/pdf/SvgOutputDev.cpp
-+++ b/filters/karbon/pdf/SvgOutputDev.cpp
-@@ -407,7 +407,7 @@ void SvgOutputDev::drawString(GfxState * state, const GooString * s)
-
- QString str;
-
-- const char * p = s->getCString();
-+ const char * p = s->c_str();
- int len = s->getLength();
- CharCode code;
- Unicode *u = nullptr;
-@@ -459,11 +459,11 @@ void SvgOutputDev::drawString(GfxState * state, const GooString * s)
- *d->body << " y=\"" << y << "px\"";
-
- if (font && font->getFamily()) {
-- *d->body << " font-family=\"" << QString::fromLatin1(font->getFamily()->getCString()) << "\"";
-- //debugPdf << "font family:" << QString::fromLatin1( font->getFamily()->getCString() );
-+ *d->body << " font-family=\"" << QString::fromLatin1(font->getFamily()->c_str()) << "\"";
-+ //debugPdf << "font family:" << QString::fromLatin1( font->getFamily()->c_str() );
- } else if (font && font->getName()) {
-- *d->body << " font-family=\"" << QString::fromLatin1(font->getName()->getCString()) << "\"";
-- //debugPdf << "font name:" << QString::fromLatin1( font->getName()->getCString() );
-+ *d->body << " font-family=\"" << QString::fromLatin1(font->getName()->c_str()) << "\"";
-+ //debugPdf << "font name:" << QString::fromLatin1( font->getName()->c_str() );
- }
- *d->body << " font-size=\"" << qMax(state->getFontSize(), state->getTransformedFontSize()) << "px\"";
-
diff --git a/kde/patch/calligra/calligra3_poppler-0.73.patch b/kde/patch/calligra/calligra3_poppler-0.73.patch
deleted file mode 100644
index 86738de..0000000
--- a/kde/patch/calligra/calligra3_poppler-0.73.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From a1ddd91e6c354e8f0dda40f8a522053c3fa19c39 Mon Sep 17 00:00:00 2001
-From: Albert Astals Cid <aacid@kde.org>
-Date: Tue, 15 Jan 2019 22:24:08 +0100
-Subject: [PATCH] Guchar -> unsigned char
-
-It was just a typdef and it's now gone
----
- filters/karbon/pdf/SvgOutputDev.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/filters/karbon/pdf/SvgOutputDev.cpp b/filters/karbon/pdf/SvgOutputDev.cpp
-index 80f01a5f76f..1a5aa30bc40 100644
---- a/filters/karbon/pdf/SvgOutputDev.cpp
-+++ b/filters/karbon/pdf/SvgOutputDev.cpp
-@@ -496,7 +496,7 @@ void SvgOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- if (maskColors) {
- for (int y = 0; y < height; y++) {
- dest = (unsigned int *)(buffer + y * 4 * width);
-- Guchar * pix = imgStr->getLine();
-+ unsigned char * pix = imgStr->getLine();
- colorMap->getRGBLine(pix, dest, width);
-
- for (int x = 0; x < width; x++) {
-@@ -515,7 +515,7 @@ void SvgOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- } else {
- for (int y = 0; y < height; y++) {
- dest = (unsigned int *)(buffer + y * 4 * width);
-- Guchar * pix = imgStr->getLine();
-+ unsigned char * pix = imgStr->getLine();
- colorMap->getRGBLine(pix, dest, width);
- }
-
diff --git a/kde/patch/calligra/calligra3_qt511.patch b/kde/patch/calligra/calligra3_qt511.patch
deleted file mode 100644
index 0ddf0f2..0000000
--- a/kde/patch/calligra/calligra3_qt511.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From ee83e0f2c251072e47a2799619cdc79efe67e651 Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Tue, 3 Apr 2018 00:31:19 +0200
-Subject: Fix compilation with Qt 5.11 (missing include)
-
----
- stage/part/KPrPresentationTool.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/stage/part/KPrPresentationTool.cpp b/stage/part/KPrPresentationTool.cpp
-index ae743da..3007f91 100644
---- a/stage/part/KPrPresentationTool.cpp
-+++ b/stage/part/KPrPresentationTool.cpp
-@@ -32,6 +32,7 @@
- #include <QDesktopServices>
- #include <QUrl>
- #include <QDBusConnection>
-+#include <QFrame>
-
- #include <KoShape.h>
- #include <KoShapeManager.h>
----
-From a7ebecb9fbee2190e649c44ed53f1299013baa30 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sun, 18 Mar 2018 11:56:57 +0100
-Subject: Fix build with Qt 5.11 (missing headers)
-
-Reviewers: #calligra:_3.0, anthonyfieroni, danders
-
-Reviewed By: #calligra:_3.0, anthonyfieroni, danders
-
-Subscribers: anthonyfieroni, danders
-
-Tags: #calligra:_3.0
-
-Differential Revision: https://phabricator.kde.org/D11454
----
- libs/widgets/KoCsvImportDialog.cpp | 1 +
- libs/widgets/KoPageLayoutWidget.cpp | 2 ++
- plugins/chartshape/dialogs/TableEditorDialog.cpp | 1 +
- plugins/formulashape/FormulaToolWidget.cpp | 1 +
- sheets/dialogs/LayoutDialog.cpp | 1 +
- words/part/dialogs/KWAnchoringProperties.cpp | 1 +
- words/part/dialogs/KWRunAroundProperties.cpp | 2 ++
- 15 files changed, 18 insertions(+), 1 deletion(-)
-
-diff --git a/libs/widgets/KoCsvImportDialog.cpp b/libs/widgets/KoCsvImportDialog.cpp
-index 0ffdcf6..cdca006 100644
---- a/libs/widgets/KoCsvImportDialog.cpp
-+++ b/libs/widgets/KoCsvImportDialog.cpp
-@@ -21,6 +21,7 @@
- #include "KoCsvImportDialog.h"
-
- // Qt
-+#include <QButtonGroup>
- #include <QTextCodec>
- #include <QTextStream>
-
-diff --git a/libs/widgets/KoPageLayoutWidget.cpp b/libs/widgets/KoPageLayoutWidget.cpp
-index f91555c..a3816f9 100644
---- a/libs/widgets/KoPageLayoutWidget.cpp
-+++ b/libs/widgets/KoPageLayoutWidget.cpp
-@@ -23,6 +23,8 @@
-
- #include <KoUnit.h>
-
-+#include <QButtonGroup>
-+
- class Q_DECL_HIDDEN KoPageLayoutWidget::Private
- {
- public:
-diff --git a/plugins/chartshape/dialogs/TableEditorDialog.cpp b/plugins/chartshape/dialogs/TableEditorDialog.cpp
-index c0d5136..d2a772e 100644
---- a/plugins/chartshape/dialogs/TableEditorDialog.cpp
-+++ b/plugins/chartshape/dialogs/TableEditorDialog.cpp
-@@ -24,6 +24,7 @@
-
- // Qt
- #include <QAbstractItemModel>
-+#include <QAction>
-
- // Calligra
- #include <KoIcon.h>
-diff --git a/plugins/formulashape/FormulaToolWidget.cpp b/plugins/formulashape/FormulaToolWidget.cpp
-index ed10919..8f52177 100644
---- a/plugins/formulashape/FormulaToolWidget.cpp
-+++ b/plugins/formulashape/FormulaToolWidget.cpp
-@@ -30,6 +30,7 @@
- #include <QWidgetAction>
- #include <QTableWidget>
- #include <QAction>
-+#include <QHeaderView>
- #include <QMenu>
-
- FormulaToolWidget::FormulaToolWidget( KoFormulaTool* tool, QWidget* parent )
-diff --git a/sheets/dialogs/LayoutDialog.cpp b/sheets/dialogs/LayoutDialog.cpp
-index a0a9832..7d7db53 100644
---- a/sheets/dialogs/LayoutDialog.cpp
-+++ b/sheets/dialogs/LayoutDialog.cpp
-@@ -36,6 +36,7 @@
- #include <math.h>
-
- #include <QIntValidator>
-+#include <QButtonGroup>
- #include <QCheckBox>
- #include <QFrame>
- #include <QLabel>
-diff --git a/words/part/dialogs/KWAnchoringProperties.cpp b/words/part/dialogs/KWAnchoringProperties.cpp
-index d64208c..bfddb3a 100644
---- a/words/part/dialogs/KWAnchoringProperties.cpp
-+++ b/words/part/dialogs/KWAnchoringProperties.cpp
-@@ -35,6 +35,7 @@
-
- #include <kundo2command.h>
-
-+#include <QButtonGroup>
- #include <QComboBox>
-
- const int KWAnchoringProperties::vertRels[4][20] = {
-diff --git a/words/part/dialogs/KWRunAroundProperties.cpp b/words/part/dialogs/KWRunAroundProperties.cpp
-index e38599a..7e8b2d5 100644
---- a/words/part/dialogs/KWRunAroundProperties.cpp
-+++ b/words/part/dialogs/KWRunAroundProperties.cpp
-@@ -28,6 +28,8 @@
-
- #include <kundo2command.h>
-
-+#include <QButtonGroup>
-+
- KWRunAroundProperties::KWRunAroundProperties(FrameConfigSharedState *state)
- : m_state(state)
- {
---
-cgit v0.11.2
-
diff --git a/kde/patch/calligra/calligra3_qt513.patch b/kde/patch/calligra/calligra3_qt513.patch
deleted file mode 100644
index 987b353..0000000
--- a/kde/patch/calligra/calligra3_qt513.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 0c5430697bdcf41a45046107b28014e40c49a11a Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Tue, 23 Jul 2019 13:02:34 +0200
-Subject: [PATCH] Fix compilation with Qt 5.13 (missing include)
-
----
- sheets/plugins/calendar/CalendarToolWidget.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/sheets/plugins/calendar/CalendarToolWidget.cpp b/sheets/plugins/calendar/CalendarToolWidget.cpp
-index b10b23022a2..0c5eeb68cf3 100644
---- a/sheets/plugins/calendar/CalendarToolWidget.cpp
-+++ b/sheets/plugins/calendar/CalendarToolWidget.cpp
-@@ -30,6 +30,7 @@
- #include <kdatepicker.h>
-
- #include <QPushButton>
-+#include <QDate>
-
- namespace Calligra
- {
-
diff --git a/kde/patch/calligraplan.patch b/kde/patch/calligraplan.patch
index 4cc1f85..5895d0c 100644
--- a/kde/patch/calligraplan.patch
+++ b/kde/patch/calligraplan.patch
@@ -1,11 +1,2 @@
-# Fix build against Qt 5.11 (fixed in 3.2.0):
-#cat $CWD/patch/calligraplan/calligraplan.qt-511.patch | patch -p2 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against kcalendarcore (fixed in 3.2.0):
-#cat $CWD/patch/calligraplan/calligraplan.kcalcore.1.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/calligraplan/calligraplan.kcalcore.2.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/calligraplan/calligraplan.kcalendarcore.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix missing include (fixed in 3.2.0):
-#cat $CWD/patch/calligraplan/calligraplan.missingheader.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
+# Fix build against Qt 5.15:
+cat $CWD/patch/calligraplan/calligraplan.qt-5.15.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/calligraplan/calligraplan.kcalcore.1.patch b/kde/patch/calligraplan/calligraplan.kcalcore.1.patch
deleted file mode 100644
index dcbe903..0000000
--- a/kde/patch/calligraplan/calligraplan.kcalcore.1.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 3a01affd66f8dfdcc124e23595217f3ae5a09723 Mon Sep 17 00:00:00 2001
-From: Dag Andersen <danders@get2net.dk>
-Date: Thu, 20 Jun 2019 10:52:00 +0200
-Subject: ICal: Adapt to api changes in KCalCore
-
----
- CMakeLists.txt | 37 +++++++++++-----------
- src/CMakeLists.txt | 4 +++
- .../filters/icalendar/export/icalendarexport.cpp | 5 +++
- 3 files changed, 27 insertions(+), 19 deletions(-)
-
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index 0dabbaf..49fa642 100644
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -75,6 +75,10 @@ if ("${KF5CalendarCore_VERSION}" VERSION_GREATER 5.6.40)
- set(HAVE_QDATETIME_KCALCORE TRUE)
- endif()
-
-+if ("${KF5CalendarCore_VERSION}" VERSION_GREATER 5.11.42)
-+ set(KCALCORE_HAVE_NO_PERSION_PTR TRUE)
-+endif()
-+
- if (PLANCHARTDEBUG)
- add_definitions(-DPLAN_CHART_DEBUG)
- endif ()
-diff --git a/src/plugins/filters/icalendar/export/icalendarexport.cpp b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-index cd75598..ce29bfe 100644
---- a/src/plugins/filters/icalendar/export/icalendarexport.cpp
-+++ b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-@@ -141,8 +141,13 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- todo->setOrganizer(node->projectNode()->leader());
- }
- if ( node->type() != Node::Type_Project && ! node->leader().isEmpty()) {
-+#if KCALCORE_HAVE_NO_PERSION_PTR
-+ KCalCore::Person p = KCalCore::Person::fromFullName(node->leader());
-+ KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p.name(), p.email()));
-+#else
- KCalCore::Person::Ptr p = KCalCore::Person::fromFullName(node->leader());
- KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p->name(), p->email()));
-+#endif
- a->setRole(KCalCore::Attendee::NonParticipant);
- todo->addAttendee(a);
- }
---
-cgit v1.1
-
diff --git a/kde/patch/calligraplan/calligraplan.kcalcore.2.patch b/kde/patch/calligraplan/calligraplan.kcalcore.2.patch
deleted file mode 100644
index 5c118e1..0000000
--- a/kde/patch/calligraplan/calligraplan.kcalcore.2.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From a9eaf1c98ed408fd6e8897fa9e2f99ed17db1ebc Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Tue, 23 Jul 2019 12:26:17 +0200
-Subject: Port to KCalCore API changes
-
-The code is in #if 0, but I tested compilation of this in the calligra
-stable branch:
-https://commits.kde.org/calligra/2d484fda1b31a72659088a4bfce5c3708e923cb0
-
-So you can use KCalCore again if you want :-)
-It's turning into a KF5 framework so the API will be stable from now on.
-
-CCMAIL: danders@get2net.dk
----
- .../filters/icalendar/export/icalendarexport.cpp | 20 +++++++++++++++++---
- 1 file changed, 17 insertions(+), 3 deletions(-)
-
-diff --git a/src/plugins/filters/icalendar/export/icalendarexport.cpp b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-index b21320f..828b641 100644
---- a/src/plugins/filters/icalendar/export/icalendarexport.cpp
-+++ b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-@@ -35,6 +35,7 @@
- #include <kcalcore/attachment.h>
- #include <kcalcore/icalformat.h>
- #include <kcalcore/memorycalendar.h>
-+#include <kcalcore_version.h>
-
- #include <QTextCodec>
- #include <QByteArray>
-@@ -355,14 +356,15 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- todo->setOrganizer(node->projectNode()->leader());
- }
- if ( node->type() != Node::Type_Project && ! node->leader().isEmpty()) {
--#if KCALCORE_HAVE_NO_PERSION_PTR
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
- KCalCore::Person p = KCalCore::Person::fromFullName(node->leader());
-- KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p.name(), p.email()));
-+ KCalCore::Attendee a(p.name(), p.email());
-+ a.setRole(KCalCore::Attendee::NonParticipant);
- #else
- KCalCore::Person::Ptr p = KCalCore::Person::fromFullName(node->leader());
- KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p->name(), p->email()));
--#endif
- a->setRole(KCalCore::Attendee::NonParticipant);
-+#endif
- todo->addAttendee(a);
- }
- DateTime st = node->startTime(id);
-@@ -381,13 +383,21 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- const QList<Resource*> lst = task->requestedResources();
- foreach(const Resource *r, lst) {
- if (r->type() == Resource::Type_Work) {
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
-+ todo->addAttendee(KCalCore::Attendee(r->name(), r->email()));
-+#else
- todo->addAttendee(KCalCore::Attendee::Ptr(new KCalCore::Attendee(r->name(), r->email())));
-+#endif
- }
- }
- } else {
- foreach(const Resource *r, s->resources()) {
- if (r->type() == Resource::Type_Work) {
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
-+ todo->addAttendee(KCalCore::Attendee(r->name(), r->email()));
-+#else
- todo->addAttendee(KCalCore::Attendee::Ptr(new KCalCore::Attendee(r->name(), r->email())));
-+#endif
- }
- }
-
-@@ -398,7 +408,11 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- todo->setPercentComplete(task->completion().percentFinished());
- }
- foreach(const Document *doc, node->documents().documents()) {
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
-+ todo->addAttachment(KCalCore::Attachment(doc->url().url()));
-+#else
- todo->addAttachment(KCalCore::Attachment::Ptr(new KCalCore::Attachment(doc->url().url())));
-+#endif
- }
- if (! parent.isNull()) {
- todo->setRelatedTo(parent->uid(), KCalCore::Incidence::RelTypeParent);
---
-cgit v1.1
-
diff --git a/kde/patch/calligraplan/calligraplan.kcalendarcore.patch b/kde/patch/calligraplan/calligraplan.kcalendarcore.patch
deleted file mode 100644
index 42aa135..0000000
--- a/kde/patch/calligraplan/calligraplan.kcalendarcore.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 2f5505cf03ff865349d06e1d5c39007c52e7cd10 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <asturm@gentoo.org>
-Date: Fri, 16 Aug 2019 15:49:09 +0200
-Subject: [PATCH] Fix headers after kcalcore->kcalendercore rename happened
-
----
- .../filters/icalendar/export/icalendarexport.cpp | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/plugins/filters/icalendar/export/icalendarexport.cpp b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-index bb6b097d..729d6e50 100644
---- a/src/plugins/filters/icalendar/export/icalendarexport.cpp
-+++ b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-@@ -31,11 +31,11 @@
- #include <kptdocuments.h>
- #include "kptdebug.h"
-
--#include <kcalcore/attendee.h>
--#include <kcalcore/attachment.h>
--#include <kcalcore/icalformat.h>
--#include <kcalcore/memorycalendar.h>
--#include <kcalcore_version.h>
-+#include <kcalendarcore/attendee.h>
-+#include <kcalendarcore/attachment.h>
-+#include <kcalendarcore/icalformat.h>
-+#include <kcalendarcore/memorycalendar.h>
-+#include <kcalcore_version.h>
-
- #include <QTextCodec>
- #include <QByteArray>
---
-2.22.1
-
-
diff --git a/kde/patch/calligraplan/calligraplan.missingheader.patch b/kde/patch/calligraplan/calligraplan.missingheader.patch
deleted file mode 100644
index b5941c5..0000000
--- a/kde/patch/calligraplan/calligraplan.missingheader.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From fe36bf6f0dc1f0c1e927850dd78093cfe3b7aae2 Mon Sep 17 00:00:00 2001
-From: Albert Astals Cid <aacid@kde.org>
-Date: Sun, 28 Jul 2019 00:07:33 +0200
-Subject: Fix compile on CI
-
-src/workpackage/view.h:148:31: error: field m_scheduleActions has incomplete type QMap<QAction*, KPlato::Schedule*>
----
- src/workpackage/view.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/workpackage/view.h b/src/workpackage/view.h
-index 6cae32b..cd2fc4e 100644
---- a/src/workpackage/view.h
-+++ b/src/workpackage/view.h
-@@ -24,6 +24,7 @@
-
- #include <KoView.h>
-
-+#include <QMap>
- #include <QStackedWidget>
-
- class QPrinter;
---
-cgit v1.1
-
diff --git a/kde/patch/calligraplan/calligraplan.qt-5.15.patch b/kde/patch/calligraplan/calligraplan.qt-5.15.patch
new file mode 100644
index 0000000..c8962a1
--- /dev/null
+++ b/kde/patch/calligraplan/calligraplan.qt-5.15.patch
@@ -0,0 +1,10 @@
+--- ./src/libs/ui/kptganttitemdelegate.cpp.orig 2019-12-12 05:48:13.000000000 -0600
++++ ./src/libs/ui/kptganttitemdelegate.cpp 2020-07-18 14:48:48.058351438 -0500
+@@ -28,6 +28,7 @@
+ #include <QModelIndex>
+ #include <QApplication>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QLocale>
+
+ #include <KLocalizedString>
diff --git a/kde/patch/calligraplan/calligraplan.qt-511.patch b/kde/patch/calligraplan/calligraplan.qt-511.patch
deleted file mode 100644
index c0776fa..0000000
--- a/kde/patch/calligraplan/calligraplan.qt-511.patch
+++ /dev/null
@@ -1,125 +0,0 @@
-From f53805bdc108b608e40f217e6a78e7e4df4284f2 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sun, 18 Mar 2018 11:56:57 +0100
-Subject: [PATCH] Fix build with Qt 5.11 (missing headers)
-
-Reviewers: #calligra:_3.0
-
-Tags: #calligra:_3.0
-
-Differential Revision: https://phabricator.kde.org/D11454
----
- plan/src/kptview.h | 1 +
- plan/src/kptviewlist.cpp | 1 +
- plan/src/libs/ui/kptaccountseditor.cpp | 1 +
- plan/src/libs/ui/kptdocumentspanel.h | 1 +
- plan/src/libs/ui/kptitemviewsettup.cpp | 2 +-
- plan/src/libs/ui/kpttaskeditor.cpp | 1 +
- plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp | 1 +
- plan/src/libs/widgets/KoPageLayoutWidget.cpp | 2 ++
- 15 files changed, 18 insertions(+), 1 deletion(-)
-
-diff --git a/plan/src/kptview.h b/plan/src/kptview.h
-index 44d11935e71..a98e55342db 100644
---- a/plan/src/kptview.h
-+++ b/plan/src/kptview.h
-@@ -28,6 +28,7 @@
- #include "kptcontext.h"
- #include "kptviewbase.h"
-
-+#include <QActionGroup>
- #include <QDockWidget>
- #include <QMap>
-
-diff --git a/plan/src/kptviewlist.cpp b/plan/src/kptviewlist.cpp
-index f34e702e055..0e6db7b2ffe 100644
---- a/plan/src/kptviewlist.cpp
-+++ b/plan/src/kptviewlist.cpp
-@@ -25,6 +25,7 @@
- #include <QStyle>
- #include <QBrush>
- #include <QContextMenuEvent>
-+#include <QHeaderView>
- #include <QMenu>
-
- #include <kmessagebox.h>
-diff --git a/plan/src/libs/ui/kptaccountseditor.cpp b/plan/src/libs/ui/kptaccountseditor.cpp
-index 7991fafd779..54e3a87c94f 100644
---- a/plan/src/libs/ui/kptaccountseditor.cpp
-+++ b/plan/src/libs/ui/kptaccountseditor.cpp
-@@ -40,6 +40,7 @@
- #include <QContextMenuEvent>
- #include <QMenu>
- #include <QAction>
-+#include <QHeaderView>
-
- #include <KLocalizedString>
- #include <kactioncollection.h>
-diff --git a/plan/src/libs/ui/kptdocumentspanel.h b/plan/src/libs/ui/kptdocumentspanel.h
-index 00ea3af80b2..491cb1ebb86 100644
---- a/plan/src/libs/ui/kptdocumentspanel.h
-+++ b/plan/src/libs/ui/kptdocumentspanel.h
-@@ -26,6 +26,7 @@
-
- #include "kptdocuments.h"
-
-+#include <QModelIndexList>
- #include <QWidget>
- #include <kundo2qstack.h>
-
-diff --git a/plan/src/libs/ui/kptitemviewsettup.cpp b/plan/src/libs/ui/kptitemviewsettup.cpp
-index d1c3b1fc157..7c97a070b9a 100644
---- a/plan/src/libs/ui/kptitemviewsettup.cpp
-+++ b/plan/src/libs/ui/kptitemviewsettup.cpp
-@@ -25,9 +25,9 @@
-
- #include "KoPageLayoutWidget.h"
-
-+#include <QHeaderView>
- #include <QPushButton>
-
--
- namespace KPlato
- {
-
-diff --git a/plan/src/libs/ui/kpttaskeditor.cpp b/plan/src/libs/ui/kpttaskeditor.cpp
-index 21546118d33..91db5acbb18 100644
---- a/plan/src/libs/ui/kpttaskeditor.cpp
-+++ b/plan/src/libs/ui/kpttaskeditor.cpp
-@@ -45,6 +45,7 @@
- #include <QVBoxLayout>
- #include <QDragMoveEvent>
- #include <QAction>
-+#include <QHeaderView>
- #include <QMenu>
-
- #include <kactionmenu.h>
-diff --git a/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp b/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp
-index 344ebc2b599..9146f06ab8c 100644
---- a/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp
-+++ b/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp
-@@ -31,6 +31,7 @@
- #include <KFile>
-
- #include <QAction>
-+#include <QHeaderView>
- #include <QTreeView>
- #include <QStandardItemModel>
- #include <QModelIndex>
-diff --git a/plan/src/libs/widgets/KoPageLayoutWidget.cpp b/plan/src/libs/widgets/KoPageLayoutWidget.cpp
-index c9e17b748a9..b67e9848807 100644
---- a/plan/src/libs/widgets/KoPageLayoutWidget.cpp
-+++ b/plan/src/libs/widgets/KoPageLayoutWidget.cpp
-@@ -23,6 +23,8 @@
-
- #include <KoUnit.h>
-
-+#include <QButtonGroup>
-+
- class Q_DECL_HIDDEN KoPageLayoutWidget::Private
- {
- public:
---
-2.16.2
-
-
diff --git a/kde/patch/cantor.patch b/kde/patch/cantor.patch
deleted file mode 100644
index 54f2b47..0000000
--- a/kde/patch/cantor.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix build against KF 5.31.0 (repaired in 16.12.3):
-#cat $CWD/patch/cantor/cantor_python.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/cantor/cantor_julia.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/cantor/cantor_julia.patch b/kde/patch/cantor/cantor_julia.patch
deleted file mode 100644
index 5c381ca..0000000
--- a/kde/patch/cantor/cantor_julia.patch
+++ /dev/null
@@ -1,193 +0,0 @@
-Patch taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/plain/kde-apps/cantor/files/cantor-16.12.2-julia-kf-5.31.patch
-
-From 45322d9f58f50df3d4d5755d4199e579f6fd8646 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sat, 11 Feb 2017 22:46:35 +0100
-Subject: [PATCH] [julia] Fix build with -fno-operator-names
-
-REVIEW: 129942
----
- src/backends/julia/juliaexpression.cpp | 6 +++---
- src/backends/julia/juliaextensions.cpp | 4 ++--
- src/backends/julia/juliahighlighter.cpp | 4 ++--
- src/backends/julia/juliakeywords.cpp | 10 +++++-----
- src/backends/julia/juliaserver/juliaserver.cpp | 4 ++--
- src/backends/julia/juliaserver/main.cpp | 4 ++--
- src/backends/julia/juliasession.cpp | 4 ++--
- 7 files changed, 18 insertions(+), 18 deletions(-)
-
-diff --git a/src/backends/julia/juliaexpression.cpp b/src/backends/julia/juliaexpression.cpp
-index 27cdd85..618200d 100644
---- a/src/backends/julia/juliaexpression.cpp
-+++ b/src/backends/julia/juliaexpression.cpp
-@@ -40,7 +40,7 @@ void JuliaExpression::evaluate()
-
- // Plots integration
- m_plot_filename.clear();
-- if (juliaSession->integratePlots() and checkPlotShowingCommands()) {
-+ if (juliaSession->integratePlots() && checkPlotShowingCommands()) {
- // Simply add plot saving command to the end of execution
- QStringList inlinePlotFormats;
- inlinePlotFormats << QLatin1String("svg");
-@@ -73,8 +73,8 @@ void JuliaExpression::finalize()
- setResult(new Cantor::TextResult(juliaSession->getOutput()));
- setStatus(Cantor::Expression::Error);
- } else {
-- if (not m_plot_filename.isEmpty()
-- and QFileInfo(m_plot_filename).exists()) {
-+ if (!m_plot_filename.isEmpty()
-+ && QFileInfo(m_plot_filename).exists()) {
- // If we have plot in result, show it
- setResult(
- new Cantor::ImageResult(QUrl::fromLocalFile(m_plot_filename)));
-diff --git a/src/backends/julia/juliaextensions.cpp b/src/backends/julia/juliaextensions.cpp
-index 4585c6f..ad5e3a9 100644
---- a/src/backends/julia/juliaextensions.cpp
-+++ b/src/backends/julia/juliaextensions.cpp
-@@ -138,7 +138,7 @@ QString JuliaPlotExtension::plotFunction2d(
- {
- auto new_left = left;
- auto new_right = right;
-- if (new_left.isEmpty() and new_right.isEmpty()) {
-+ if (new_left.isEmpty() && new_right.isEmpty()) {
- new_left = QLatin1String("-1");
- new_right = QLatin1String("1");
- } else if (new_left.isEmpty()) {
-@@ -165,7 +165,7 @@ QString JuliaPlotExtension::plotFunction3d(
- {
-
- auto update_interval = [](Interval &interval) {
-- if (interval.first.isEmpty() and interval.second.isEmpty()) {
-+ if (interval.first.isEmpty() && interval.second.isEmpty()) {
- interval.first = QLatin1String("-1");
- interval.second = QLatin1String("1");
- } else if (interval.first.isEmpty()) {
-diff --git a/src/backends/julia/juliahighlighter.cpp b/src/backends/julia/juliahighlighter.cpp
-index 4795361..f7d3622 100644
---- a/src/backends/julia/juliahighlighter.cpp
-+++ b/src/backends/julia/juliahighlighter.cpp
-@@ -98,7 +98,7 @@ void JuliaHighlighter::highlightBlock(const QString &text)
- while (pos < text.length()) {
- // Trying to close current environments
- bool triggered = false;
-- for (int i = 0; i < flags.size() and not triggered; i++) {
-+ for (int i = 0; i < flags.size() && !triggered; i++) {
- int flag = flags[i];
- QRegExp &regexp = regexps_ends[i];
- QTextCharFormat &format = formats[i];
-@@ -144,7 +144,7 @@ void JuliaHighlighter::highlightBlock(const QString &text)
- singleLineCommentStart.indexIn(text, pos);
-
- if (singleLineCommentStartPos != -1
-- and singleLineCommentStartPos < minPos) {
-+ && singleLineCommentStartPos < minPos) {
- // single line comment starts earlier
- setFormat(pos, text.length() - pos, commentFormat());
- break;
-diff --git a/src/backends/julia/juliakeywords.cpp b/src/backends/julia/juliakeywords.cpp
-index f0a5846..8a0efec 100644
---- a/src/backends/julia/juliakeywords.cpp
-+++ b/src/backends/julia/juliakeywords.cpp
-@@ -62,11 +62,11 @@ void JuliaKeywords::loadFromFile()
- const QStringRef name = xml.name();
-
- if (name == QLatin1String("keywords")
-- or name == QLatin1String("variables")
-- or name == QLatin1String("plot_showing_commands")) {
-+ || name == QLatin1String("variables")
-+ || name == QLatin1String("plot_showing_commands")) {
- while (xml.readNextStartElement()) {
- Q_ASSERT(
-- xml.isStartElement() and xml.name() == QLatin1String("word")
-+ xml.isStartElement() && xml.name() == QLatin1String("word")
- );
-
- const QString text = xml.readElementText();
-@@ -91,7 +91,7 @@ void JuliaKeywords::loadFromFile()
-
- void JuliaKeywords::addVariable(const QString &variable)
- {
-- if (not m_variables.contains(variable)) {
-+ if (!m_variables.contains(variable)) {
- m_variables << variable;
- }
- }
-@@ -104,7 +104,7 @@ void JuliaKeywords::clearVariables()
-
- void JuliaKeywords::addFunction(const QString &function)
- {
-- if (not m_functions.contains(function)) {
-+ if (!m_functions.contains(function)) {
- m_functions << function;
- }
- }
-diff --git a/src/backends/julia/juliaserver/juliaserver.cpp b/src/backends/julia/juliaserver/juliaserver.cpp
-index c9beb4c..91585cf 100644
---- a/src/backends/julia/juliaserver/juliaserver.cpp
-+++ b/src/backends/julia/juliaserver/juliaserver.cpp
-@@ -47,7 +47,7 @@ void JuliaServer::runJuliaCommand(const QString &command)
- {
- // Redirect stdout, stderr to temprorary files
- QTemporaryFile output, error;
-- if (not output.open() or not error.open()) {
-+ if (!output.open() || !error.open()) {
- qFatal("Unable to create temprorary files for stdout/stderr");
- return;
- }
-@@ -90,7 +90,7 @@ void JuliaServer::runJuliaCommand(const QString &command)
- bool is_nothing = jl_unbox_bool(
- static_cast<jl_value_t *>(jl_call2(equality, nothing, val))
- );
-- if (not is_nothing) {
-+ if (!is_nothing) {
- jl_static_show(JL_STDOUT, val);
- }
- m_was_exception = false;
-diff --git a/src/backends/julia/juliaserver/main.cpp b/src/backends/julia/juliaserver/main.cpp
-index ad7e4d9..11687ec 100644
---- a/src/backends/julia/juliaserver/main.cpp
-+++ b/src/backends/julia/juliaserver/main.cpp
-@@ -30,7 +30,7 @@ int main(int argc, char *argv[])
- {
- QCoreApplication app(argc, argv);
-
-- if (not QDBusConnection::sessionBus().isConnected()) {
-+ if (!QDBusConnection::sessionBus().isConnected()) {
- qWarning() << "Can't connect to the D-Bus session bus.\n"
- "To start it, run: eval `dbus-launch --auto-syntax`";
- return 1;
-@@ -39,7 +39,7 @@ int main(int argc, char *argv[])
- const QString &serviceName =
- QString::fromLatin1("org.kde.Cantor.Julia-%1").arg(app.applicationPid());
-
-- if (not QDBusConnection::sessionBus().registerService(serviceName)) {
-+ if (!QDBusConnection::sessionBus().registerService(serviceName)) {
- qWarning() << QDBusConnection::sessionBus().lastError().message();
- return 2;
- }
-diff --git a/src/backends/julia/juliasession.cpp b/src/backends/julia/juliasession.cpp
-index 425e6cb..9183e11 100644
---- a/src/backends/julia/juliasession.cpp
-+++ b/src/backends/julia/juliasession.cpp
-@@ -86,7 +86,7 @@ void JuliaSession::login()
- QDBusConnection::sessionBus()
- );
-
-- if (not m_interface->isValid()) {
-+ if (!m_interface->isValid()) {
- qWarning() << QDBusConnection::sessionBus().lastError().message();
- return;
- }
-@@ -213,7 +213,7 @@ bool JuliaSession::getWasException()
- {
- const QDBusReply<bool> &reply =
- m_interface->call(QLatin1String("getWasException"));
-- return reply.isValid() and reply.value();
-+ return reply.isValid() && reply.value();
- }
-
- void JuliaSession::listVariables()
---
-2.10.2
-
diff --git a/kde/patch/cantor/cantor_python.patch b/kde/patch/cantor/cantor_python.patch
deleted file mode 100644
index aa2b398..0000000
--- a/kde/patch/cantor/cantor_python.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-Patch taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/plain/kde-apps/cantor/files/cantor-16.12.2-python-kf-5.31.patch
-
-commit 4b8ef6bed62daced90c7826985650c2a813d2996
-Author: Jonathan Riddell <jr@jriddell.org>
-Date: Wed Feb 8 14:56:48 2017 +0000
-
- remove modern C++ use to fix compile with current KDE policy
-
-diff --git a/src/backends/python/pythonhighlighter.cpp b/src/backends/python/pythonhighlighter.cpp
-index 4064524..87b10dd 100644
---- a/src/backends/python/pythonhighlighter.cpp
-+++ b/src/backends/python/pythonhighlighter.cpp
-@@ -87,7 +87,7 @@ void PythonHighlighter::highlightBlock(const QString &text)
- while (pos < text.length()) {
- // Trying to close current environments
- bool triggered = false;
-- for (int i = 0; i < flags.size() and not triggered; i++) {
-+ for (int i = 0; i < flags.size() && !triggered; i++) {
- int flag = flags[i];
- QRegExp &regexp = regexps[i];
- QTextCharFormat &format = formats[i];
-@@ -126,7 +126,7 @@ void PythonHighlighter::highlightBlock(const QString &text)
- singleLineCommentStart.indexIn(text, pos);
-
- if (singleLineCommentStartPos != -1
-- and singleLineCommentStartPos < minPos) {
-+ && singleLineCommentStartPos < minPos) {
- setFormat(pos, text.length() - pos, commentFormat());
- break;
- } else if (minRegexp) {
diff --git a/kde/patch/digikam.patch b/kde/patch/digikam.patch
deleted file mode 100644
index 8f50ec2..0000000
--- a/kde/patch/digikam.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-# Fix compilation with clang.
-# Fixed in digikam 5.5.0.
-#cat $CWD/patch/digikam/digikam_clang_fix.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix linking issue, backport from git master:
-#cd core
-# cat $CWD/patch/digikam/digikam_databasemodel.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cd -
-
-# Fix crashes with imagemagick 7 (fixed post digikam 6.4.0):
-cat $CWD/patch/digikam/digikam_imagemagick7.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/digikam/digikam_clang_fix.patch b/kde/patch/digikam/digikam_clang_fix.patch
deleted file mode 100644
index a4d77b0..0000000
--- a/kde/patch/digikam/digikam_clang_fix.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-Taken from:
-http://pkgs.fedoraproject.org/cgit/rpms/digikam.git/
-And added and extra '/core/' path componenent.
-
-From 86cd0d1d89c8b4d13f06dc8a353bdd99f13c4758 Mon Sep 17 00:00:00 2001
-From: Gilles Caulier <caulier.gilles@gmail.com>
-Date: Wed, 18 Jan 2017 10:13:20 +0100
-Subject: [PATCH 2/2] Fix compilation with clang
-
----
- libs/dmetadata/metaengine_p.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/core/libs/dmetadata/metaengine_p.cpp b/core/libs/dmetadata/metaengine_p.cpp
-index 2c83b58..2b44e06 100644
---- a/core/libs/dmetadata/metaengine_p.cpp
-+++ b/core/libs/dmetadata/metaengine_p.cpp
-@@ -49,7 +49,7 @@ extern "C"
- #include "digikam_debug.h"
-
- // Pragma directives to reduce warnings from Exiv2.
--#if not defined(__APPLE__) && defined(__GNUC__)
-+#if !defined(__APPLE__) && defined(__GNUC__)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- #endif
-@@ -723,7 +723,7 @@ void MetaEngine::Private::loadSidecarData(Exiv2::Image::AutoPtr xmpsidecar)
- } // namespace Digikam
-
- // Restore warnings
--#if not defined(__APPLE__) && defined(__GNUC__)
-+#if !defined(__APPLE__) && defined(__GNUC__)
- #pragma GCC diagnostic pop
- #endif
-
---
-2.9.3
-
diff --git a/kde/patch/digikam/digikam_databasemodel.patch b/kde/patch/digikam/digikam_databasemodel.patch
deleted file mode 100644
index 8b2fff7..0000000
--- a/kde/patch/digikam/digikam_databasemodel.patch
+++ /dev/null
@@ -1,13337 +0,0 @@
-From 7e00441c257e7e9e5dc5ab983fc06046fb72b0c5 Mon Sep 17 00:00:00 2001
-From: Gilles Caulier <caulier.gilles@gmail.com>
-Date: Sat, 22 Jul 2017 15:46:08 +0200
-Subject: fix broken linking stage under MacOS with macports. move database
- models into libdigikamdatabase. Let's others model in place to be included
- into libdigikamcore
-
----
- libs/database/CMakeLists.txt | 16 +-
- libs/database/models/imagefiltermodel.cpp | 1116 ++++++++++++++++++
- libs/database/models/imagefiltermodel.h | 299 +++++
- libs/database/models/imagefiltermodelpriv.cpp | 258 ++++
- libs/database/models/imagefiltermodelpriv.h | 159 +++
- libs/database/models/imagefiltermodelthreads.cpp | 40 +
- libs/database/models/imagefiltermodelthreads.h | 100 ++
- libs/database/models/imagefiltersettings.cpp | 952 +++++++++++++++
- libs/database/models/imagefiltersettings.h | 349 ++++++
- libs/database/models/imagelistmodel.cpp | 70 ++
- libs/database/models/imagelistmodel.h | 63 +
- libs/database/models/imagemodel.cpp | 1368 ++++++++++++++++++++++
- libs/database/models/imagemodel.h | 364 ++++++
- libs/database/models/imagesortsettings.cpp | 400 +++++++
- libs/database/models/imagesortsettings.h | 225 ++++
- libs/database/models/imagethumbnailmodel.cpp | 323 +++++
- libs/database/models/imagethumbnailmodel.h | 140 +++
- libs/database/models/imageversionsmodel.cpp | 183 +++
- libs/database/models/imageversionsmodel.h | 75 ++
- libs/models/CMakeLists.txt | 15 +-
- libs/models/imagefiltermodel.cpp | 1116 ------------------
- libs/models/imagefiltermodel.h | 299 -----
- libs/models/imagefiltermodelpriv.cpp | 258 ----
- libs/models/imagefiltermodelpriv.h | 159 ---
- libs/models/imagefiltermodelthreads.cpp | 40 -
- libs/models/imagefiltermodelthreads.h | 100 --
- libs/models/imagefiltersettings.cpp | 952 ---------------
- libs/models/imagefiltersettings.h | 349 ------
- libs/models/imagelistmodel.cpp | 70 --
- libs/models/imagelistmodel.h | 63 -
- libs/models/imagemodel.cpp | 1368 ----------------------
- libs/models/imagemodel.h | 364 ------
- libs/models/imagesortsettings.cpp | 400 -------
- libs/models/imagesortsettings.h | 225 ----
- libs/models/imagethumbnailmodel.cpp | 323 -----
- libs/models/imagethumbnailmodel.h | 140 ---
- libs/models/imageversionsmodel.cpp | 183 ---
- libs/models/imageversionsmodel.h | 75 --
- 38 files changed, 6499 insertions(+), 6500 deletions(-)
- create mode 100644 libs/database/models/imagefiltermodel.cpp
- create mode 100644 libs/database/models/imagefiltermodel.h
- create mode 100644 libs/database/models/imagefiltermodelpriv.cpp
- create mode 100644 libs/database/models/imagefiltermodelpriv.h
- create mode 100644 libs/database/models/imagefiltermodelthreads.cpp
- create mode 100644 libs/database/models/imagefiltermodelthreads.h
- create mode 100644 libs/database/models/imagefiltersettings.cpp
- create mode 100644 libs/database/models/imagefiltersettings.h
- create mode 100644 libs/database/models/imagelistmodel.cpp
- create mode 100644 libs/database/models/imagelistmodel.h
- create mode 100644 libs/database/models/imagemodel.cpp
- create mode 100644 libs/database/models/imagemodel.h
- create mode 100644 libs/database/models/imagesortsettings.cpp
- create mode 100644 libs/database/models/imagesortsettings.h
- create mode 100644 libs/database/models/imagethumbnailmodel.cpp
- create mode 100644 libs/database/models/imagethumbnailmodel.h
- create mode 100644 libs/database/models/imageversionsmodel.cpp
- create mode 100644 libs/database/models/imageversionsmodel.h
- delete mode 100644 libs/models/imagefiltermodel.cpp
- delete mode 100644 libs/models/imagefiltermodel.h
- delete mode 100644 libs/models/imagefiltermodelpriv.cpp
- delete mode 100644 libs/models/imagefiltermodelpriv.h
- delete mode 100644 libs/models/imagefiltermodelthreads.cpp
- delete mode 100644 libs/models/imagefiltermodelthreads.h
- delete mode 100644 libs/models/imagefiltersettings.cpp
- delete mode 100644 libs/models/imagefiltersettings.h
- delete mode 100644 libs/models/imagelistmodel.cpp
- delete mode 100644 libs/models/imagelistmodel.h
- delete mode 100644 libs/models/imagemodel.cpp
- delete mode 100644 libs/models/imagemodel.h
- delete mode 100644 libs/models/imagesortsettings.cpp
- delete mode 100644 libs/models/imagesortsettings.h
- delete mode 100644 libs/models/imagethumbnailmodel.cpp
- delete mode 100644 libs/models/imagethumbnailmodel.h
- delete mode 100644 libs/models/imageversionsmodel.cpp
- delete mode 100644 libs/models/imageversionsmodel.h
-
-diff --git a/libs/database/CMakeLists.txt b/libs/database/CMakeLists.txt
-index 7d05536..a431a36 100644
---- a/libs/database/CMakeLists.txt
-+++ b/libs/database/CMakeLists.txt
-@@ -13,6 +13,18 @@ endif (POLICY CMP0063)
- # Boost uses operator names (and, not, ...)
- string(REPLACE "-fno-operator-names" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-
-+set(libdatabasemodels_SRCS
-+ models/imagemodel.cpp
-+ models/imagefiltermodel.cpp
-+ models/imagefiltermodelpriv.cpp
-+ models/imagefiltermodelthreads.cpp
-+ models/imagefiltersettings.cpp
-+ models/imagelistmodel.cpp
-+ models/imagesortsettings.cpp
-+ models/imagethumbnailmodel.cpp
-+ models/imageversionsmodel.cpp
-+)
-+
- set(libdatabasecore_SRCS
- server/databaseserverstarter.cpp
- server/databaseservererror.cpp
-@@ -152,10 +164,10 @@ if(ENABLE_DBUS)
- include_directories($<TARGET_PROPERTY:Qt5::DBus,INTERFACE_INCLUDE_DIRECTORIES>)
- endif()
-
--add_library(digikamdatabase_src OBJECT ${digikamdatabase_LIB_SRCS})
-+add_library(digikamdatabase_src OBJECT ${digikamdatabase_LIB_SRCS} ${libdatabasemodels_SRCS})
- add_library(digikamdatabasemain_src OBJECT ${libdatabaseutils_SRCS} ${libimgqsort_SRCS})
- add_library(digikamdatabasecore_src OBJECT ${libdatabasecore_SRCS})
--add_library(digikamdatabase SHARED $<TARGET_OBJECTS:digikamdatabase_src> $<TARGET_OBJECTS:digikamdatabasemodels_src>)
-+add_library(digikamdatabase $<TARGET_OBJECTS:digikamdatabase_src>)
-
- generate_export_header(digikamdatabase
- BASE_NAME digikam_database
-diff --git a/libs/database/models/imagefiltermodel.cpp b/libs/database/models/imagefiltermodel.cpp
-new file mode 100644
-index 0000000..3d57e05
---- /dev/null
-+++ b/libs/database/models/imagefiltermodel.cpp
-@@ -0,0 +1,1116 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltermodel.h"
-+#include "imagefiltermodelpriv.h"
-+#include "imagefiltermodelthreads.h"
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbaccess.h"
-+#include "coredbchangesets.h"
-+#include "coredbwatch.h"
-+#include "imageinfolist.h"
-+#include "imagemodel.h"
-+
-+namespace Digikam
-+{
-+
-+ImageSortFilterModel::ImageSortFilterModel(QObject* parent)
-+ : DCategorizedSortFilterProxyModel(parent), m_chainedModel(0)
-+{
-+}
-+
-+void ImageSortFilterModel::setSourceImageModel(ImageModel* source)
-+{
-+ if (m_chainedModel)
-+ {
-+ m_chainedModel->setSourceImageModel(source);
-+ }
-+ else
-+ {
-+ setDirectSourceImageModel(source);
-+ }
-+}
-+
-+void ImageSortFilterModel::setSourceFilterModel(ImageSortFilterModel* source)
-+{
-+ if (source)
-+ {
-+ ImageModel* const model = sourceImageModel();
-+
-+ if (model)
-+ {
-+ source->setSourceImageModel(model);
-+ }
-+ }
-+
-+ m_chainedModel = source;
-+ setSourceModel(source);
-+}
-+
-+void ImageSortFilterModel::setDirectSourceImageModel(ImageModel* model)
-+{
-+ setSourceModel(model);
-+}
-+
-+void ImageSortFilterModel::setSourceModel(QAbstractItemModel* model)
-+{
-+ // made it protected, only setSourceImageModel is public
-+ DCategorizedSortFilterProxyModel::setSourceModel(model);
-+}
-+
-+ImageModel* ImageSortFilterModel::sourceImageModel() const
-+{
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->sourceImageModel();
-+ }
-+
-+ return static_cast<ImageModel*>(sourceModel());
-+}
-+
-+ImageSortFilterModel* ImageSortFilterModel::sourceFilterModel() const
-+{
-+ return m_chainedModel;
-+}
-+
-+ImageFilterModel* ImageSortFilterModel::imageFilterModel() const
-+{
-+ // reimplemented in ImageFilterModel
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->imageFilterModel();
-+ }
-+
-+ return 0;
-+}
-+
-+QModelIndex ImageSortFilterModel::mapToSourceImageModel(const QModelIndex& index) const
-+{
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->mapToSourceImageModel(mapToSource(index));
-+ }
-+
-+ return mapToSource(index);
-+}
-+
-+QModelIndex ImageSortFilterModel::mapFromSourceImageModel(const QModelIndex& albummodel_index) const
-+{
-+ if (m_chainedModel)
-+ {
-+ return mapFromSource(m_chainedModel->mapFromSourceImageModel(albummodel_index));
-+ }
-+
-+ return mapFromSource(albummodel_index);
-+}
-+
-+
-+QModelIndex ImageSortFilterModel::mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const
-+{
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->mapToSourceImageModel(sourceModel_index);
-+ }
-+ return sourceModel_index;
-+}
-+
-+// -------------- Convenience mappers -------------------------------------------------------------------
-+
-+QList<QModelIndex> ImageSortFilterModel::mapListToSource(const QList<QModelIndex>& indexes) const
-+{
-+ QList<QModelIndex> sourceIndexes;
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ sourceIndexes << mapToSourceImageModel(index);
-+ }
-+ return sourceIndexes;
-+}
-+
-+QList<QModelIndex> ImageSortFilterModel::mapListFromSource(const QList<QModelIndex>& sourceIndexes) const
-+{
-+ QList<QModelIndex> indexes;
-+ foreach(const QModelIndex& index, sourceIndexes)
-+ {
-+ indexes << mapFromSourceImageModel(index);
-+ }
-+ return indexes;
-+}
-+
-+ImageInfo ImageSortFilterModel::imageInfo(const QModelIndex& index) const
-+{
-+ return sourceImageModel()->imageInfo(mapToSourceImageModel(index));
-+}
-+
-+qlonglong ImageSortFilterModel::imageId(const QModelIndex& index) const
-+{
-+ return sourceImageModel()->imageId(mapToSourceImageModel(index));
-+}
-+
-+QList<ImageInfo> ImageSortFilterModel::imageInfos(const QList<QModelIndex>& indexes) const
-+{
-+ QList<ImageInfo> infos;
-+ ImageModel* const model = sourceImageModel();
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ infos << model->imageInfo(mapToSourceImageModel(index));
-+ }
-+
-+ return infos;
-+}
-+
-+QList<qlonglong> ImageSortFilterModel::imageIds(const QList<QModelIndex>& indexes) const
-+{
-+ QList<qlonglong> ids;
-+ ImageModel* const model = sourceImageModel();
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ ids << model->imageId(mapToSourceImageModel(index));
-+ }
-+
-+ return ids;
-+}
-+
-+QModelIndex ImageSortFilterModel::indexForPath(const QString& filePath) const
-+{
-+ return mapFromSourceImageModel(sourceImageModel()->indexForPath(filePath));
-+}
-+
-+QModelIndex ImageSortFilterModel::indexForImageInfo(const ImageInfo& info) const
-+{
-+ return mapFromSourceImageModel(sourceImageModel()->indexForImageInfo(info));
-+}
-+
-+QModelIndex ImageSortFilterModel::indexForImageId(qlonglong id) const
-+{
-+ return mapFromSourceImageModel(sourceImageModel()->indexForImageId(id));
-+}
-+
-+QList<ImageInfo> ImageSortFilterModel::imageInfosSorted() const
-+{
-+ QList<ImageInfo> infos;
-+ const int size = rowCount();
-+ ImageModel* const model = sourceImageModel();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ infos << model->imageInfo(mapToSourceImageModel(index(i, 0)));
-+ }
-+
-+ return infos;
-+}
-+
-+// --------------------------------------------------------------------------------------------
-+
-+ImageFilterModel::ImageFilterModel(QObject* parent)
-+ : ImageSortFilterModel(parent),
-+ d_ptr(new ImageFilterModelPrivate)
-+{
-+ d_ptr->init(this);
-+}
-+
-+ImageFilterModel::ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent)
-+ : ImageSortFilterModel(parent),
-+ d_ptr(&dd)
-+{
-+ d_ptr->init(this);
-+}
-+
-+ImageFilterModel::~ImageFilterModel()
-+{
-+ Q_D(ImageFilterModel);
-+ delete d;
-+}
-+
-+void ImageFilterModel::setDirectSourceImageModel(ImageModel* sourceModel)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ if (d->imageModel)
-+ {
-+ d->imageModel->unsetPreprocessor(d);
-+ disconnect(d->imageModel, SIGNAL(modelReset()),
-+ this, SLOT(slotModelReset()));
-+ slotModelReset();
-+ }
-+
-+ d->imageModel = sourceModel;
-+
-+ if (d->imageModel)
-+ {
-+ d->imageModel->setPreprocessor(d);
-+
-+ connect(d->imageModel, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)),
-+ d, SLOT(preprocessInfos(QList<ImageInfo>,QList<QVariant>)));
-+
-+ connect(d->imageModel, SIGNAL(processAdded(QList<ImageInfo>,QList<QVariant>)),
-+ d, SLOT(processAddedInfos(QList<ImageInfo>,QList<QVariant>)));
-+
-+ connect(d, SIGNAL(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)),
-+ d->imageModel, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
-+
-+ connect(d, SIGNAL(reAddingFinished()),
-+ d->imageModel, SLOT(reAddingFinished()));
-+
-+ connect(d->imageModel, SIGNAL(modelReset()),
-+ this, SLOT(slotModelReset()));
-+
-+ connect(d->imageModel, SIGNAL(imageChange(ImageChangeset,QItemSelection)),
-+ this, SLOT(slotImageChange(ImageChangeset)));
-+
-+ connect(d->imageModel, SIGNAL(imageTagChange(ImageTagChangeset,QItemSelection)),
-+ this, SLOT(slotImageTagChange(ImageTagChangeset)));
-+ }
-+
-+ setSourceModel(d->imageModel);
-+}
-+
-+QVariant ImageFilterModel::data(const QModelIndex& index, int role) const
-+{
-+ Q_D(const ImageFilterModel);
-+
-+ if (!index.isValid())
-+ {
-+ return QVariant();
-+ }
-+
-+ switch (role)
-+ {
-+ // Attention: This breaks should there ever be another filter model between this and the ImageModel
-+
-+ case DCategorizedSortFilterProxyModel::CategoryDisplayRole:
-+ return categoryIdentifier(d->imageModel->imageInfoRef(mapToSource(index)));
-+ case CategorizationModeRole:
-+ return d->sorter.categorizationMode;
-+ case SortOrderRole:
-+ return d->sorter.sortRole;
-+ //case CategoryCountRole:
-+ // return categoryCount(d->imageModel->imageInfoRef(mapToSource(index)));
-+ case CategoryAlbumIdRole:
-+ return d->imageModel->imageInfoRef(mapToSource(index)).albumId();
-+ case CategoryFormatRole:
-+ return d->imageModel->imageInfoRef(mapToSource(index)).format();
-+ case GroupIsOpenRole:
-+ return d->groupFilter.isAllOpen() ||
-+ d->groupFilter.isOpen(d->imageModel->imageInfoRef(mapToSource(index)).id());
-+ case ImageFilterModelPointerRole:
-+ return QVariant::fromValue(const_cast<ImageFilterModel*>(this));
-+ }
-+
-+ return DCategorizedSortFilterProxyModel::data(index, role);
-+}
-+
-+ImageFilterModel* ImageFilterModel::imageFilterModel() const
-+{
-+ return const_cast<ImageFilterModel*>(this);
-+}
-+
-+DatabaseFields::Set ImageFilterModel::suggestedWatchFlags() const
-+{
-+ DatabaseFields::Set watchFlags;
-+ watchFlags |= DatabaseFields::Name | DatabaseFields::FileSize | DatabaseFields::ModificationDate;
-+ watchFlags |= DatabaseFields::Rating | DatabaseFields::CreationDate | DatabaseFields::Orientation |
-+ DatabaseFields::Width | DatabaseFields::Height;
-+ watchFlags |= DatabaseFields::Comment;
-+ watchFlags |= DatabaseFields::ImageRelations;
-+ return watchFlags;
-+}
-+
-+// -------------- Filter settings --------------
-+
-+void ImageFilterModel::setDayFilter(const QList<QDateTime>& days)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setDayFilter(days);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-+ ImageFilterSettings::MatchingCondition matchingCond,
-+ bool showUnTagged, const QList<int>& clTagIds, const QList<int>& plTagIds)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setTagFilter(includedTags, excludedTags, matchingCond, showUnTagged, clTagIds, plTagIds);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setRatingFilter(rating, ratingCond, isUnratedExcluded);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setUrlWhitelist(const QList<QUrl> urlList, const QString& id)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setUrlWhitelist(urlList, id);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setIdWhitelist(idList, id);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setMimeTypeFilter(int mimeTypeFilter)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setMimeTypeFilter(mimeTypeFilter);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setGeolocationFilter(condition);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setTextFilter(const SearchTextFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setTextFilter(settings);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setImageFilterSettings(const ImageFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ d->version++;
-+ d->filter = settings;
-+ d->filterCopy = settings;
-+ d->versionFilterCopy = d->versionFilter;
-+ d->groupFilterCopy = d->groupFilter;
-+
-+ d->needPrepareComments = settings.isFilteringByText();
-+ d->needPrepareTags = settings.isFilteringByTags();
-+ d->needPrepareGroups = true;
-+ d->needPrepare = d->needPrepareComments || d->needPrepareTags || d->needPrepareGroups;
-+
-+ d->hasOneMatch = false;
-+ d->hasOneMatchForText = false;
-+ }
-+
-+ d->filterResults.clear();
-+
-+ //d->categoryCountHashInt.clear();
-+ //d->categoryCountHashString.clear();
-+ if (d->imageModel)
-+ {
-+ d->infosToProcess(d->imageModel->imageInfos());
-+ }
-+
-+ emit filterSettingsChanged(settings);
-+}
-+
-+void ImageFilterModel::setVersionManagerSettings(const VersionManagerSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->versionFilter.setVersionManagerSettings(settings);
-+ setVersionImageFilterSettings(d->versionFilter);
-+}
-+
-+void ImageFilterModel::setExceptionList(const QList<qlonglong>& idList, const QString& id)
-+{
-+ Q_D(ImageFilterModel);
-+ d->versionFilter.setExceptionList(idList, id);
-+ setVersionImageFilterSettings(d->versionFilter);
-+}
-+
-+void ImageFilterModel::setVersionImageFilterSettings(const VersionImageFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->versionFilter = settings;
-+ slotUpdateFilter();
-+}
-+
-+bool ImageFilterModel::isGroupOpen(qlonglong group) const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->groupFilter.isOpen(group);
-+}
-+
-+bool ImageFilterModel::isAllGroupsOpen() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->groupFilter.isAllOpen();
-+}
-+
-+void ImageFilterModel::setGroupOpen(qlonglong group, bool open)
-+{
-+ Q_D(ImageFilterModel);
-+ d->groupFilter.setOpen(group, open);
-+ setGroupImageFilterSettings(d->groupFilter);
-+}
-+
-+void ImageFilterModel::toggleGroupOpen(qlonglong group)
-+{
-+ setGroupOpen(group, !isGroupOpen(group));
-+}
-+
-+void ImageFilterModel::setAllGroupsOpen(bool open)
-+{
-+ Q_D(ImageFilterModel);
-+ d->groupFilter.setAllOpen(open);
-+ setGroupImageFilterSettings(d->groupFilter);
-+}
-+
-+void ImageFilterModel::setGroupImageFilterSettings(const GroupImageFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->groupFilter = settings;
-+ slotUpdateFilter();
-+}
-+
-+void ImageFilterModel::slotUpdateFilter()
-+{
-+ Q_D(ImageFilterModel);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+ImageFilterSettings ImageFilterModel::imageFilterSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->filter;
-+}
-+
-+ImageSortSettings ImageFilterModel::imageSortSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->sorter;
-+}
-+
-+VersionImageFilterSettings ImageFilterModel::versionImageFilterSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->versionFilter;
-+}
-+
-+GroupImageFilterSettings ImageFilterModel::groupImageFilterSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->groupFilter;
-+}
-+
-+void ImageFilterModel::slotModelReset()
-+{
-+ Q_D(ImageFilterModel);
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ // discard all packages on the way that are marked as send out for re-add
-+ d->lastDiscardVersion = d->version;
-+ d->sentOutForReAdd = 0;
-+ // discard all packages on the way
-+ d->version++;
-+ d->sentOut = 0;
-+
-+ d->hasOneMatch = false;
-+ d->hasOneMatchForText = false;
-+ }
-+ d->filterResults.clear();
-+}
-+
-+bool ImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
-+{
-+ Q_D(const ImageFilterModel);
-+
-+ if (source_parent.isValid())
-+ {
-+ return false;
-+ }
-+
-+ qlonglong id = d->imageModel->imageId(source_row);
-+ QHash<qlonglong, bool>::const_iterator it = d->filterResults.constFind(id);
-+
-+ if (it != d->filterResults.constEnd())
-+ {
-+ return it.value();
-+ }
-+
-+ // usually done in thread and cache, unless source model changed
-+ ImageInfo info = d->imageModel->imageInfo(source_row);
-+ bool match = d->filter.matches(info);
-+ match = match ? d->versionFilter.matches(info) : false;
-+
-+ return match ? d->groupFilter.matches(info) : false;
-+}
-+
-+void ImageFilterModel::setSendImageInfoSignals(bool sendSignals)
-+{
-+ if (sendSignals)
-+ {
-+ connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-+ this, SLOT(slotRowsInserted(QModelIndex,int,int)));
-+
-+ connect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-+ this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-+ }
-+ else
-+ {
-+ disconnect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-+ this, SLOT(slotRowsInserted(QModelIndex,int,int)));
-+
-+ disconnect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-+ this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-+ }
-+}
-+
-+void ImageFilterModel::slotRowsInserted(const QModelIndex& /*parent*/, int start, int end)
-+{
-+ QList<ImageInfo> infos;
-+
-+ for (int i=start; i<=end; ++i)
-+ {
-+ infos << imageInfo(index(i, 0));
-+ }
-+
-+ emit imageInfosAdded(infos);
-+}
-+
-+void ImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& /*parent*/, int start, int end)
-+{
-+ QList<ImageInfo> infos;
-+
-+ for (int i=start; i<=end; ++i)
-+ {
-+ infos << imageInfo(index(i, 0));
-+ }
-+
-+ emit imageInfosAboutToBeRemoved(infos);
-+}
-+
-+// -------------- Threaded preparation & filtering --------------
-+
-+void ImageFilterModel::addPrepareHook(ImageFilterModelPrepareHook* hook)
-+{
-+ Q_D(ImageFilterModel);
-+ QMutexLocker lock(&d->mutex);
-+ d->prepareHooks << hook;
-+}
-+
-+void ImageFilterModel::removePrepareHook(ImageFilterModelPrepareHook* hook)
-+{
-+ Q_D(ImageFilterModel);
-+ QMutexLocker lock(&d->mutex);
-+ d->prepareHooks.removeAll(hook);
-+}
-+
-+void ImageFilterModelPreparer::process(ImageFilterModelTodoPackage package)
-+{
-+ if (!checkVersion(package))
-+ {
-+ emit discarded(package);
-+ return;
-+ }
-+
-+ // get thread-local copy
-+ bool needPrepareTags, needPrepareComments, needPrepareGroups;
-+ QList<ImageFilterModelPrepareHook*> prepareHooks;
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ needPrepareTags = d->needPrepareTags;
-+ needPrepareComments = d->needPrepareComments;
-+ needPrepareGroups = d->needPrepareGroups;
-+ prepareHooks = d->prepareHooks;
-+ }
-+
-+ //TODO: Make efficient!!
-+ if (needPrepareComments)
-+ {
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ info.comment();
-+ }
-+ }
-+
-+ if (!checkVersion(package))
-+ {
-+ emit discarded(package);
-+ return;
-+ }
-+
-+ // The downside of QVector: At some point, we may need a QList for an API.
-+ // Nonetheless, QList and ImageInfo is fast. We could as well
-+ // reimplement ImageInfoList to ImageInfoVector (internally with templates?)
-+ ImageInfoList infoList;
-+
-+ if (needPrepareTags || needPrepareGroups)
-+ {
-+ infoList = package.infos.toList();
-+ }
-+
-+ if (needPrepareTags)
-+ {
-+ infoList.loadTagIds();
-+ }
-+
-+ if (needPrepareGroups)
-+ {
-+ infoList.loadGroupImageIds();
-+ }
-+
-+ foreach(ImageFilterModelPrepareHook* hook, prepareHooks)
-+ {
-+ hook->prepare(package.infos);
-+ }
-+
-+ emit processed(package);
-+}
-+
-+void ImageFilterModelFilterer::process(ImageFilterModelTodoPackage package)
-+{
-+ if (!checkVersion(package))
-+ {
-+ emit discarded(package);
-+ return;
-+ }
-+
-+ // get thread-local copy
-+ ImageFilterSettings localFilter;
-+ VersionImageFilterSettings localVersionFilter;
-+ GroupImageFilterSettings localGroupFilter;
-+ bool hasOneMatch;
-+ bool hasOneMatchForText;
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ localFilter = d->filterCopy;
-+ localVersionFilter = d->versionFilterCopy;
-+ localGroupFilter = d->groupFilterCopy;
-+ hasOneMatch = d->hasOneMatch;
-+ hasOneMatchForText = d->hasOneMatchForText;
-+ }
-+
-+ // Actual filtering. The variants to spare checking hasOneMatch over and over again.
-+ if (hasOneMatch && hasOneMatchForText)
-+ {
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ package.filterResults[info.id()] = localFilter.matches(info) &&
-+ localVersionFilter.matches(info) &&
-+ localGroupFilter.matches(info);
-+ }
-+ }
-+ else if (hasOneMatch)
-+ {
-+ bool matchForText;
-+
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ package.filterResults[info.id()] = localFilter.matches(info, &matchForText) &&
-+ localVersionFilter.matches(info) &&
-+ localGroupFilter.matches(info);
-+
-+ if (matchForText)
-+ {
-+ hasOneMatchForText = true;
-+ }
-+ }
-+ }
-+ else
-+ {
-+ bool result, matchForText;
-+
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ result = localFilter.matches(info, &matchForText) &&
-+ localVersionFilter.matches(info) &&
-+ localGroupFilter.matches(info);
-+ package.filterResults[info.id()] = result;
-+
-+ if (result)
-+ {
-+ hasOneMatch = true;
-+ }
-+
-+ if (matchForText)
-+ {
-+ hasOneMatchForText = true;
-+ }
-+ }
-+ }
-+
-+ if (checkVersion(package))
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ d->hasOneMatch = hasOneMatch;
-+ d->hasOneMatchForText = hasOneMatchForText;
-+ }
-+
-+ emit processed(package);
-+}
-+
-+// -------------- Sorting and Categorization -------------------------------------------------------
-+
-+void ImageFilterModel::setImageSortSettings(const ImageSortSettings& sorter)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter = sorter;
-+ setCategorizedModel(d->sorter.categorizationMode != ImageSortSettings::NoCategories);
-+ invalidate();
-+}
-+
-+void ImageFilterModel::setCategorizationMode(ImageSortSettings::CategorizationMode mode)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setCategorizationMode(mode);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setCategorizationSortOrder(ImageSortSettings::SortOrder order)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setCategorizationSortOrder(order);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setSortRole(ImageSortSettings::SortRole role)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setSortRole(role);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setSortOrder(ImageSortSettings::SortOrder order)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setSortOrder(order);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setStringTypeNatural(bool natural)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setStringTypeNatural(natural);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+int ImageFilterModel::compareCategories(const QModelIndex& left, const QModelIndex& right) const
-+{
-+ // source indexes
-+ Q_D(const ImageFilterModel);
-+
-+ if (!d->sorter.isCategorized())
-+ {
-+ return 0;
-+ }
-+
-+ if (!left.isValid() || !right.isValid())
-+ {
-+ return -1;
-+ }
-+
-+ const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-+ const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
-+
-+ // Check grouping
-+ qlonglong leftGroupImageId = leftInfo.groupImageId();
-+ qlonglong rightGroupImageId = rightInfo.groupImageId();
-+
-+ return compareInfosCategories(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-+ rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
-+}
-+
-+bool ImageFilterModel::subSortLessThan(const QModelIndex& left, const QModelIndex& right) const
-+{
-+ // source indexes
-+ Q_D(const ImageFilterModel);
-+
-+ if (!left.isValid() || !right.isValid())
-+ {
-+ return true;
-+ }
-+
-+ if (left == right)
-+ {
-+ return false;
-+ }
-+
-+ const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-+ const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
-+
-+ if (leftInfo == rightInfo)
-+ {
-+ return d->sorter.lessThan(left.data(ImageModel::ExtraDataRole), right.data(ImageModel::ExtraDataRole));
-+ }
-+
-+ // Check grouping
-+ qlonglong leftGroupImageId = leftInfo.groupImageId();
-+ qlonglong rightGroupImageId = rightInfo.groupImageId();
-+
-+ // Either no grouping (-1), or same group image, or same image
-+ if (leftGroupImageId == rightGroupImageId)
-+ {
-+ return infosLessThan(leftInfo, rightInfo);
-+ }
-+
-+ // We have grouping to handle
-+
-+ // Is one grouped on the other? Sort behind leader.
-+ if (leftGroupImageId == rightInfo.id())
-+ {
-+ return false;
-+ }
-+ if (rightGroupImageId == leftInfo.id())
-+ {
-+ return true;
-+ }
-+
-+ // Use the group leader for sorting
-+ return infosLessThan(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-+ rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
-+}
-+
-+int ImageFilterModel::compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ // Note: reimplemented in ImageAlbumFilterModel
-+ Q_D(const ImageFilterModel);
-+ return d->sorter.compareCategories(left, right);
-+}
-+
-+// Feel free to optimize. QString::number is 3x slower.
-+static inline QString fastNumberToString(int id)
-+{
-+ const int size = sizeof(int) * 2;
-+ char c[size+1];
-+ c[size] = '\0';
-+ char* p = c;
-+ int number = id;
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ *p = 'a' + (number & 0xF);
-+ number >>= 4;
-+ ++p;
-+ }
-+
-+ return QString::fromLatin1(c);
-+}
-+
-+QString ImageFilterModel::categoryIdentifier(const ImageInfo& i) const
-+{
-+ Q_D(const ImageFilterModel);
-+
-+ if (!d->sorter.isCategorized())
-+ {
-+ return QString();
-+ }
-+
-+ qlonglong groupedImageId = i.groupImageId();
-+ ImageInfo info = groupedImageId == -1 ? i : ImageInfo(groupedImageId);
-+
-+ switch (d->sorter.categorizationMode)
-+ {
-+ case ImageSortSettings::NoCategories:
-+ return QString();
-+ case ImageSortSettings::OneCategory:
-+ return QString();
-+ case ImageSortSettings::CategoryByAlbum:
-+ return fastNumberToString(info.albumId());
-+ case ImageSortSettings::CategoryByFormat:
-+ return info.format();
-+ default:
-+ return QString();
-+ }
-+}
-+
-+bool ImageFilterModel::infosLessThan(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->sorter.lessThan(left, right);
-+}
-+
-+// -------------- Watching changes -----------------------------------------------------------------
-+
-+void ImageFilterModel::slotImageTagChange(const ImageTagChangeset& changeset)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ if (!d->imageModel || d->imageModel->isEmpty())
-+ {
-+ return;
-+ }
-+
-+ // already scheduled to re-filter?
-+ if (d->updateFilterTimer->isActive())
-+ {
-+ return;
-+ }
-+
-+ // do we filter at all?
-+ if (!d->versionFilter.isFilteringByTags() &&
-+ !d->filter.isFilteringByTags() &&
-+ !d->filter.isFilteringByText())
-+ {
-+ return;
-+ }
-+
-+ // is one of our images affected?
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ // if one matching image id is found, trigger a refresh
-+ if (d->imageModel->hasImage(id))
-+ {
-+ d->updateFilterTimer->start();
-+ return;
-+ }
-+ }
-+}
-+
-+void ImageFilterModel::slotImageChange(const ImageChangeset& changeset)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ if (!d->imageModel || d->imageModel->isEmpty())
-+ {
-+ return;
-+ }
-+
-+ // already scheduled to re-filter?
-+ if (d->updateFilterTimer->isActive())
-+ {
-+ return;
-+ }
-+
-+ // is one of the values affected that we filter or sort by?
-+ DatabaseFields::Set set = changeset.changes();
-+ bool sortAffected = (set & d->sorter.watchFlags());
-+ bool filterAffected = (set & d->filter.watchFlags()) || (set & d->groupFilter.watchFlags());
-+
-+ if (!sortAffected && !filterAffected)
-+ {
-+ return;
-+ }
-+
-+ // is one of our images affected?
-+ bool imageAffected = false;
-+
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ // if one matching image id is found, trigger a refresh
-+ if (d->imageModel->hasImage(id))
-+ {
-+ imageAffected = true;
-+ break;
-+ }
-+ }
-+
-+ if (!imageAffected)
-+ {
-+ return;
-+ }
-+
-+ if (filterAffected)
-+ {
-+ d->updateFilterTimer->start();
-+ }
-+ else
-+ {
-+ invalidate(); // just resort, reuse filter results
-+ }
-+}
-+
-+// -------------------------------------------------------------------------------------------------------
-+
-+NoDuplicatesImageFilterModel::NoDuplicatesImageFilterModel(QObject* parent)
-+ : ImageSortFilterModel(parent)
-+{
-+}
-+
-+bool NoDuplicatesImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
-+{
-+ QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
-+
-+ if (index.data(ImageModel::ExtraDataDuplicateCount).toInt() <= 1)
-+ {
-+ return true;
-+ }
-+
-+ QModelIndex previousIndex = sourceModel()->index(source_row - 1, 0, source_parent);
-+
-+ if (!previousIndex.isValid())
-+ {
-+ return true;
-+ }
-+
-+ if (sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(index)) == sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(previousIndex)))
-+ {
-+ return false;
-+ }
-+ return true;
-+}
-+
-+/*
-+void NoDuplicatesImageFilterModel::setSourceModel(QAbstractItemModel* model)
-+{
-+ if (sourceModel())
-+ {
-+ }
-+
-+ ImageSortFilterModel::setSourceModel(model);
-+
-+ if (sourceModel())
-+ {
-+ connect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-+ this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-+ }
-+}
-+
-+void NoDuplicatesImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& parent, int begin, int end)
-+{
-+ bool needInvalidate = false;
-+
-+ for (int i = begin; i<=end; ++i)
-+ {
-+ QModelIndex index = sourceModel()->index(i, 0, parent);
-+
-+ // filtered out by us?
-+ if (!mapFromSource(index).isValid())
-+ {
-+ continue;
-+ }
-+
-+ QModelIndex sourceIndex = mapFromDirectSourceToSourceImageModel(index);
-+ qlonglong id = sourceImageModel()->imageId(sourceIndex);
-+
-+ if (sourceImageModel()->numberOfIndexesForImageId(id) > 1)
-+ {
-+ needInvalidate = true;
-+ }
-+ }
-+}*/
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltermodel.h b/libs/database/models/imagefiltermodel.h
-new file mode 100644
-index 0000000..d131b3e
---- /dev/null
-+++ b/libs/database/models/imagefiltermodel.h
-@@ -0,0 +1,299 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERMODEL_H
-+#define IMAGEFILTERMODEL_H
-+
-+// Local includes
-+
-+#include "dcategorizedsortfilterproxymodel.h"
-+#include "textfilter.h"
-+#include "imagefiltersettings.h"
-+#include "imagemodel.h"
-+#include "imagesortsettings.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageChangeset;
-+class ImageFilterModel;
-+class ImageTagChangeset;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelPrepareHook
-+{
-+public:
-+
-+ virtual ~ImageFilterModelPrepareHook() {};
-+ virtual void prepare(const QVector<ImageInfo>& infos) = 0;
-+};
-+
-+// -----------------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageSortFilterModel : public DCategorizedSortFilterProxyModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageSortFilterModel(QObject* parent = 0);
-+
-+ void setSourceImageModel(ImageModel* model);
-+ ImageModel* sourceImageModel() const;
-+
-+ void setSourceFilterModel(ImageSortFilterModel* model);
-+ ImageSortFilterModel* sourceFilterModel() const;
-+
-+ QModelIndex mapToSourceImageModel(const QModelIndex& index) const;
-+ QModelIndex mapFromSourceImageModel(const QModelIndex& imagemodel_index) const;
-+ QModelIndex mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const;
-+
-+ /// Convenience methods mapped to ImageModel.
-+ /// Mentioned indexes returned come from the source image model.
-+ QList<QModelIndex> mapListToSource(const QList<QModelIndex>& indexes) const;
-+ QList<QModelIndex> mapListFromSource(const QList<QModelIndex>& sourceIndexes) const;
-+
-+ ImageInfo imageInfo(const QModelIndex& index) const;
-+ qlonglong imageId(const QModelIndex& index) const;
-+ QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-+ QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
-+
-+ QModelIndex indexForPath(const QString& filePath) const;
-+ QModelIndex indexForImageInfo(const ImageInfo& info) const;
-+ QModelIndex indexForImageId(qlonglong id) const;
-+
-+ /** Returns a list of all image infos, sorted according to this model.
-+ * If you do not need a sorted list, use ImageModel's imageInfos() method.
-+ */
-+ QList<ImageInfo> imageInfosSorted() const;
-+
-+ /// Returns this, any chained ImageFilterModel, or 0.
-+ virtual ImageFilterModel* imageFilterModel() const;
-+
-+protected:
-+
-+ /// Reimplement if needed. Called only when model shall be set as (direct) sourceModel.
-+ virtual void setDirectSourceImageModel(ImageModel* model);
-+
-+ // made protected
-+ virtual void setSourceModel(QAbstractItemModel* model);
-+
-+protected:
-+
-+ ImageSortFilterModel* m_chainedModel;
-+};
-+
-+// -----------------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModel : public ImageSortFilterModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ enum ImageFilterModelRoles
-+ {
-+ /// Returns the current categorization mode
-+ CategorizationModeRole = ImageModel::FilterModelRoles + 1,
-+ /// Returns the current sort order
-+ SortOrderRole = ImageModel::FilterModelRoles + 2,
-+ // / Returns the number of items in the index' category
-+ //CategoryCountRole = ImageModel::FilterModelRoles + 3,
-+ /// Returns the id of the PAlbum of the index which is used for category
-+ CategoryAlbumIdRole = ImageModel::FilterModelRoles + 3,
-+ /// Returns the format of the index which is used for category
-+ CategoryFormatRole = ImageModel::FilterModelRoles + 4,
-+ /// Returns true if the given image is a group leader, and the group is opened
-+ GroupIsOpenRole = ImageModel::FilterModelRoles + 5,
-+ ImageFilterModelPointerRole = ImageModel::FilterModelRoles + 50
-+ };
-+
-+public:
-+
-+ explicit ImageFilterModel(QObject* parent = 0);
-+ ~ImageFilterModel();
-+
-+ /** Add a hook to get added images for preparation tasks before they are added in the model */
-+ void addPrepareHook(ImageFilterModelPrepareHook* hook);
-+ void removePrepareHook(ImageFilterModelPrepareHook* hook);
-+
-+ /** Returns a set of DatabaseFields suggested to set as watch flags on the source ImageModel.
-+ * The contained flags will be those that this model can sort or filter by. */
-+ DatabaseFields::Set suggestedWatchFlags() const;
-+
-+ ImageFilterSettings imageFilterSettings() const;
-+ VersionImageFilterSettings versionImageFilterSettings() const;
-+ GroupImageFilterSettings groupImageFilterSettings() const;
-+ ImageSortSettings imageSortSettings() const;
-+
-+ // group is identified by the id of its group leader
-+ bool isGroupOpen(qlonglong group) const;
-+ bool isAllGroupsOpen() const;
-+
-+ /// Enables sending imageInfosAdded and imageInfosAboutToBeRemoved
-+ void setSendImageInfoSignals(bool sendSignals);
-+
-+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+ virtual ImageFilterModel* imageFilterModel() const;
-+
-+public Q_SLOTS:
-+
-+ /** Changes the current version image filter settings and refilters. */
-+ void setVersionImageFilterSettings(const VersionImageFilterSettings& settings);
-+
-+ /** Changes the current version image filter settings and refilters. */
-+ void setGroupImageFilterSettings(const GroupImageFilterSettings& settings);
-+
-+ /** Adjust the current ImageFilterSettings.
-+ * Equivalent to retrieving the current filter settings, adjusting the parameter
-+ * and calling setImageFilterSettings.
-+ * Provided for convenience.
-+ * It is encouraged to use setImageFilterSettings if you change more than one
-+ * parameter at a time.
-+ */
-+ void setDayFilter(const QList<QDateTime>& days);
-+ void setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-+ ImageFilterSettings::MatchingCondition matchingCond, bool showUnTagged,
-+ const QList<int>& clTagIds, const QList<int>& plTagIds);
-+ void setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded);
-+ void setMimeTypeFilter(int mimeTypeFilter);
-+ void setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition);
-+ void setTextFilter(const SearchTextFilterSettings& settings);
-+
-+ void setCategorizationMode(ImageSortSettings::CategorizationMode mode);
-+ void setCategorizationSortOrder(ImageSortSettings::SortOrder order);
-+ void setSortRole(ImageSortSettings::SortRole role);
-+ void setSortOrder(ImageSortSettings::SortOrder order);
-+ void setStringTypeNatural(bool natural);
-+ void setUrlWhitelist(const QList<QUrl> urlList, const QString& id);
-+ void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
-+
-+ void setVersionManagerSettings(const VersionManagerSettings& settings);
-+ void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
-+
-+ void setGroupOpen(qlonglong group, bool open);
-+ void toggleGroupOpen(qlonglong group);
-+ void setAllGroupsOpen(bool open);
-+
-+ /** Changes the current image filter settings and refilters. */
-+ virtual void setImageFilterSettings(const ImageFilterSettings& settings);
-+
-+ /** Changes the current image sort settings and resorts. */
-+ virtual void setImageSortSettings(const ImageSortSettings& settings);
-+
-+Q_SIGNALS:
-+
-+ /// Signals that the set filter matches at least one index
-+ void filterMatches(bool matches);
-+
-+ /** Signals that the set text filter matches at least one entry.
-+ If no text filter is set, this signal is emitted
-+ with 'false' when filterMatches() is emitted.
-+ */
-+ void filterMatchesForText(bool matchesByText);
-+
-+ /** Emitted when the filter settings have been changed
-+ (the model may not yet have been updated)
-+ */
-+ void filterSettingsChanged(const ImageFilterSettings& settings);
-+
-+ /** These signals need to be explicitly enabled with setSendImageInfoSignals()
-+ */
-+ void imageInfosAdded(const QList<ImageInfo>& infos);
-+ void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
-+
-+public:
-+
-+ // Declared as public because of use in sub-classes.
-+ class ImageFilterModelPrivate;
-+
-+protected:
-+
-+ ImageFilterModelPrivate* const d_ptr;
-+
-+protected:
-+
-+ ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent);
-+
-+ virtual void setDirectSourceImageModel(ImageModel* model);
-+
-+ virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
-+
-+ virtual int compareCategories(const QModelIndex& left, const QModelIndex& right) const;
-+ virtual bool subSortLessThan(const QModelIndex& left, const QModelIndex& right) const;
-+ //virtual int categoryCount(const ImageInfo& info) const;
-+
-+ /** Reimplement to customize category sorting,
-+ * Return negative if category of left < category right,
-+ * Return 0 if left and right are in the same category, else return positive.
-+ */
-+ virtual int compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Reimplement to customize sorting. Do not take categories into account here.
-+ */
-+ virtual bool infosLessThan(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Returns a unique identifier for the category if info. The string need not be for user display.
-+ */
-+ virtual QString categoryIdentifier(const ImageInfo& info) const;
-+
-+protected Q_SLOTS:
-+
-+ void slotModelReset();
-+ void slotUpdateFilter();
-+
-+ void slotImageTagChange(const ImageTagChangeset& changeset);
-+ void slotImageChange(const ImageChangeset& changeset);
-+
-+ void slotRowsInserted(const QModelIndex& parent, int start, int end);
-+ void slotRowsAboutToBeRemoved(const QModelIndex& parent, int start, int end);
-+
-+private:
-+
-+ Q_DECLARE_PRIVATE(ImageFilterModel)
-+};
-+
-+// -----------------------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT NoDuplicatesImageFilterModel : public ImageSortFilterModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit NoDuplicatesImageFilterModel(QObject* parent = 0);
-+
-+protected:
-+
-+ virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
-+};
-+
-+} // namespace Digikam
-+
-+Q_DECLARE_METATYPE(Digikam::ImageFilterModel*)
-+
-+#endif // IMAGEMODEL_H
-diff --git a/libs/database/models/imagefiltermodelpriv.cpp b/libs/database/models/imagefiltermodelpriv.cpp
-new file mode 100644
-index 0000000..07d9e79
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelpriv.cpp
-@@ -0,0 +1,258 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltermodelpriv.h"
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "imagefiltermodelthreads.h"
-+
-+namespace Digikam
-+{
-+
-+ImageFilterModel::ImageFilterModelPrivate::ImageFilterModelPrivate()
-+{
-+ imageModel = 0;
-+ version = 0;
-+ lastDiscardVersion = 0;
-+ sentOut = 0;
-+ sentOutForReAdd = 0;
-+ updateFilterTimer = 0;
-+ needPrepare = false;
-+ needPrepareComments = false;
-+ needPrepareTags = false;
-+ needPrepareGroups = false;
-+ preparer = 0;
-+ filterer = 0;
-+ hasOneMatch = false;
-+ hasOneMatchForText = false;
-+
-+ setupWorkers();
-+}
-+
-+ImageFilterModel::ImageFilterModelPrivate::~ImageFilterModelPrivate()
-+{
-+ // facilitate thread stopping
-+ ++version;
-+ preparer->deactivate();
-+ filterer->deactivate();
-+ delete preparer;
-+ delete filterer;
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::init(ImageFilterModel* _q)
-+{
-+ q = _q;
-+
-+ updateFilterTimer = new QTimer(this);
-+ updateFilterTimer->setSingleShot(true);
-+ updateFilterTimer->setInterval(250);
-+
-+ connect(updateFilterTimer, SIGNAL(timeout()),
-+ q, SLOT(slotUpdateFilter()));
-+
-+ // inter-thread redirection
-+ qRegisterMetaType<ImageFilterModelTodoPackage>("ImageFilterModelTodoPackage");
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ infosToProcess(infos, extraValues, true);
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ // These have already been added, we just process them afterwards
-+ infosToProcess(infos, extraValues, false);
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::setupWorkers()
-+{
-+ preparer = new ImageFilterModelPreparer(this);
-+ filterer = new ImageFilterModelFilterer(this);
-+
-+ // A package in constructed in infosToProcess.
-+ // Normal flow is infosToProcess -> preparer::process -> filterer::process -> packageFinished.
-+ // If no preparation is needed, the first step is skipped.
-+ // If filter version changes, both will discard old package and send them to packageDiscarded.
-+
-+ connect(this, SIGNAL(packageToPrepare(ImageFilterModelTodoPackage)),
-+ preparer, SLOT(process(ImageFilterModelTodoPackage)));
-+
-+ connect(this, SIGNAL(packageToFilter(ImageFilterModelTodoPackage)),
-+ filterer, SLOT(process(ImageFilterModelTodoPackage)));
-+
-+ connect(preparer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-+ filterer, SLOT(process(ImageFilterModelTodoPackage)));
-+
-+ connect(filterer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-+ this, SLOT(packageFinished(ImageFilterModelTodoPackage)));
-+
-+ connect(preparer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-+ this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
-+
-+ connect(filterer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-+ this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos)
-+{
-+ infosToProcess(infos, QList<QVariant>(), false);
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ filterer->schedule();
-+
-+ if (needPrepare)
-+ {
-+ preparer->schedule();
-+ }
-+
-+ Q_ASSERT(extraValues.isEmpty() || infos.size() == extraValues.size());
-+
-+ // prepare and filter in chunks
-+ const int size = infos.size();
-+ const int maxChunkSize = needPrepare ? PrepareChunkSize : FilterChunkSize;
-+ const bool hasExtraValues = !extraValues.isEmpty();
-+ QList<ImageInfo>::const_iterator it = infos.constBegin(), end;
-+ QList<QVariant>::const_iterator xit = extraValues.constBegin(), xend;
-+ int index = 0;
-+ QVector<ImageInfo> infoVector;
-+ QVector<QVariant> extraValueVector;
-+
-+ while (it != infos.constEnd())
-+ {
-+ const int chunkSize = qMin(maxChunkSize, size - index);
-+ infoVector.resize(chunkSize);
-+ end = it + chunkSize;
-+ qCopy(it, end, infoVector.begin());
-+
-+ if (hasExtraValues)
-+ {
-+ extraValueVector.resize(chunkSize);
-+ xend = xit + chunkSize;
-+ qCopy(xit, xend, extraValueVector.begin());
-+ xit = xend;
-+ }
-+
-+ it = end;
-+ index += chunkSize;
-+
-+ ++sentOut;
-+
-+ if (forReAdd)
-+ {
-+ ++sentOutForReAdd;
-+ }
-+
-+ if (needPrepare)
-+ {
-+ emit packageToPrepare(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-+ }
-+ else
-+ {
-+ emit packageToFilter(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-+ }
-+ }
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::packageFinished(const ImageFilterModelTodoPackage& package)
-+{
-+ // check if it got discarded on the journey
-+ if (package.version != version)
-+ {
-+ packageDiscarded(package);
-+ return;
-+ }
-+
-+ // incorporate result
-+ QHash<qlonglong, bool>::const_iterator it = package.filterResults.constBegin();
-+
-+ for (; it != package.filterResults.constEnd(); ++it)
-+ {
-+ filterResults.insert(it.key(), it.value());
-+ }
-+
-+ // re-add if necessary
-+ if (package.isForReAdd)
-+ {
-+ emit reAddImageInfos(package.infos.toList(), package.extraValues.toList());
-+
-+ if (sentOutForReAdd == 1) // last package
-+ {
-+ emit reAddingFinished();
-+ }
-+ }
-+
-+ // decrement counters
-+ --sentOut;
-+
-+ if (package.isForReAdd)
-+ {
-+ --sentOutForReAdd;
-+ }
-+
-+ // If all packages have returned, filtered and readded, and no more are expected,
-+ // and there is need to tell the filter result to the view, do that
-+ if (sentOut == 0 && sentOutForReAdd == 0 && !imageModel->isRefreshing())
-+ {
-+ q->invalidate(); // use invalidate, not invalidateFilter only. Sorting may have changed as well.
-+ emit (q->filterMatches(hasOneMatch));
-+ emit (q->filterMatchesForText(hasOneMatchForText));
-+ filterer->deactivate();
-+ preparer->deactivate();
-+ }
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::packageDiscarded(const ImageFilterModelTodoPackage& package)
-+{
-+ // Either, the model was reset, or the filter changed
-+ // In the former case throw all away, in the latter case, recycle
-+ if (package.version > lastDiscardVersion)
-+ {
-+ // Recycle packages: Send again with current version
-+ // Do not increment sentOut or sentOutForReAdd here: it was not decremented!
-+
-+ if (needPrepare)
-+ {
-+ emit packageToPrepare(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-+ }
-+ else
-+ {
-+ emit packageToFilter(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-+ }
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltermodelpriv.h b/libs/database/models/imagefiltermodelpriv.h
-new file mode 100644
-index 0000000..a9e3f22
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelpriv.h
-@@ -0,0 +1,159 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-11
-+ * Description : Qt item model for database entries - private shared header
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERMODELPRIV_H
-+#define IMAGEFILTERMODELPRIV_H
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QMutex>
-+#include <QMutexLocker>
-+#include <QSet>
-+#include <QThread>
-+#include <QTimer>
-+#include <QWaitCondition>
-+
-+// Local includes
-+
-+#include "imageinfo.h"
-+#include "imagefiltermodel.h"
-+
-+#include "digikam_export.h"
-+// Yes, we need the EXPORT macro in a private header because
-+// this private header is shared across binary objects.
-+// This does NOT make this classes here any more public!
-+
-+namespace Digikam
-+{
-+
-+const int PrepareChunkSize = 101;
-+const int FilterChunkSize = 2001;
-+
-+class ImageFilterModelTodoPackage
-+{
-+public:
-+
-+ ImageFilterModelTodoPackage()
-+ : version(0), isForReAdd(false)
-+ {
-+ }
-+
-+ ImageFilterModelTodoPackage(const QVector<ImageInfo>& infos, const QVector<QVariant>& extraValues, int version, bool isForReAdd)
-+ : infos(infos), extraValues(extraValues), version(version), isForReAdd(isForReAdd)
-+ {
-+ }
-+
-+ QVector<ImageInfo> infos;
-+ QVector<QVariant> extraValues;
-+ unsigned int version;
-+ bool isForReAdd;
-+ QHash<qlonglong, bool> filterResults;
-+};
-+
-+// ------------------------------------------------------------------------------------------------
-+
-+class ImageFilterModelPreparer;
-+class ImageFilterModelFilterer;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModel::ImageFilterModelPrivate : public QObject
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ ImageFilterModelPrivate();
-+ ~ImageFilterModelPrivate();
-+
-+ void init(ImageFilterModel* q);
-+ void setupWorkers();
-+ void infosToProcess(const QList<ImageInfo>& infos);
-+ void infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd = true);
-+
-+public:
-+
-+ ImageFilterModel* q;
-+
-+ ImageModel* imageModel;
-+
-+ ImageFilterSettings filter;
-+ ImageSortSettings sorter;
-+ VersionImageFilterSettings versionFilter;
-+ GroupImageFilterSettings groupFilter;
-+
-+ volatile unsigned int version;
-+ unsigned int lastDiscardVersion;
-+ unsigned int lastFilteredVersion;
-+ int sentOut;
-+ int sentOutForReAdd;
-+
-+ QTimer* updateFilterTimer;
-+
-+ bool needPrepare;
-+ bool needPrepareComments;
-+ bool needPrepareTags;
-+ bool needPrepareGroups;
-+
-+ QMutex mutex;
-+ ImageFilterSettings filterCopy;
-+ VersionImageFilterSettings versionFilterCopy;
-+ GroupImageFilterSettings groupFilterCopy;
-+ ImageFilterModelPreparer* preparer;
-+ ImageFilterModelFilterer* filterer;
-+
-+ QHash<qlonglong, bool> filterResults;
-+ bool hasOneMatch;
-+ bool hasOneMatchForText;
-+
-+ QList<ImageFilterModelPrepareHook*> prepareHooks;
-+
-+/*
-+ QHash<int, QSet<qlonglong> > categoryCountHashInt;
-+ QHash<QString, QSet<qlonglong> > categoryCountHashString;
-+
-+public:
-+
-+ void cacheCategoryCount(int id, qlonglong imageid) const
-+ { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashInt[id].insert(imageid); }
-+ void cacheCategoryCount(const QString& id, qlonglong imageid) const
-+ { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashString[id].insert(imageid); }
-+*/
-+
-+public Q_SLOTS:
-+
-+ void preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void packageFinished(const ImageFilterModelTodoPackage& package);
-+ void packageDiscarded(const ImageFilterModelTodoPackage& package);
-+
-+Q_SIGNALS:
-+
-+ void packageToPrepare(const ImageFilterModelTodoPackage& package);
-+ void packageToFilter(const ImageFilterModelTodoPackage& package);
-+ void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void reAddingFinished();
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGEFILTERMODELPRIV_H
-diff --git a/libs/database/models/imagefiltermodelthreads.cpp b/libs/database/models/imagefiltermodelthreads.cpp
-new file mode 100644
-index 0000000..aa5c462
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelthreads.cpp
-@@ -0,0 +1,40 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltermodel.h"
-+#include "imagefiltermodelpriv.h"
-+#include "imagefiltermodelthreads.h"
-+
-+namespace Digikam
-+{
-+
-+ImageFilterModelWorker::ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d)
-+ : d(d)
-+{
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltermodelthreads.h b/libs/database/models/imagefiltermodelthreads.h
-new file mode 100644
-index 0000000..83fa987
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelthreads.h
-@@ -0,0 +1,100 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-11
-+ * Description : Qt item model for database entries - private header
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERMODELTHREADS_H
-+#define IMAGEFILTERMODELTHREADS_H
-+
-+// Qt includes
-+
-+#include <QThread>
-+
-+// Local includes
-+
-+#include "digikam_export.h"
-+#include "workerobject.h"
-+
-+namespace Digikam
-+{
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelWorker : public WorkerObject
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d);
-+
-+ bool checkVersion(const ImageFilterModelTodoPackage& package)
-+ {
-+ return d->version == package.version;
-+ }
-+
-+public Q_SLOTS:
-+
-+ virtual void process(ImageFilterModelTodoPackage package) = 0;
-+
-+Q_SIGNALS:
-+
-+ void processed(const ImageFilterModelTodoPackage& package);
-+ void discarded(const ImageFilterModelTodoPackage& package);
-+
-+protected:
-+
-+ ImageFilterModel::ImageFilterModelPrivate* d;
-+};
-+
-+// -----------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelPreparer : public ImageFilterModelWorker
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageFilterModelPreparer(ImageFilterModel::ImageFilterModelPrivate* const d)
-+ : ImageFilterModelWorker(d)
-+ {
-+ }
-+
-+ void process(ImageFilterModelTodoPackage package);
-+};
-+
-+// ----------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelFilterer : public ImageFilterModelWorker
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageFilterModelFilterer(ImageFilterModel::ImageFilterModelPrivate* const d)
-+ : ImageFilterModelWorker(d)
-+ {
-+ }
-+
-+ void process(ImageFilterModelTodoPackage package);
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGEFILTERMODELTHREADS_H
-diff --git a/libs/database/models/imagefiltersettings.cpp b/libs/database/models/imagefiltersettings.cpp
-new file mode 100644
-index 0000000..b61e7f9
---- /dev/null
-+++ b/libs/database/models/imagefiltersettings.cpp
-@@ -0,0 +1,952 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Filter values for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltersettings.h"
-+
-+// C++ includes
-+
-+#include <cmath>
-+
-+// Qt includes
-+
-+#include <QDateTime>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbfields.h"
-+#include "digikam_globals.h"
-+#include "imageinfo.h"
-+#include "tagscache.h"
-+#include "versionmanagersettings.h"
-+
-+namespace Digikam
-+{
-+
-+ImageFilterSettings::ImageFilterSettings()
-+{
-+ m_untaggedFilter = false;
-+ m_isUnratedExcluded = false;
-+ m_ratingFilter = 0;
-+ m_mimeTypeFilter = MimeFilter::AllFiles;
-+ m_ratingCond = GreaterEqualCondition;
-+ m_matchingCond = OrCondition;
-+ m_geolocationCondition = GeolocationNoFilter;
-+}
-+
-+DatabaseFields::Set ImageFilterSettings::watchFlags() const
-+{
-+ DatabaseFields::Set set;
-+
-+ if (isFilteringByDay())
-+ {
-+ set |= DatabaseFields::CreationDate;
-+ }
-+
-+ if (isFilteringByText())
-+ {
-+ set |= DatabaseFields::Name;
-+ set |= DatabaseFields::Comment;
-+ }
-+
-+ if (isFilteringByRating())
-+ {
-+ set |= DatabaseFields::Rating;
-+ }
-+
-+ if (isFilteringByTypeMime())
-+ {
-+ set |= DatabaseFields::Category;
-+ set |= DatabaseFields::Format;
-+ }
-+
-+ if (isFilteringByGeolocation())
-+ {
-+ set |= DatabaseFields::ImagePositionsAll;
-+ }
-+
-+ if (isFilteringByColorLabels())
-+ {
-+ set |= DatabaseFields::ColorLabel;
-+ }
-+
-+ if (isFilteringByPickLabels())
-+ {
-+ set |= DatabaseFields::PickLabel;
-+ }
-+
-+ return set;
-+}
-+
-+bool ImageFilterSettings::isFilteringByDay() const
-+{
-+ if (!m_dayFilter.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByTags() const
-+{
-+ if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty() || m_untaggedFilter)
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByColorLabels() const
-+{
-+ if (!m_colorLabelTagFilter.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByPickLabels() const
-+{
-+ if (!m_pickLabelTagFilter.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByText() const
-+{
-+ if (!m_textFilterSettings.text.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByTypeMime() const
-+{
-+ if (m_mimeTypeFilter != MimeFilter::AllFiles)
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByGeolocation() const
-+{
-+ return (m_geolocationCondition != GeolocationNoFilter);
-+}
-+
-+bool ImageFilterSettings::isFilteringByRating() const
-+{
-+ if (m_ratingFilter != 0 || m_ratingCond != GreaterEqualCondition || m_isUnratedExcluded)
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringInternally() const
-+{
-+ return (isFiltering() || !m_urlWhitelists.isEmpty() || !m_idWhitelists.isEmpty());
-+}
-+
-+bool ImageFilterSettings::isFiltering() const
-+{
-+ return isFilteringByDay() ||
-+ isFilteringByTags() ||
-+ isFilteringByText() ||
-+ isFilteringByRating() ||
-+ isFilteringByTypeMime() ||
-+ isFilteringByColorLabels() ||
-+ isFilteringByPickLabels() ||
-+ isFilteringByGeolocation();
-+}
-+
-+void ImageFilterSettings::setDayFilter(const QList<QDateTime>& days)
-+{
-+ m_dayFilter.clear();
-+
-+ for (QList<QDateTime>::const_iterator it = days.constBegin(); it != days.constEnd(); ++it)
-+ {
-+ m_dayFilter.insert(*it, true);
-+ }
-+}
-+
-+void ImageFilterSettings::setTagFilter(const QList<int>& includedTags,
-+ const QList<int>& excludedTags,
-+ MatchingCondition matchingCondition,
-+ bool showUnTagged,
-+ const QList<int>& clTagIds,
-+ const QList<int>& plTagIds)
-+{
-+ m_includeTagFilter = includedTags;
-+ m_excludeTagFilter = excludedTags;
-+ m_matchingCond = matchingCondition;
-+ m_untaggedFilter = showUnTagged;
-+ m_colorLabelTagFilter = clTagIds;
-+ m_pickLabelTagFilter = plTagIds;
-+}
-+
-+void ImageFilterSettings::setRatingFilter(int rating, RatingCondition ratingCondition, bool isUnratedExcluded)
-+{
-+ m_ratingFilter = rating;
-+ m_ratingCond = ratingCondition;
-+ m_isUnratedExcluded = isUnratedExcluded;
-+}
-+
-+void ImageFilterSettings::setMimeTypeFilter(int mime)
-+{
-+ m_mimeTypeFilter = (MimeFilter::TypeMimeFilter)mime;
-+}
-+
-+void ImageFilterSettings::setGeolocationFilter(const GeolocationCondition& condition)
-+{
-+ m_geolocationCondition = condition;
-+}
-+
-+void ImageFilterSettings::setTextFilter(const SearchTextFilterSettings& settings)
-+{
-+ m_textFilterSettings = settings;
-+}
-+
-+void ImageFilterSettings::setTagNames(const QHash<int, QString>& hash)
-+{
-+ m_tagNameHash = hash;
-+}
-+
-+void ImageFilterSettings::setAlbumNames(const QHash<int, QString>& hash)
-+{
-+ m_albumNameHash = hash;
-+}
-+
-+void ImageFilterSettings::setUrlWhitelist(const QList<QUrl>& urlList, const QString& id)
-+{
-+ if (urlList.isEmpty())
-+ {
-+ m_urlWhitelists.remove(id);
-+ }
-+ else
-+ {
-+ m_urlWhitelists.insert(id, urlList);
-+ }
-+}
-+
-+void ImageFilterSettings::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
-+{
-+ if (idList.isEmpty())
-+ {
-+ m_idWhitelists.remove(id);
-+ }
-+ else
-+ {
-+ m_idWhitelists.insert(id, idList);
-+ }
-+}
-+
-+template <class ContainerA, class ContainerB>
-+bool containsAnyOf(const ContainerA& listA, const ContainerB& listB)
-+{
-+ foreach (const typename ContainerA::value_type& a, listA)
-+ {
-+ if (listB.contains(a))
-+ {
-+ return true;
-+ }
-+ }
-+ return false;
-+}
-+
-+template <class ContainerA, typename Value, class ContainerB>
-+bool containsNoneOfExcept(const ContainerA& list, const ContainerB& noneOfList, const Value& exception)
-+{
-+ foreach (const typename ContainerB::value_type& n, noneOfList)
-+ {
-+ if (n != exception && list.contains(n))
-+ {
-+ return false;
-+ }
-+ }
-+ return true;
-+}
-+
-+bool ImageFilterSettings::matches(const ImageInfo& info, bool* const foundText) const
-+{
-+ if (foundText)
-+ {
-+ *foundText = false;
-+ }
-+
-+ if (!isFilteringInternally())
-+ {
-+ return true;
-+ }
-+
-+ bool match = false;
-+
-+ if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty())
-+ {
-+ QList<int> tagIds = info.tagIds();
-+ QList<int>::const_iterator it;
-+
-+ match = m_includeTagFilter.isEmpty();
-+
-+ if (m_matchingCond == OrCondition)
-+ {
-+ for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-+ {
-+ if (tagIds.contains(*it))
-+ {
-+ match = true;
-+ break;
-+ }
-+ }
-+
-+ match |= (m_untaggedFilter && tagIds.isEmpty());
-+ }
-+ else // AND matching condition...
-+ {
-+ // m_untaggedFilter and non-empty tag filter, combined with AND, is logically no match
-+ if (!m_untaggedFilter)
-+ {
-+ for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-+ {
-+ if (!tagIds.contains(*it))
-+ {
-+ break;
-+ }
-+ }
-+
-+ if (it == m_includeTagFilter.end())
-+ {
-+ match = true;
-+ }
-+ }
-+ }
-+
-+ for (it = m_excludeTagFilter.begin(); it != m_excludeTagFilter.end(); ++it)
-+ {
-+ if (tagIds.contains(*it))
-+ {
-+ match = false;
-+ break;
-+ }
-+ }
-+ }
-+ else if (m_untaggedFilter)
-+ {
-+ match = !TagsCache::instance()->containsPublicTags(info.tagIds());
-+ }
-+ else
-+ {
-+ match = true;
-+ }
-+
-+ //-- Filter by pick labels ------------------------------------------------
-+
-+ if (!m_pickLabelTagFilter.isEmpty())
-+ {
-+ QList<int> tagIds = info.tagIds();
-+ bool matchPL = false;
-+
-+ if (containsAnyOf(m_pickLabelTagFilter, tagIds))
-+ {
-+ matchPL = true;
-+ }
-+ else if (!matchPL)
-+ {
-+ int noPickLabelTagId = TagsCache::instance()->tagForPickLabel(NoPickLabel);
-+
-+ if (m_pickLabelTagFilter.contains(noPickLabelTagId))
-+ {
-+ // Searching for "has no ColorLabel" requires special handling:
-+ // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-+ matchPL = containsNoneOfExcept(tagIds, TagsCache::instance()->pickLabelTags(), noPickLabelTagId);
-+ }
-+ }
-+
-+ match &= matchPL;
-+ }
-+
-+ //-- Filter by color labels ------------------------------------------------
-+
-+ if (!m_colorLabelTagFilter.isEmpty())
-+ {
-+ QList<int> tagIds = info.tagIds();
-+ bool matchCL = false;
-+
-+ if (containsAnyOf(m_colorLabelTagFilter, tagIds))
-+ {
-+ matchCL = true;
-+ }
-+ else if (!matchCL)
-+ {
-+ int noColorLabelTagId = TagsCache::instance()->tagForColorLabel(NoColorLabel);
-+
-+ if (m_colorLabelTagFilter.contains(noColorLabelTagId))
-+ {
-+ // Searching for "has no ColorLabel" requires special handling:
-+ // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-+ matchCL = containsNoneOfExcept(tagIds, TagsCache::instance()->colorLabelTags(), noColorLabelTagId);
-+ }
-+ }
-+
-+ match &= matchCL;
-+ }
-+
-+ //-- Filter by date -----------------------------------------------------------
-+
-+ if (!m_dayFilter.isEmpty())
-+ {
-+ match &= m_dayFilter.contains(QDateTime(info.dateTime().date(), QTime()));
-+ }
-+
-+ //-- Filter by rating ---------------------------------------------------------
-+
-+ if (m_ratingFilter >= 0)
-+ {
-+ // for now we treat -1 (no rating) just like a rating of 0.
-+ int rating = info.rating();
-+
-+ if (rating == -1)
-+ {
-+ rating = 0;
-+ }
-+
-+ if(m_isUnratedExcluded && rating == 0)
-+ {
-+ match = false;
-+ }
-+ else
-+ {
-+ if (m_ratingCond == GreaterEqualCondition)
-+ {
-+ // If the rating is not >=, i.e it is <, then it does not match.
-+ if (rating < m_ratingFilter)
-+ {
-+ match = false;
-+ }
-+ }
-+ else if (m_ratingCond == EqualCondition)
-+ {
-+ // If the rating is not =, i.e it is !=, then it does not match.
-+ if (rating != m_ratingFilter)
-+ {
-+ match = false;
-+ }
-+ }
-+ else
-+ {
-+ // If the rating is not <=, i.e it is >, then it does not match.
-+ if (rating > m_ratingFilter)
-+ {
-+ match = false;
-+ }
-+ }
-+ }
-+ }
-+
-+ // -- Filter by mime type -----------------------------------------------------
-+
-+ switch (m_mimeTypeFilter)
-+ {
-+ // info.format is a standardized string: Only one possibility per mime type
-+ case MimeFilter::ImageFiles:
-+ {
-+ if (info.category() != DatabaseItem::Image)
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::JPGFiles:
-+ {
-+ if (info.format() != QLatin1String("JPG"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::PNGFiles:
-+ {
-+ if (info.format() != QLatin1String("PNG"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::TIFFiles:
-+ {
-+ if (info.format() != QLatin1String("TIFF"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::DNGFiles:
-+ {
-+ if (info.format() != QLatin1String("RAW-DNG"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::NoRAWFiles:
-+ {
-+ if (info.format().startsWith(QLatin1String("RAW")))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::RAWFiles:
-+ {
-+ if (!info.format().startsWith(QLatin1String("RAW")))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::MoviesFiles:
-+ {
-+ if (info.category() != DatabaseItem::Video)
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::AudioFiles:
-+ {
-+ if (info.category() != DatabaseItem::Audio)
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::RasterFiles:
-+ {
-+ if (info.format() != QLatin1String("PSD") && // Adobe Photoshop Document
-+ info.format() != QLatin1String("PSB") && // Adobe Photoshop Big
-+ info.format() != QLatin1String("XCF") && // Gimp
-+ info.format() != QLatin1String("KRA") && // Krita
-+ info.format() != QLatin1String("ORA") // Open Raster
-+ )
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ default:
-+ {
-+ // All Files: do nothing...
-+ break;
-+ }
-+ }
-+
-+ //-- Filter by geolocation ----------------------------------------------------
-+
-+ if (m_geolocationCondition!=GeolocationNoFilter)
-+ {
-+ if (m_geolocationCondition==GeolocationNoCoordinates)
-+ {
-+ if (info.hasCoordinates())
-+ {
-+ match = false;
-+ }
-+ }
-+ else if (m_geolocationCondition==GeolocationHasCoordinates)
-+ {
-+ if (!info.hasCoordinates())
-+ {
-+ match = false;
-+ }
-+ }
-+ }
-+
-+ //-- Filter by text -----------------------------------------------------------
-+
-+ if (!m_textFilterSettings.text.isEmpty())
-+ {
-+ bool textMatch = false;
-+
-+ // Image name
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageName &&
-+ info.name().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Image title
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageTitle &&
-+ info.title().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Image comment
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageComment &&
-+ info.comment().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Tag names
-+ foreach(int id, info.tagIds())
-+ {
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::TagName &&
-+ m_tagNameHash.value(id).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+ }
-+
-+ // Album names
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::AlbumName &&
-+ m_albumNameHash.value(info.albumId()).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Image Aspect Ratio
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageAspectRatio)
-+ {
-+ QRegExp expRatio (QLatin1String("^\\d+:\\d+$"));
-+ QRegExp expFloat (QLatin1String("^\\d+(.\\d+)?$"));
-+
-+ if (expRatio.indexIn(m_textFilterSettings.text) > -1 && m_textFilterSettings.text.contains(QRegExp(QLatin1String(":\\d+"))))
-+ {
-+ QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-+ QStringList numberStringList = trimmedTextFilterSettingsText.split(QLatin1String(":"), QString::SkipEmptyParts);
-+
-+ if (numberStringList.length() == 2)
-+ {
-+ QString numString = (QString)numberStringList.at(0), denomString = (QString)numberStringList.at(1);
-+ bool canConverseNum = false;
-+ bool canConverseDenom = false;
-+ int num = numString.toInt(&canConverseNum, 10), denom = denomString.toInt(&canConverseDenom, 10);
-+
-+ if (canConverseNum && canConverseDenom)
-+ {
-+ if (fabs(info.aspectRatio() - (double)num / denom) < 0.1)
-+ textMatch = true;
-+ }
-+ }
-+ }
-+ else if (expFloat.indexIn(m_textFilterSettings.text) > -1)
-+ {
-+ QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-+ bool canConverse = false;
-+ double ratio = trimmedTextFilterSettingsText.toDouble(&canConverse);
-+
-+ if (canConverse)
-+ {
-+ if (fabs(info.aspectRatio() - ratio) < 0.1)
-+ textMatch = true;
-+ }
-+ }
-+ }
-+
-+ // Image Pixel Size
-+ // See bug #341053 for details.
-+
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImagePixelSize)
-+ {
-+ QSize size = info.dimensions();
-+ int pixelSize = size.height()*size.width();
-+ QString text = m_textFilterSettings.text;
-+
-+ if(text.contains(QRegExp(QLatin1String("^>\\d{1,15}$"))) && pixelSize > (text.remove(0,1)).toInt())
-+ {
-+ textMatch = true;
-+ }
-+ else if(text.contains(QRegExp(QLatin1String("^<\\d{1,15}$"))) && pixelSize < (text.remove(0,1)).toInt())
-+ {
-+ textMatch = true;
-+ }
-+ else if(text.contains(QRegExp(QLatin1String("^\\d+$"))) && pixelSize == text.toInt())
-+ {
-+ textMatch = true;
-+ }
-+ }
-+
-+ match &= textMatch;
-+
-+ if (foundText)
-+ {
-+ *foundText = textMatch;
-+ }
-+ }
-+
-+ // -- filter by URL-whitelists ------------------------------------------------
-+ // NOTE: whitelists are always AND for now.
-+
-+ if (match)
-+ {
-+ const QUrl url = info.fileUrl();
-+
-+ for (QHash<QString, QList<QUrl>>::const_iterator it = m_urlWhitelists.constBegin();
-+ it!=m_urlWhitelists.constEnd(); ++it)
-+ {
-+ match = it->contains(url);
-+
-+ if (!match)
-+ {
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (match)
-+ {
-+ const qlonglong id = info.id();
-+
-+ for (QHash<QString, QList<qlonglong> >::const_iterator it = m_idWhitelists.constBegin();
-+ it!=m_idWhitelists.constEnd(); ++it)
-+ {
-+ match = it->contains(id);
-+
-+ if (!match)
-+ {
-+ break;
-+ }
-+ }
-+ }
-+
-+ return match;
-+}
-+
-+// -------------------------------------------------------------------------------------------------
-+
-+VersionImageFilterSettings::VersionImageFilterSettings()
-+{
-+ m_includeTagFilter = 0;
-+ m_exceptionTagFilter = 0;
-+}
-+
-+VersionImageFilterSettings::VersionImageFilterSettings(const VersionManagerSettings& settings)
-+{
-+ setVersionManagerSettings(settings);
-+}
-+
-+bool VersionImageFilterSettings::operator==(const VersionImageFilterSettings& other) const
-+{
-+ return m_excludeTagFilter == other.m_excludeTagFilter &&
-+ m_exceptionLists == other.m_exceptionLists;
-+}
-+
-+bool VersionImageFilterSettings::matches(const ImageInfo& info) const
-+{
-+ if (!isFiltering())
-+ {
-+ return true;
-+ }
-+
-+ const qlonglong id = info.id();
-+
-+ for (QHash<QString, QList<qlonglong> >::const_iterator it = m_exceptionLists.constBegin();
-+ it != m_exceptionLists.constEnd(); ++it)
-+ {
-+ if (it->contains(id))
-+ {
-+ return true;
-+ }
-+ }
-+
-+ bool match = true;
-+ QList<int> tagIds = info.tagIds();
-+
-+ if (!tagIds.contains(m_includeTagFilter))
-+ {
-+ for (QList<int>::const_iterator it = m_excludeTagFilter.begin();
-+ it != m_excludeTagFilter.end(); ++it)
-+ {
-+ if (tagIds.contains(*it))
-+ {
-+ match = false;
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (!match)
-+ {
-+ if (tagIds.contains(m_exceptionTagFilter))
-+ {
-+ match = true;
-+ }
-+ }
-+
-+ return match;
-+}
-+
-+bool VersionImageFilterSettings::isHiddenBySettings(const ImageInfo& info) const
-+{
-+ QList<int> tagIds = info.tagIds();
-+
-+ foreach(int tagId, m_excludeTagFilter)
-+ {
-+ if (tagIds.contains(tagId))
-+ {
-+ return true;
-+ }
-+ }
-+
-+ return false;
-+}
-+
-+bool VersionImageFilterSettings::isExemptedBySettings(const ImageInfo& info) const
-+{
-+ return info.tagIds().contains(m_exceptionTagFilter);
-+}
-+
-+void VersionImageFilterSettings::setVersionManagerSettings(const VersionManagerSettings& settings)
-+{
-+ m_excludeTagFilter.clear();
-+
-+ if (!settings.enabled)
-+ {
-+ return;
-+ }
-+
-+ if (!(settings.showInViewFlags & VersionManagerSettings::ShowOriginal))
-+ {
-+ m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::originalVersion());
-+ }
-+
-+ if (!(settings.showInViewFlags & VersionManagerSettings::ShowIntermediates))
-+ {
-+ m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::intermediateVersion());
-+ }
-+
-+ m_includeTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::currentVersion());
-+ m_exceptionTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::versionAlwaysVisible());
-+}
-+
-+void VersionImageFilterSettings::setExceptionList(const QList<qlonglong>& idList, const QString& id)
-+{
-+ if (idList.isEmpty())
-+ {
-+ m_exceptionLists.remove(id);
-+ }
-+ else
-+ {
-+ m_exceptionLists.insert(id, idList);
-+ }
-+}
-+
-+bool VersionImageFilterSettings::isFiltering() const
-+{
-+ return !m_excludeTagFilter.isEmpty();
-+}
-+
-+bool VersionImageFilterSettings::isFilteringByTags() const
-+{
-+ return isFiltering();
-+}
-+
-+// -------------------------------------------------------------------------------------------------
-+
-+GroupImageFilterSettings::GroupImageFilterSettings()
-+ : m_allOpen(false)
-+{
-+}
-+
-+bool GroupImageFilterSettings::operator==(const GroupImageFilterSettings& other) const
-+{
-+ return (m_allOpen == other.m_allOpen &&
-+ m_openGroups == other.m_openGroups);
-+}
-+
-+bool GroupImageFilterSettings::matches(const ImageInfo& info) const
-+{
-+ if (m_allOpen)
-+ {
-+ return true;
-+ }
-+
-+ if (info.isGrouped())
-+ {
-+ return m_openGroups.contains(info.groupImage().id());
-+ }
-+ return true;
-+}
-+
-+void GroupImageFilterSettings::setOpen(qlonglong group, bool open)
-+{
-+ if (open)
-+ {
-+ m_openGroups << group;
-+ }
-+ else
-+ {
-+ m_openGroups.remove(group);
-+ }
-+}
-+
-+bool GroupImageFilterSettings::isOpen(qlonglong group) const
-+{
-+ return m_openGroups.contains(group);
-+}
-+
-+void GroupImageFilterSettings::setAllOpen(bool open)
-+{
-+ m_allOpen = open;
-+}
-+
-+bool GroupImageFilterSettings::isAllOpen() const
-+{
-+ return m_allOpen;
-+}
-+
-+bool GroupImageFilterSettings::isFiltering() const
-+{
-+ return !m_allOpen;
-+}
-+
-+DatabaseFields::Set GroupImageFilterSettings::watchFlags() const
-+{
-+ return DatabaseFields::ImageRelations;
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltersettings.h b/libs/database/models/imagefiltersettings.h
-new file mode 100644
-index 0000000..0e7beae
---- /dev/null
-+++ b/libs/database/models/imagefiltersettings.h
-@@ -0,0 +1,349 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Filter values for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERSETTINGS_H
-+#define IMAGEFILTERSETTINGS_H
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QList>
-+#include <QMap>
-+#include <QString>
-+#include <QSet>
-+#include <QUrl>
-+
-+// Local includes
-+
-+#include "searchtextbar.h"
-+#include "mimefilter.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageInfo;
-+class VersionManagerSettings;
-+
-+namespace DatabaseFields
-+{
-+ class Set;
-+}
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT SearchTextFilterSettings : public SearchTextSettings
-+{
-+
-+public:
-+
-+ enum TextFilterFields
-+ {
-+ None = 0x00,
-+ ImageName = 0x01,
-+ ImageTitle = 0x02,
-+ ImageComment = 0x04,
-+ TagName = 0x08,
-+ AlbumName = 0x10,
-+ ImageAspectRatio = 0x20,
-+ ImagePixelSize = 0x40,
-+ All = ImageName | ImageTitle | ImageComment | TagName | AlbumName | ImageAspectRatio | ImagePixelSize
-+ };
-+
-+public:
-+
-+ SearchTextFilterSettings()
-+ {
-+ textFields = None;
-+ }
-+
-+ explicit SearchTextFilterSettings(const SearchTextSettings& settings)
-+ {
-+ caseSensitive = settings.caseSensitive;
-+ text = settings.text;
-+ textFields = None;
-+ }
-+
-+ TextFilterFields textFields;
-+};
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterSettings
-+{
-+public:
-+
-+ ImageFilterSettings();
-+
-+ /**
-+ * Returns true if the given ImageInfo matches the filter criteria.
-+ * Optionally, foundText is set to true if it matched by text search.
-+ */
-+ bool matches(const ImageInfo& info, bool* const foundText = 0) const;
-+
-+public:
-+
-+ /// --- Tags filter ---
-+
-+ /// Possible logical matching condition used to sort tags id.
-+ enum MatchingCondition
-+ {
-+ OrCondition,
-+ AndCondition
-+ };
-+
-+ void setTagFilter(const QList<int>& includedTags,
-+ const QList<int>& excludedTags,
-+ MatchingCondition matchingCond,
-+ bool showUnTagged,
-+ const QList<int>& clTagIds,
-+ const QList<int>& plTagIds);
-+
-+public:
-+
-+ /// --- Rating filter ---
-+
-+ /// Possible conditions used to filter rating: >=, =, <=
-+ enum RatingCondition
-+ {
-+ GreaterEqualCondition,
-+ EqualCondition,
-+ LessEqualCondition
-+ };
-+
-+ void setRatingFilter(int rating, RatingCondition ratingCond, bool isUnratedExcluded);
-+
-+public:
-+
-+ /// --- Date filter ---
-+ void setDayFilter(const QList<QDateTime>& days);
-+
-+public:
-+
-+ /// --- Text filter ---
-+ void setTextFilter(const SearchTextFilterSettings& settings);
-+ void setTagNames(const QHash<int, QString>& tagNameHash);
-+ void setAlbumNames(const QHash<int, QString>& albumNameHash);
-+
-+public:
-+
-+ /// --- Mime filter ---
-+ void setMimeTypeFilter(int mimeTypeFilter);
-+
-+public:
-+
-+ /// --- Geolocation filter
-+ enum GeolocationCondition
-+ {
-+ GeolocationNoFilter = 0,
-+ GeolocationNoCoordinates = 1 << 1,
-+ GeolocationHasCoordinates = 1 << 2
-+ };
-+
-+ void setGeolocationFilter(const GeolocationCondition& condition);
-+
-+public:
-+
-+ /// Returns if the day is a filter criteria
-+ bool isFilteringByDay() const;
-+
-+ /// Returns if the type mime is a filter criteria
-+ bool isFilteringByTypeMime() const;
-+
-+ /// Returns whether geolocation is a filter criteria
-+ bool isFilteringByGeolocation() const;
-+
-+ /// Returns if the rating is a filter criteria
-+ bool isFilteringByRating() const;
-+
-+ /// Returns if the pick labels is a filter criteria
-+ bool isFilteringByPickLabels() const;
-+
-+ /// Returns if the color labels is a filter criteria
-+ bool isFilteringByColorLabels() const;
-+
-+ /// Returns if the tag is a filter criteria
-+ bool isFilteringByTags() const;
-+
-+ /// Returns if the text (including comment) is a filter criteria
-+ bool isFilteringByText() const;
-+
-+ /// Returns if images will be filtered by these criteria at all
-+ bool isFiltering() const;
-+
-+public:
-+
-+ /// --- URL whitelist filter
-+ void setUrlWhitelist(const QList<QUrl>& urlList, const QString& id);
-+
-+public:
-+
-+ /// --- ID whitelist filter
-+ void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
-+
-+public:
-+
-+ /// --- Change notification ---
-+
-+ /** Returns database fields a change in which would affect the current filtering.
-+ * To find out if an image tag change affects filtering, test isFilteringByTags().
-+ * The text filter will also be affected by changes in tags and album names.
-+ */
-+ DatabaseFields::Set watchFlags() const;
-+
-+private:
-+
-+ /**
-+ * @brief Returns whether some internal filtering (whitelist by id or URL) or normal filtering is going on
-+ */
-+ bool isFilteringInternally() const;
-+
-+private:
-+
-+ /// --- Tags filter ---
-+ bool m_untaggedFilter;
-+ QList<int> m_includeTagFilter;
-+ QList<int> m_excludeTagFilter;
-+ MatchingCondition m_matchingCond;
-+ QList<int> m_colorLabelTagFilter;
-+ QList<int> m_pickLabelTagFilter;
-+
-+ /// --- Rating filter ---
-+ int m_ratingFilter;
-+ RatingCondition m_ratingCond;
-+ bool m_isUnratedExcluded;
-+
-+ /// --- Date filter ---
-+ QMap<QDateTime, bool> m_dayFilter;
-+
-+ /// --- Text filter ---
-+ SearchTextFilterSettings m_textFilterSettings;
-+
-+ /// Helpers for text search: Set these if you want to search album or tag names with text search
-+ QHash<int, QString> m_tagNameHash;
-+ QHash<int, QString> m_albumNameHash;
-+
-+ /// --- Mime filter ---
-+ MimeFilter::TypeMimeFilter m_mimeTypeFilter;
-+
-+ /// --- Geolocation filter
-+ GeolocationCondition m_geolocationCondition;
-+
-+ /// --- URL whitelist filter
-+ QHash<QString,QList<QUrl>> m_urlWhitelists;
-+
-+ /// --- ID whitelist filter
-+ QHash<QString,QList<qlonglong> > m_idWhitelists;
-+};
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT VersionImageFilterSettings
-+{
-+public:
-+
-+ VersionImageFilterSettings();
-+ explicit VersionImageFilterSettings(const VersionManagerSettings& settings);
-+
-+ bool operator==(const VersionImageFilterSettings& other) const;
-+
-+ /**
-+ * Returns true if the given ImageInfo matches the filter criteria.
-+ */
-+ bool matches(const ImageInfo& info) const;
-+
-+ bool isHiddenBySettings(const ImageInfo& info) const;
-+ bool isExemptedBySettings(const ImageInfo& info) const;
-+
-+ /// --- Tags filter ---
-+
-+ void setVersionManagerSettings(const VersionManagerSettings& settings);
-+
-+ /**
-+ * Add list with exceptions: These images will be exempted from filtering by this filter
-+ */
-+ void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
-+
-+ /// Returns if images will be filtered by these criteria at all
-+ bool isFiltering() const;
-+
-+ /// Returns if the tag is a filter criteria
-+ bool isFilteringByTags() const;
-+
-+ /// DatabaseFields::Set watchFlags() const: Would return 0
-+
-+protected:
-+
-+ QList<int> m_excludeTagFilter;
-+ int m_includeTagFilter;
-+ int m_exceptionTagFilter;
-+ QHash<QString,QList<qlonglong> > m_exceptionLists;
-+};
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT GroupImageFilterSettings
-+{
-+public:
-+
-+ GroupImageFilterSettings();
-+
-+ bool operator==(const GroupImageFilterSettings& other) const;
-+
-+ /**
-+ * Returns true if the given ImageInfo matches the filter criteria.
-+ */
-+ bool matches(const ImageInfo& info) const;
-+
-+ /**
-+ * Open or close a group.
-+ */
-+ void setOpen(qlonglong group, bool open);
-+ bool isOpen(qlonglong group) const;
-+
-+ /**
-+ * Open all groups
-+ */
-+ void setAllOpen(bool open);
-+ bool isAllOpen() const;
-+
-+ /// Returns if images will be filtered by these criteria at all
-+ bool isFiltering() const;
-+
-+ DatabaseFields::Set watchFlags() const;
-+
-+protected:
-+
-+ bool m_allOpen;
-+ QSet<qlonglong> m_openGroups;
-+};
-+
-+} // namespace Digikam
-+
-+Q_DECLARE_METATYPE(Digikam::ImageFilterSettings::GeolocationCondition)
-+
-+#endif // IMAGEFILTERSETTINGS_H
-diff --git a/libs/database/models/imagelistmodel.cpp b/libs/database/models/imagelistmodel.cpp
-new file mode 100644
-index 0000000..fafce34
---- /dev/null
-+++ b/libs/database/models/imagelistmodel.cpp
-@@ -0,0 +1,70 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-12-06
-+ * Description : An image model based on a static list
-+ *
-+ * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagelistmodel.h"
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbaccess.h"
-+#include "coredbchangesets.h"
-+#include "coredbwatch.h"
-+#include "imageinfo.h"
-+#include "imageinfolist.h"
-+
-+namespace Digikam
-+{
-+
-+ImageListModel::ImageListModel(QObject* parent)
-+ : ImageThumbnailModel(parent)
-+{
-+ connect(CoreDbAccess::databaseWatch(), SIGNAL(collectionImageChange(CollectionImageChangeset)),
-+ this, SLOT(slotCollectionImageChange(CollectionImageChangeset)));
-+}
-+
-+ImageListModel::~ImageListModel()
-+{
-+}
-+
-+void ImageListModel::slotCollectionImageChange(const CollectionImageChangeset& changeset)
-+{
-+ if (isEmpty())
-+ {
-+ return;
-+ }
-+
-+ switch (changeset.operation())
-+ {
-+ case CollectionImageChangeset::Added:
-+ break;
-+ case CollectionImageChangeset::Removed:
-+ case CollectionImageChangeset::RemovedAll:
-+ removeImageInfos(ImageInfoList(changeset.ids()));
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagelistmodel.h b/libs/database/models/imagelistmodel.h
-new file mode 100644
-index 0000000..a225b1b
---- /dev/null
-+++ b/libs/database/models/imagelistmodel.h
-@@ -0,0 +1,63 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-12-06
-+ * Description : An image model based on a static list
-+ *
-+ * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGELISTMODEL_H
-+#define IMAGELISTMODEL_H
-+
-+// Local includes
-+
-+#include "imagethumbnailmodel.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageChangeset;
-+class CollectionImageChangeset;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageListModel : public ImageThumbnailModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageListModel(QObject* parent = 0);
-+ ~ImageListModel();
-+
-+ // NOTE: necessary methods to add and remove ImageInfos to the model are inherited from ImageModel
-+
-+Q_SIGNALS:
-+
-+ /**
-+ * Emitted when images are removed from the model because they are removed in the database
-+ */
-+ void imageInfosRemoved(const QList<ImageInfo>& infos);
-+
-+protected Q_SLOTS:
-+
-+ void slotCollectionImageChange(const CollectionImageChangeset& changeset);
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGELISTMODEL_H
-diff --git a/libs/database/models/imagemodel.cpp b/libs/database/models/imagemodel.cpp
-new file mode 100644
-index 0000000..41b43cf
---- /dev/null
-+++ b/libs/database/models/imagemodel.cpp
-@@ -0,0 +1,1368 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagemodel.h"
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QItemSelection>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbchangesets.h"
-+#include "coredbfields.h"
-+#include "coredbwatch.h"
-+#include "imageinfo.h"
-+#include "imageinfolist.h"
-+#include "abstractitemdragdrophandler.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageModel::Private
-+{
-+public:
-+
-+ Private()
-+ {
-+ preprocessor = 0;
-+ keepFilePathCache = false;
-+ sendRemovalSignals = false;
-+ incrementalUpdater = 0;
-+ refreshing = false;
-+ reAdding = false;
-+ incrementalRefreshRequested = false;
-+ }
-+
-+ ImageInfoList infos;
-+ QList<QVariant> extraValues;
-+ QHash<qlonglong, int> idHash;
-+
-+ bool keepFilePathCache;
-+ QHash<QString, qlonglong> filePathHash;
-+
-+ bool sendRemovalSignals;
-+
-+ QObject* preprocessor;
-+ bool refreshing;
-+ bool reAdding;
-+ bool incrementalRefreshRequested;
-+
-+ DatabaseFields::Set watchFlags;
-+
-+ class ImageModelIncrementalUpdater* incrementalUpdater;
-+
-+ ImageInfoList pendingInfos;
-+ QList<QVariant> pendingExtraValues;
-+
-+ inline bool isValid(const QModelIndex& index)
-+ {
-+ if (!index.isValid())
-+ {
-+ return false;
-+ }
-+
-+ if (index.row() < 0 || index.row() >= infos.size())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index" << index;
-+ return false;
-+ }
-+
-+ return true;
-+ }
-+ inline bool extraValueValid(const QModelIndex& index)
-+ {
-+ // we assume isValid() being called before, no duplicate checks
-+ if (index.row() >= extraValues.size())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index for extraData" << index;
-+ return false;
-+ }
-+
-+ return true;
-+ }
-+};
-+
-+typedef QPair<int, int> IntPair; // to make foreach macro happy
-+typedef QList<IntPair> IntPairList;
-+
-+class ImageModelIncrementalUpdater
-+{
-+public:
-+
-+ explicit ImageModelIncrementalUpdater(ImageModel::Private* d);
-+
-+ void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void aboutToBeRemovedInModel(const IntPairList& aboutToBeRemoved);
-+ QList<IntPair> oldIndexes();
-+
-+ static QList<IntPair> toContiguousPairs(const QList<int>& ids);
-+
-+public:
-+
-+ QHash<qlonglong, int> oldIds;
-+ QList<QVariant> oldExtraValues;
-+ QList<ImageInfo> newInfos;
-+ QList<QVariant> newExtraValues;
-+ QList<IntPairList> modelRemovals;
-+};
-+
-+ImageModel::ImageModel(QObject* parent)
-+ : QAbstractListModel(parent),
-+ d(new Private)
-+{
-+ connect(CoreDbAccess::databaseWatch(), SIGNAL(imageChange(ImageChangeset)),
-+ this, SLOT(slotImageChange(ImageChangeset)));
-+
-+ connect(CoreDbAccess::databaseWatch(), SIGNAL(imageTagChange(ImageTagChangeset)),
-+ this, SLOT(slotImageTagChange(ImageTagChangeset)));
-+}
-+
-+ImageModel::~ImageModel()
-+{
-+ delete d->incrementalUpdater;
-+ delete d;
-+}
-+
-+// ------------ Access methods -------------
-+
-+void ImageModel::setKeepsFilePathCache(bool keepCache)
-+{
-+ d->keepFilePathCache = keepCache;
-+}
-+
-+bool ImageModel::keepsFilePathCache() const
-+{
-+ return d->keepFilePathCache;
-+}
-+
-+bool ImageModel::isEmpty() const
-+{
-+ return d->infos.isEmpty();
-+}
-+
-+void ImageModel::setWatchFlags(const DatabaseFields::Set& set)
-+{
-+ d->watchFlags = set;
-+}
-+
-+ImageInfo ImageModel::imageInfo(const QModelIndex& index) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return ImageInfo();
-+ }
-+
-+ return d->infos.at(index.row());
-+}
-+
-+ImageInfo& ImageModel::imageInfoRef(const QModelIndex& index) const
-+{
-+ return d->infos[index.row()];
-+}
-+
-+qlonglong ImageModel::imageId(const QModelIndex& index) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return 0;
-+ }
-+
-+ return d->infos.at(index.row()).id();
-+}
-+
-+QList<ImageInfo> ImageModel::imageInfos(const QList<QModelIndex>& indexes) const
-+{
-+ QList<ImageInfo> infos;
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ infos << imageInfo(index);
-+ }
-+
-+ return infos;
-+}
-+
-+QList<qlonglong> ImageModel::imageIds(const QList<QModelIndex>& indexes) const
-+{
-+ QList<qlonglong> ids;
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ ids << imageId(index);
-+ }
-+
-+ return ids;
-+}
-+
-+ImageInfo ImageModel::imageInfo(int row) const
-+{
-+ if (row >= d->infos.size())
-+ {
-+ return ImageInfo();
-+ }
-+
-+ return d->infos.at(row);
-+}
-+
-+ImageInfo& ImageModel::imageInfoRef(int row) const
-+{
-+ return d->infos[row];
-+}
-+
-+qlonglong ImageModel::imageId(int row) const
-+{
-+ if (row < 0 || row >= d->infos.size())
-+ {
-+ return -1;
-+ }
-+
-+ return d->infos.at(row).id();
-+}
-+
-+QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info) const
-+{
-+ return indexForImageId(info.id());
-+}
-+
-+QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const
-+{
-+ return indexForImageId(info.id(), extraValue);
-+}
-+
-+QList<QModelIndex> ImageModel::indexesForImageInfo(const ImageInfo& info) const
-+{
-+ return indexesForImageId(info.id());
-+}
-+
-+QModelIndex ImageModel::indexForImageId(qlonglong id) const
-+{
-+ int index = d->idHash.value(id, -1);
-+
-+ if (index != -1)
-+ {
-+ return createIndex(index, 0);
-+ }
-+
-+ return QModelIndex();
-+}
-+
-+QModelIndex ImageModel::indexForImageId(qlonglong id, const QVariant& extraValue) const
-+{
-+ if (d->extraValues.isEmpty())
-+ return indexForImageId(id);
-+
-+ QHash<qlonglong, int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ if (d->extraValues.at(it.value()) == extraValue)
-+ return createIndex(it.value(), 0);
-+ }
-+
-+ return QModelIndex();
-+}
-+
-+QList<QModelIndex> ImageModel::indexesForImageId(qlonglong id) const
-+{
-+ QList<QModelIndex> indexes;
-+ QHash<qlonglong, int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ indexes << createIndex(it.value(), 0);
-+ }
-+
-+ return indexes;
-+}
-+
-+int ImageModel::numberOfIndexesForImageInfo(const ImageInfo& info) const
-+{
-+ return numberOfIndexesForImageId(info.id());
-+}
-+
-+int ImageModel::numberOfIndexesForImageId(qlonglong id) const
-+{
-+ if (d->extraValues.isEmpty())
-+ {
-+ return 0;
-+ }
-+
-+ int count = 0;
-+ QHash<qlonglong,int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ ++count;
-+ }
-+
-+ return count;
-+}
-+
-+// static method
-+ImageInfo ImageModel::retrieveImageInfo(const QModelIndex& index)
-+{
-+ if (!index.isValid())
-+ {
-+ return ImageInfo();
-+ }
-+
-+ ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-+ int row = index.data(ImageModelInternalId).toInt();
-+
-+ if (!model)
-+ {
-+ return ImageInfo();
-+ }
-+
-+ return model->imageInfo(row);
-+}
-+
-+// static method
-+qlonglong ImageModel::retrieveImageId(const QModelIndex& index)
-+{
-+ if (!index.isValid())
-+ {
-+ return 0;
-+ }
-+
-+ ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-+ int row = index.data(ImageModelInternalId).toInt();
-+
-+ if (!model)
-+ {
-+ return 0;
-+ }
-+
-+ return model->imageId(row);
-+}
-+
-+QModelIndex ImageModel::indexForPath(const QString& filePath) const
-+{
-+ if (d->keepFilePathCache)
-+ {
-+ return indexForImageId(d->filePathHash.value(filePath));
-+ }
-+ else
-+ {
-+ const int size = d->infos.size();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ if (d->infos.at(i).filePath() == filePath)
-+ {
-+ return createIndex(i, 0);
-+ }
-+ }
-+ }
-+
-+ return QModelIndex();
-+}
-+
-+QList<QModelIndex> ImageModel::indexesForPath(const QString& filePath) const
-+{
-+ if (d->keepFilePathCache)
-+ {
-+ return indexesForImageId(d->filePathHash.value(filePath));
-+ }
-+ else
-+ {
-+ QList<QModelIndex> indexes;
-+ const int size = d->infos.size();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ if (d->infos.at(i).filePath() == filePath)
-+ {
-+ indexes << createIndex(i, 0);
-+ }
-+ }
-+
-+ return indexes;
-+ }
-+}
-+
-+ImageInfo ImageModel::imageInfo(const QString& filePath) const
-+{
-+ if (d->keepFilePathCache)
-+ {
-+ qlonglong id = d->filePathHash.value(filePath);
-+
-+ if (id)
-+ {
-+ int index = d->idHash.value(id, -1);
-+
-+ if (index != -1)
-+ {
-+ return d->infos.at(index);
-+ }
-+ }
-+ }
-+ else
-+ {
-+ foreach(const ImageInfo& info, d->infos)
-+ {
-+ if (info.filePath() == filePath)
-+ {
-+ return info;
-+ }
-+ }
-+ }
-+
-+ return ImageInfo();
-+}
-+
-+QList<ImageInfo> ImageModel::imageInfos(const QString& filePath) const
-+{
-+ QList<ImageInfo> infos;
-+
-+ if (d->keepFilePathCache)
-+ {
-+ qlonglong id = d->filePathHash.value(filePath);
-+
-+ if (id)
-+ {
-+ foreach(int index, d->idHash.values(id))
-+ {
-+ infos << d->infos.at(index);
-+ }
-+ }
-+ }
-+ else
-+ {
-+ foreach(const ImageInfo& info, d->infos)
-+ {
-+ if (info.filePath() == filePath)
-+ {
-+ infos << info;
-+ }
-+ }
-+ }
-+
-+ return infos;
-+}
-+
-+void ImageModel::addImageInfo(const ImageInfo& info)
-+{
-+ addImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfos(const QList<ImageInfo>& infos)
-+{
-+ addImageInfos(infos, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ if (d->incrementalUpdater)
-+ {
-+ d->incrementalUpdater->appendInfos(infos, extraValues);
-+ }
-+ else
-+ {
-+ appendInfos(infos, extraValues);
-+ }
-+}
-+
-+void ImageModel::addImageInfoSynchronously(const ImageInfo& info)
-+{
-+ addImageInfosSynchronously(QList<ImageInfo>() << info, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos)
-+{
-+ addImageInfos(infos, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ publiciseInfos(infos, extraValues);
-+ emit processAdded(infos, extraValues);
-+}
-+
-+void ImageModel::ensureHasImageInfo(const ImageInfo& info)
-+{
-+ ensureHasImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
-+}
-+
-+void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos)
-+{
-+ ensureHasImageInfos(infos, QList<QVariant>());
-+}
-+
-+void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (extraValues.isEmpty())
-+ {
-+ if (!d->pendingExtraValues.isEmpty())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-+ return;
-+ }
-+ }
-+ else
-+ {
-+ if (d->pendingInfos.size() != d->pendingExtraValues.size())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-+ return;
-+ }
-+ }
-+
-+ d->pendingInfos << infos;
-+ d->pendingExtraValues << extraValues;
-+ cleanSituationChecks();
-+}
-+
-+void ImageModel::clearImageInfos()
-+{
-+ d->infos.clear();
-+ d->extraValues.clear();
-+ d->idHash.clear();
-+ d->filePathHash.clear();
-+ delete d->incrementalUpdater;
-+ d->incrementalUpdater = 0;
-+ d->pendingInfos.clear();
-+ d->pendingExtraValues.clear();
-+ d->refreshing = false;
-+ d->reAdding = false;
-+ d->incrementalRefreshRequested = false;
-+
-+ beginResetModel();
-+ endResetModel();
-+
-+ imageInfosCleared();
-+}
-+
-+void ImageModel::setImageInfos(const QList<ImageInfo>& infos)
-+{
-+ clearImageInfos();
-+ addImageInfos(infos);
-+}
-+
-+QList<ImageInfo> ImageModel::imageInfos() const
-+{
-+ return d->infos;
-+}
-+
-+QList<qlonglong> ImageModel::imageIds() const
-+{
-+ return d->idHash.keys();
-+}
-+
-+bool ImageModel::hasImage(qlonglong id) const
-+{
-+ return d->idHash.contains(id);
-+}
-+
-+bool ImageModel::hasImage(const ImageInfo& info) const
-+{
-+ return d->idHash.contains(info.id());
-+}
-+
-+bool ImageModel::hasImage(const ImageInfo& info, const QVariant& extraValue) const
-+{
-+ return hasImage(info.id(), extraValue);
-+}
-+
-+bool ImageModel::hasImage(qlonglong id, const QVariant& extraValue) const
-+{
-+ if (d->extraValues.isEmpty())
-+ return hasImage(id);
-+
-+ QHash<qlonglong, int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ if (d->extraValues.at(it.value()) == extraValue)
-+ return true;
-+ }
-+
-+ return false;;
-+}
-+
-+QList<ImageInfo> ImageModel::uniqueImageInfos() const
-+{
-+ if (d->extraValues.isEmpty())
-+ {
-+ return d->infos;
-+ }
-+
-+ QList<ImageInfo> uniqueInfos;
-+ const int size = d->infos.size();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ const ImageInfo& info = d->infos.at(i);
-+
-+ if (d->idHash.value(info.id()) == i)
-+ {
-+ uniqueInfos << info;
-+ }
-+ }
-+
-+ return uniqueInfos;
-+}
-+
-+void ImageModel::emitDataChangedForAll()
-+{
-+ if (d->infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ QModelIndex first = createIndex(0, 0);
-+ QModelIndex last = createIndex(d->infos.size() - 1, 0);
-+ emit dataChanged(first, last);
-+}
-+
-+void ImageModel::emitDataChangedForSelection(const QItemSelection& selection)
-+{
-+ if (!selection.isEmpty())
-+ {
-+ foreach(const QItemSelectionRange& range, selection)
-+ {
-+ emit dataChanged(range.topLeft(), range.bottomRight());
-+ }
-+ }
-+}
-+
-+void ImageModel::ensureHasGroupedImages(const ImageInfo& groupLeader)
-+{
-+ ensureHasImageInfos(groupLeader.groupedImages());
-+}
-+
-+// ------------ Preprocessing -------------
-+
-+void ImageModel::setPreprocessor(QObject* preprocessor)
-+{
-+ unsetPreprocessor(d->preprocessor);
-+ d->preprocessor = preprocessor;
-+}
-+
-+void ImageModel::unsetPreprocessor(QObject* preprocessor)
-+{
-+ if (preprocessor && d->preprocessor == preprocessor)
-+ {
-+ disconnect(this, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)), 0, 0);
-+ disconnect(d->preprocessor, 0, this, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
-+ disconnect(d->preprocessor, 0, this, SLOT(reAddingFinished()));
-+ }
-+}
-+
-+void ImageModel::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ if (d->preprocessor)
-+ {
-+ d->reAdding = true;
-+ emit preprocess(infos, extraValues);
-+ }
-+ else
-+ {
-+ publiciseInfos(infos, extraValues);
-+ }
-+}
-+
-+void ImageModel::appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ // This method does deduplication. It is private because in context of readding or refreshing it is of no use.
-+
-+ if (extraValues.isEmpty())
-+ {
-+ QList<ImageInfo> checkedInfos;
-+
-+ foreach (const ImageInfo& info, infos)
-+ {
-+ if (!hasImage(info))
-+ {
-+ checkedInfos << info;
-+ }
-+ }
-+
-+ appendInfos(checkedInfos, QList<QVariant>());
-+ }
-+ else
-+ {
-+ QList<ImageInfo> checkedInfos;
-+ QList<QVariant> checkedExtraValues;
-+ const int size = infos.size();
-+
-+ for (int i=0; i<size; i++)
-+ {
-+ if (!hasImage(infos[i], extraValues[i]))
-+ {
-+ checkedInfos << infos[i];
-+ checkedExtraValues << extraValues[i];
-+ }
-+ }
-+
-+ appendInfos(checkedInfos, checkedExtraValues);
-+ }
-+}
-+
-+void ImageModel::reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ // addImageInfos -> appendInfos -> preprocessor -> reAddImageInfos
-+ publiciseInfos(infos, extraValues);
-+}
-+
-+void ImageModel::reAddingFinished()
-+{
-+ d->reAdding = false;
-+ cleanSituationChecks();
-+}
-+
-+void ImageModel::startRefresh()
-+{
-+ d->refreshing = true;
-+}
-+
-+void ImageModel::finishRefresh()
-+{
-+ d->refreshing = false;
-+ cleanSituationChecks();
-+}
-+
-+bool ImageModel::isRefreshing() const
-+{
-+ return d->refreshing;
-+}
-+
-+void ImageModel::cleanSituationChecks()
-+{
-+ // For starting an incremental refresh we want a clear situation:
-+ // Any remaining batches from non-incremental refreshing subclasses have been received in appendInfos(),
-+ // any batches sent to preprocessor for re-adding have been re-added.
-+ if (d->refreshing || d->reAdding)
-+ {
-+ return;
-+ }
-+
-+ if (!d->pendingInfos.isEmpty())
-+ {
-+ appendInfosChecked(d->pendingInfos, d->pendingExtraValues);
-+ d->pendingInfos.clear();
-+ d->pendingExtraValues.clear();
-+ cleanSituationChecks();
-+ return;
-+ }
-+
-+ if (d->incrementalRefreshRequested)
-+ {
-+ d->incrementalRefreshRequested = false;
-+ emit readyForIncrementalRefresh();
-+ }
-+ else
-+ {
-+ emit allRefreshingFinished();
-+ }
-+}
-+
-+void ImageModel::publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ Q_ASSERT(infos.size() == extraValues.size() || (extraValues.isEmpty() && d->extraValues.isEmpty()));
-+
-+ emit imageInfosAboutToBeAdded(infos);
-+ const int firstNewIndex = d->infos.size();
-+ const int lastNewIndex = d->infos.size() + infos.size() - 1;
-+ beginInsertRows(QModelIndex(), firstNewIndex, lastNewIndex);
-+ d->infos << infos;
-+ d->extraValues << extraValues;
-+
-+ for (int i=firstNewIndex; i<=lastNewIndex; ++i)
-+ {
-+ const ImageInfo& info = d->infos.at(i);
-+ qlonglong id = info.id();
-+ d->idHash.insertMulti(id, i);
-+
-+ if (d->keepFilePathCache)
-+ {
-+ d->filePathHash[info.filePath()] = id;
-+ }
-+ }
-+
-+ endInsertRows();
-+ emit imageInfosAdded(infos);
-+}
-+
-+void ImageModel::requestIncrementalRefresh()
-+{
-+ if (d->reAdding)
-+ {
-+ d->incrementalRefreshRequested = true;
-+ }
-+ else
-+ {
-+ emit readyForIncrementalRefresh();
-+ }
-+}
-+
-+bool ImageModel::hasIncrementalRefreshPending() const
-+{
-+ return d->incrementalRefreshRequested;
-+}
-+
-+void ImageModel::startIncrementalRefresh()
-+{
-+ delete d->incrementalUpdater;
-+
-+ d->incrementalUpdater = new ImageModelIncrementalUpdater(d);
-+}
-+
-+void ImageModel::finishIncrementalRefresh()
-+{
-+ if (!d->incrementalUpdater)
-+ {
-+ return;
-+ }
-+
-+ // remove old entries
-+ QList<QPair<int, int> > pairs = d->incrementalUpdater->oldIndexes();
-+ removeRowPairs(pairs);
-+
-+ // add new indexes
-+ appendInfos(d->incrementalUpdater->newInfos, d->incrementalUpdater->newExtraValues);
-+
-+ delete d->incrementalUpdater;
-+ d->incrementalUpdater = 0;
-+}
-+
-+void ImageModel::removeIndex(const QModelIndex& index)
-+{
-+ removeIndexes(QList<QModelIndex>() << index);
-+}
-+
-+void ImageModel::removeIndexes(const QList<QModelIndex>& indexes)
-+{
-+ QList<int> listIndexes;
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ if (d->isValid(index))
-+ {
-+ listIndexes << index.row();
-+ }
-+ }
-+
-+ if (listIndexes.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
-+}
-+
-+void ImageModel::removeImageInfo(const ImageInfo& info)
-+{
-+ removeImageInfos(QList<ImageInfo>() << info);
-+}
-+
-+void ImageModel::removeImageInfos(const QList<ImageInfo>& infos)
-+{
-+ QList<int> listIndexes;
-+
-+ foreach(const ImageInfo& info, infos)
-+ {
-+ QModelIndex index = indexForImageId(info.id());
-+
-+ if (index.isValid())
-+ {
-+ listIndexes << index.row();
-+ }
-+ }
-+ removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
-+}
-+
-+void ImageModel::removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (extraValues.isEmpty())
-+ {
-+ removeImageInfos(infos);
-+ return;
-+ }
-+
-+ QList<int> listIndexes;
-+
-+ for (int i=0; i<infos.size(); ++i)
-+ {
-+ QModelIndex index = indexForImageId(infos.at(i).id(), extraValues.at(i));
-+
-+ if (index.isValid())
-+ {
-+ listIndexes << index.row();
-+ }
-+ }
-+
-+ removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
-+}
-+
-+void ImageModel::setSendRemovalSignals(bool send)
-+{
-+ d->sendRemovalSignals = send;
-+}
-+
-+template <class List, typename T>
-+static bool pairsContain(const List& list, T value)
-+{
-+ typename List::const_iterator middle;
-+ typename List::const_iterator begin = list.begin();
-+ typename List::const_iterator end = list.end();
-+ int n = int(end - begin);
-+ int half;
-+
-+ while (n > 0)
-+ {
-+ half = n >> 1;
-+ middle = begin + half;
-+
-+ if (middle->first <= value && middle->second >= value)
-+ {
-+ return true;
-+ }
-+ else if (middle->second < value)
-+ {
-+ begin = middle + 1;
-+ n -= half + 1;
-+ }
-+ else
-+ {
-+ n = half;
-+ }
-+ }
-+
-+ return false;
-+}
-+
-+void ImageModel::removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove)
-+{
-+ if (d->incrementalUpdater)
-+ {
-+ d->incrementalUpdater->aboutToBeRemovedInModel(toRemove);
-+ }
-+
-+ removeRowPairs(toRemove);
-+}
-+
-+void ImageModel::removeRowPairs(const QList<QPair<int, int> >& toRemove)
-+{
-+ if (toRemove.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ // Remove old indexes
-+ // Keep in mind that when calling beginRemoveRows all structures announced to be removed
-+ // must still be valid, and this includes our hashes as well, which limits what we can optimize
-+
-+ int removedRows = 0, offset = 0;
-+ typedef QPair<int, int> IntPair; // to make foreach macro happy
-+
-+ foreach(const IntPair& pair, toRemove)
-+ {
-+ const int begin = pair.first - offset;
-+ const int end = pair.second - offset; // inclusive
-+ removedRows = end - begin + 1;
-+
-+ // when removing from the list, all subsequent indexes are affected
-+ offset += removedRows;
-+
-+ QList<ImageInfo> removedInfos;
-+
-+ if (d->sendRemovalSignals)
-+ {
-+ qCopy(d->infos.begin() + begin, d->infos.begin() + end, removedInfos.begin());
-+ emit imageInfosAboutToBeRemoved(removedInfos);
-+ }
-+
-+ imageInfosAboutToBeRemoved(begin, end);
-+ beginRemoveRows(QModelIndex(), begin, end);
-+
-+ // update idHash - which points to indexes of d->infos, and these change now!
-+ QHash<qlonglong, int>::iterator it;
-+
-+ for (it = d->idHash.begin(); it != d->idHash.end(); )
-+ {
-+ if (it.value() >= begin)
-+ {
-+ if (it.value() > end)
-+ {
-+ // after the removed interval: adjust index
-+ it.value() -= removedRows;
-+ }
-+ else
-+ {
-+ // in the removed interval
-+ it = d->idHash.erase(it);
-+ continue;
-+ }
-+ }
-+
-+ ++it;
-+ }
-+
-+ // remove from list
-+ d->infos.erase(d->infos.begin() + begin, d->infos.begin() + (end + 1));
-+
-+ if (!d->extraValues.isEmpty())
-+ {
-+ d->extraValues.erase(d->extraValues.begin() + begin, d->extraValues.begin() + (end + 1));
-+ }
-+
-+ endRemoveRows();
-+
-+ if (d->sendRemovalSignals)
-+ {
-+ emit imageInfosRemoved(removedInfos);
-+ }
-+ }
-+
-+ // tidy up: remove old indexes from file path hash now
-+ if (d->keepFilePathCache)
-+ {
-+ QHash<QString, qlonglong>::iterator it;
-+
-+ for (it = d->filePathHash.begin(); it != d->filePathHash.end(); )
-+ {
-+ if (pairsContain(toRemove, it.value()))
-+ {
-+ it = d->filePathHash.erase(it);
-+ }
-+ else
-+ {
-+ ++it;
-+ }
-+ }
-+ }
-+}
-+
-+ImageModelIncrementalUpdater::ImageModelIncrementalUpdater(ImageModel::Private* d)
-+{
-+ oldIds = d->idHash;
-+ oldExtraValues = d->extraValues;
-+}
-+
-+void ImageModelIncrementalUpdater::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (extraValues.isEmpty())
-+ {
-+ foreach(const ImageInfo& info, infos)
-+ {
-+ QHash<qlonglong,int>::iterator it = oldIds.find(info.id());
-+
-+ if (it != oldIds.end())
-+ {
-+ oldIds.erase(it);
-+ }
-+ else
-+ {
-+ newInfos << info;
-+ }
-+ }
-+ }
-+ else
-+ {
-+ for (int i=0; i<infos.size(); ++i)
-+ {
-+ const ImageInfo& info = infos.at(i);
-+ bool found = false;
-+ QHash<qlonglong,int>::iterator it;
-+
-+ for (it = oldIds.find(info.id()); it != oldIds.end() && it.key() == info.id(); ++it)
-+ {
-+ // first check is for bug #262596. Not sure if needed.
-+ if (it.value() < oldExtraValues.size() && extraValues.at(i) == oldExtraValues.at(it.value()))
-+ {
-+ found = true;
-+ break;
-+ }
-+ }
-+
-+ if (found)
-+ {
-+ oldIds.erase(it);
-+ // do not erase from oldExtraValues - oldIds is a hash id -> index.
-+ }
-+ else
-+ {
-+ newInfos << info;
-+ newExtraValues << extraValues.at(i);
-+ }
-+ }
-+ }
-+}
-+
-+void ImageModelIncrementalUpdater::aboutToBeRemovedInModel(const IntPairList& toRemove)
-+{
-+ modelRemovals << toRemove;
-+}
-+
-+QList<QPair<int, int> > ImageModelIncrementalUpdater::oldIndexes()
-+{
-+ // first, apply all changes to indexes by direct removal in model
-+ // while the updater was active
-+ foreach(const IntPairList& list, modelRemovals)
-+ {
-+ int removedRows = 0, offset = 0;
-+
-+ foreach(const IntPair& pair, list)
-+ {
-+ const int begin = pair.first - offset;
-+ const int end = pair.second - offset; // inclusive
-+ removedRows = end - begin + 1;
-+
-+ // when removing from the list, all subsequent indexes are affected
-+ offset += removedRows;
-+
-+ // update idHash - which points to indexes of d->infos, and these change now!
-+ QHash<qlonglong, int>::iterator it;
-+
-+ for (it = oldIds.begin(); it != oldIds.end(); )
-+ {
-+ if (it.value() >= begin)
-+ {
-+ if (it.value() > end)
-+ {
-+ // after the removed interval: adjust index
-+ it.value() -= removedRows;
-+ }
-+ else
-+ {
-+ // in the removed interval
-+ it = oldIds.erase(it);
-+ continue;
-+ }
-+ }
-+
-+ ++it;
-+ }
-+ }
-+ }
-+
-+ modelRemovals.clear();
-+
-+ return toContiguousPairs(oldIds.values());
-+}
-+
-+QList<QPair<int, int> > ImageModelIncrementalUpdater::toContiguousPairs(const QList<int>& unsorted)
-+{
-+ // Take the given indices and return them as contiguous pairs [begin, end]
-+
-+ QList<QPair<int, int> > pairs;
-+
-+ if (unsorted.isEmpty())
-+ {
-+ return pairs;
-+ }
-+
-+ QList<int> indices(unsorted);
-+ qSort(indices);
-+
-+ QPair<int, int> pair(indices.first(), indices.first());
-+
-+ for (int i=1; i<indices.size(); ++i)
-+ {
-+ const int &index = indices.at(i);
-+
-+ if (index == pair.second + 1)
-+ {
-+ pair.second = index;
-+ continue;
-+ }
-+
-+ pairs << pair; // insert last pair
-+ pair.first = index;
-+ pair.second = index;
-+ }
-+
-+ pairs << pair;
-+
-+ return pairs;
-+}
-+
-+// ------------ QAbstractItemModel implementation -------------
-+
-+QVariant ImageModel::data(const QModelIndex& index, int role) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return QVariant();
-+ }
-+
-+ switch (role)
-+ {
-+ case Qt::DisplayRole:
-+ case Qt::ToolTipRole:
-+ return d->infos.at(index.row()).name();
-+
-+ case ImageModelPointerRole:
-+ return QVariant::fromValue(const_cast<ImageModel*>(this));
-+
-+ case ImageModelInternalId:
-+ return index.row();
-+
-+ case CreationDateRole:
-+ return d->infos.at(index.row()).dateTime();
-+
-+ case ExtraDataRole:
-+
-+ if (d->extraValueValid(index))
-+ {
-+ return d->extraValues.at(index.row());
-+ }
-+ else
-+ {
-+ return QVariant();
-+ }
-+
-+ case ExtraDataDuplicateCount:
-+ {
-+ qlonglong id = d->infos.at(index.row()).id();
-+ return numberOfIndexesForImageId(id);
-+ }
-+ }
-+
-+ return QVariant();
-+}
-+
-+QVariant ImageModel::headerData(int section, Qt::Orientation orientation, int role) const
-+{
-+ Q_UNUSED(section)
-+ Q_UNUSED(orientation)
-+ Q_UNUSED(role)
-+ return QVariant();
-+}
-+
-+int ImageModel::rowCount(const QModelIndex& parent) const
-+{
-+ if (parent.isValid())
-+ {
-+ return 0;
-+ }
-+
-+ return d->infos.size();
-+}
-+
-+Qt::ItemFlags ImageModel::flags(const QModelIndex& index) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return 0;
-+ }
-+
-+ Qt::ItemFlags f = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
-+
-+ f |= dragDropFlags(index);
-+
-+ return f;
-+}
-+
-+QModelIndex ImageModel::index(int row, int column, const QModelIndex& parent) const
-+{
-+ if (column != 0 || row < 0 || parent.isValid() || row >= d->infos.size())
-+ {
-+ return QModelIndex();
-+ }
-+
-+ return createIndex(row, 0);
-+}
-+
-+// ------------ Database watch -------------
-+
-+void ImageModel::slotImageChange(const ImageChangeset& changeset)
-+{
-+ if (d->infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ if (d->watchFlags & changeset.changes())
-+ {
-+ QItemSelection items;
-+
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ QModelIndex index = indexForImageId(id);
-+
-+ if (index.isValid())
-+ {
-+ items.select(index, index);
-+ }
-+ }
-+
-+ if (!items.isEmpty())
-+ {
-+ emitDataChangedForSelection(items);
-+ emit imageChange(changeset, items);
-+ }
-+ }
-+}
-+
-+void ImageModel::slotImageTagChange(const ImageTagChangeset& changeset)
-+{
-+ if (d->infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ QItemSelection items;
-+
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ QModelIndex index = indexForImageId(id);
-+
-+ if (index.isValid())
-+ {
-+ items.select(index, index);
-+ }
-+ }
-+
-+ if (!items.isEmpty())
-+ {
-+ emitDataChangedForSelection(items);
-+ emit imageTagChange(changeset, items);
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagemodel.h b/libs/database/models/imagemodel.h
-new file mode 100644
-index 0000000..dcf94c2
---- /dev/null
-+++ b/libs/database/models/imagemodel.h
-@@ -0,0 +1,364 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEMODEL_H
-+#define IMAGEMODEL_H
-+
-+// Qt includes
-+
-+#include <QAbstractListModel>
-+
-+// Local includes
-+
-+#include "dragdropimplementations.h"
-+#include "imageinfo.h"
-+#include "digikam_export.h"
-+
-+class QItemSelection;
-+
-+namespace Digikam
-+{
-+
-+class ImageChangeset;
-+class ImageTagChangeset;
-+
-+namespace DatabaseFields
-+{
-+class Set;
-+}
-+
-+class DIGIKAM_DATABASE_EXPORT ImageModel : public QAbstractListModel, public DragDropModelImplementation
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ enum ImageModelRoles
-+ {
-+ /// An ImageModel* pointer to this model
-+ ImageModelPointerRole = Qt::UserRole,
-+ ImageModelInternalId = Qt::UserRole + 1,
-+ /// Returns a thumbnail pixmap. May be implemented by subclasses.
-+ /// Returns either a valid pixmap or a null QVariant.
-+ ThumbnailRole = Qt::UserRole + 2,
-+ /// Returns a QDateTime with the creation date
-+ CreationDateRole = Qt::UserRole + 3,
-+ /// Return (optional) extraData field
-+ ExtraDataRole = Qt::UserRole + 5,
-+ /// Returns the number of duplicate indexes for the same image id
-+ ExtraDataDuplicateCount = Qt::UserRole + 6,
-+
-+ // Roles which are defined here but not implemented by ImageModel
-+ /// Returns position of item in Left Light Table preview.
-+ LTLeftPanelRole = Qt::UserRole + 50,
-+ /// Returns position of item in Right Light Table preview.
-+ LTRightPanelRole = Qt::UserRole + 51,
-+
-+ // For use by subclasses
-+ SubclassRoles = Qt::UserRole + 100,
-+ // For use by filter models
-+ FilterModelRoles = Qt::UserRole + 500
-+ };
-+
-+public:
-+
-+ explicit ImageModel(QObject* parent = 0);
-+ ~ImageModel();
-+
-+ /** If a cache is kept, lookup by file path is fast,
-+ * without a cache it is O(n). Default is false.
-+ */
-+ void setKeepsFilePathCache(bool keepCache);
-+ bool keepsFilePathCache() const;
-+
-+ /** Set a set of database fields to watch.
-+ * If either of these is changed, dataChanged() will be emitted.
-+ * Default is no flag (no signal will be emitted).
-+ */
-+ void setWatchFlags(const DatabaseFields::Set& set);
-+
-+ /** Returns the ImageInfo object, reference or image id from the underlying data
-+ * pointed to by the index.
-+ * If the index is not valid, imageInfo will return a null ImageInfo, imageId will
-+ * return 0, imageInfoRef must not be called with an invalid index.
-+ */
-+ ImageInfo imageInfo(const QModelIndex& index) const;
-+ ImageInfo& imageInfoRef(const QModelIndex& index) const;
-+ qlonglong imageId(const QModelIndex& index) const;
-+ QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-+ QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
-+
-+ /** Returns the ImageInfo object, reference or image id from the underlying data
-+ * of the given row (parent is the invalid QModelIndex, column is 0).
-+ * Note that imageInfoRef will crash if index is invalid.
-+ */
-+ ImageInfo imageInfo(int row) const;
-+ ImageInfo& imageInfoRef(int row) const;
-+ qlonglong imageId(int row) const;
-+
-+ /** Return the index for the given ImageInfo or id, if contained in this model.
-+ */
-+ QModelIndex indexForImageInfo(const ImageInfo& info) const;
-+ QModelIndex indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const;
-+ QModelIndex indexForImageId(qlonglong id) const;
-+ QModelIndex indexForImageId(qlonglong id, const QVariant& extraValue) const;
-+ QList<QModelIndex> indexesForImageInfo(const ImageInfo& info) const;
-+ QList<QModelIndex> indexesForImageId(qlonglong id) const;
-+
-+ int numberOfIndexesForImageInfo(const ImageInfo& info) const;
-+ int numberOfIndexesForImageId(qlonglong id) const;
-+
-+ /** Returns the index or ImageInfo object from the underlying data
-+ * for the given file path. This is fast if keepsFilePathCache is enabled.
-+ * The file path is as returned by ImageInfo.filePath().
-+ * In case of multiple occurrences of the same file, the simpler variants return
-+ * any one found first, use the QList methods to retrieve all occurrences.
-+ */
-+ QModelIndex indexForPath(const QString& filePath) const;
-+ ImageInfo imageInfo(const QString& filePath) const;
-+ QList<QModelIndex> indexesForPath(const QString& filePath) const;
-+ QList<ImageInfo> imageInfos(const QString& filePath) const;
-+
-+ /** Main entry point for subclasses adding image infos to the model.
-+ * If you list entries not unique per image id, you must add an extraValue
-+ * so that every entry is unique by imageId and extraValues.
-+ * Please note that these methods do not prevent addition of duplicate entries.
-+ */
-+ void addImageInfo(const ImageInfo& info);
-+ void addImageInfos(const QList<ImageInfo>& infos);
-+ void addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /** Clears image infos and resets model.
-+ */
-+ void clearImageInfos();
-+
-+ /** Clears and adds the infos.
-+ */
-+ void setImageInfos(const QList<ImageInfo>& infos);
-+
-+ /**
-+ * Directly remove the given indexes or infos from the model.
-+ */
-+ void removeIndex(const QModelIndex& indexes);
-+ void removeIndexes(const QList<QModelIndex>& indexes);
-+ void removeImageInfo(const ImageInfo& info);
-+ void removeImageInfos(const QList<ImageInfo>& infos);
-+ void removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /**
-+ * addImageInfo() is asynchronous if a prepocessor is set.
-+ * This method first adds the info, synchronously.
-+ * Only afterwards, the preprocessor will have the opportunity to process it.
-+ * This method also bypasses any incremental updates.
-+ * Please note that these methods do not prevent addition of duplicate entries.
-+ */
-+ void addImageInfoSynchronously(const ImageInfo& info);
-+ void addImageInfosSynchronously(const QList<ImageInfo>& infos);
-+ void addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /**
-+ * Add the given entries. Method returns immediately, the
-+ * addition may happen later asynchronously.
-+ * These methods prevent the addition of duplicate entries.
-+ */
-+ void ensureHasImageInfo(const ImageInfo& info);
-+ void ensureHasImageInfos(const QList<ImageInfo>& infos);
-+ void ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /**
-+ * Ensure that all images grouped on the given leader are contained in the model.
-+ */
-+ void ensureHasGroupedImages(const ImageInfo& groupLeader);
-+
-+ QList<ImageInfo> imageInfos() const;
-+ QList<qlonglong> imageIds() const;
-+ QList<ImageInfo> uniqueImageInfos() const;
-+
-+ bool hasImage(qlonglong id) const;
-+ bool hasImage(const ImageInfo& info) const;
-+ bool hasImage(const ImageInfo& info, const QVariant& extraValue) const;
-+ bool hasImage(qlonglong id, const QVariant& extraValue) const;
-+
-+ bool isEmpty() const;
-+
-+ // Drag and Drop
-+ DECLARE_MODEL_DRAG_DROP_METHODS
-+
-+ /**
-+ * Install an object as a preprocessor for ImageInfos added to this model.
-+ * For every QList of ImageInfos added to addImageInfo, the signal preprocess()
-+ * will be emitted. The preprocessor may process the items and shall then readd
-+ * them by calling reAddImageInfos(). It may take some time to process.
-+ * It shall discard any held infos when the modelReset() signal is sent.
-+ * It shall call readdFinished() when no reset occurred and all infos on the way have been readded.
-+ * This means that only after calling this method, you shall make three connections
-+ * (preprocess -> your slot, your signal -> reAddImageInfos, your signal -> reAddingFinished)
-+ * and make or already hold a connection modelReset() -> your slot.
-+ * There is only one preprocessor at a time, a previously set object will be disconnected.
-+ */
-+ void setPreprocessor(QObject* processor);
-+ void unsetPreprocessor(QObject* processor);
-+
-+ /**
-+ * Returns true if this model is currently refreshing.
-+ * For a preprocessor this means that, although the preprocessor may currently have
-+ * processed all it got, more batches are to be expected.
-+ */
-+ bool isRefreshing() const;
-+
-+ /**
-+ * Enable sending of imageInfosAboutToBeRemoved and imageInfosRemoved signals.
-+ * Default: false
-+ */
-+ void setSendRemovalSignals(bool send);
-+
-+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
-+ virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
-+ virtual Qt::ItemFlags flags(const QModelIndex& index) const;
-+ virtual QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const;
-+
-+ /** Retrieves the imageInfo object from the data() method of the given index.
-+ * The index may be from a QSortFilterProxyModel as long as an ImageModel is at the end. */
-+ static ImageInfo retrieveImageInfo(const QModelIndex& index);
-+ static qlonglong retrieveImageId(const QModelIndex& index);
-+
-+Q_SIGNALS:
-+
-+ /** Informs that ImageInfos will be added to the model.
-+ * This signal is sent before the model data is changed and views are informed.
-+ */
-+ void imageInfosAboutToBeAdded(const QList<ImageInfo>& infos);
-+
-+ /** Informs that ImageInfos have been added to the model.
-+ * This signal is sent after the model data is changed and views are informed.
-+ */
-+ void imageInfosAdded(const QList<ImageInfo>& infos);
-+
-+ /** Informs that ImageInfos will be removed from the model.
-+ * This signal is sent before the model data is changed and views are informed.
-+ * Note: You need to explicitly enable sending of this signal. It is not sent
-+ * in clearImageInfos().
-+ */
-+ void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
-+
-+ /** Informs that ImageInfos have been removed from the model.
-+ * This signal is sent after the model data is changed and views are informed. *
-+ * Note: You need to explicitly enable sending of this signal. It is not sent
-+ * in clearImageInfos().
-+ */
-+ void imageInfosRemoved(const QList<ImageInfo>& infos);
-+
-+ /** Connect to this signal only if you are the current preprocessor.
-+ */
-+ void preprocess(const QList<ImageInfo>& infos, const QList<QVariant>&);
-+ void processAdded(const QList<ImageInfo>& infos, const QList<QVariant>&);
-+
-+ /** If an ImageChangeset affected indexes of this model with changes as set in watchFlags(),
-+ * this signal contains the changeset and the affected indexes.
-+ */
-+ void imageChange(const ImageChangeset&, const QItemSelection&);
-+
-+ /** If an ImageTagChangeset affected indexes of this model,
-+ * this signal contains the changeset and the affected indexes.
-+ */
-+ void imageTagChange(const ImageTagChangeset&, const QItemSelection&);
-+
-+ /** Signals that the model is right now ready to start an incremental refresh.
-+ * This is guaranteed only for the scope of emitting this signal.
-+ */
-+ void readyForIncrementalRefresh();
-+
-+ /** Signals that the model has finished currently with all scheduled
-+ * refreshing, full or incremental, and all preprocessing.
-+ * The model is in polished, clean situation right now.
-+ */
-+ void allRefreshingFinished();
-+
-+public Q_SLOTS:
-+
-+ void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void reAddingFinished();
-+
-+protected:
-+
-+ /** Subclasses that add ImageInfos in batches shall call startRefresh()
-+ * when they start sending batches and finishRefresh() when they have finished.
-+ * No incremental refreshes will be started while listing.
-+ * A clearImageInfos() always stops listing, calling finishRefresh() is then not necessary.
-+ */
-+ void startRefresh();
-+ void finishRefresh();
-+
-+ /** As soon as the model is ready to start an incremental refresh, the signal
-+ * readyForIncrementalRefresh() will be emitted. The signal will be emitted inline
-+ * if the model is ready right now.
-+ */
-+ void requestIncrementalRefresh();
-+ bool hasIncrementalRefreshPending() const;
-+
-+ /** Starts an incremental refresh operation. You shall only call this method from a slot
-+ * connected to readyForIncrementalRefresh(). To initiate an incremental refresh,
-+ * call requestIncrementalRefresh().
-+ */
-+ void startIncrementalRefresh();
-+ void finishIncrementalRefresh();
-+
-+ void emitDataChangedForAll();
-+ void emitDataChangedForSelection(const QItemSelection& selection);
-+
-+ // Called when the internal storage is cleared
-+ virtual void imageInfosCleared() {};
-+
-+ // Called before rowsAboutToBeRemoved
-+ virtual void imageInfosAboutToBeRemoved(int /*begin*/, int /*end*/) {};
-+
-+protected Q_SLOTS:
-+
-+ virtual void slotImageChange(const ImageChangeset& changeset);
-+ virtual void slotImageTagChange(const ImageTagChangeset& changeset);
-+
-+private:
-+
-+ void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void cleanSituationChecks();
-+ void removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove);
-+ void removeRowPairs(const QList<QPair<int, int> >& toRemove);
-+
-+public:
-+
-+ // Declared public because it's used in ImageModelIncrementalUpdater class
-+ class Private;
-+
-+private:
-+
-+ Private* const d;
-+};
-+
-+} // namespace Digikam
-+
-+Q_DECLARE_METATYPE(Digikam::ImageModel*)
-+
-+#endif // IMAGEMODEL_H
-diff --git a/libs/database/models/imagesortsettings.cpp b/libs/database/models/imagesortsettings.cpp
-new file mode 100644
-index 0000000..39ee6e1
---- /dev/null
-+++ b/libs/database/models/imagesortsettings.cpp
-@@ -0,0 +1,400 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Filter values for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagesortsettings.h"
-+
-+// Qt includes
-+
-+#include <QDateTime>
-+#include <QRectF>
-+
-+// Local includes
-+
-+#include "coredbfields.h"
-+#include "imageinfo.h"
-+
-+namespace Digikam
-+{
-+
-+ImageSortSettings::ImageSortSettings()
-+{
-+ categorizationMode = NoCategories;
-+ categorizationSortOrder = DefaultOrder;
-+ categorizationCaseSensitivity = Qt::CaseSensitive;
-+ sortRole = SortByFileName;
-+ sortOrder = DefaultOrder;
-+ strTypeNatural = true;
-+ sortCaseSensitivity = Qt::CaseSensitive;
-+ currentCategorizationSortOrder = Qt::AscendingOrder;
-+ currentSortOrder = Qt::AscendingOrder;
-+}
-+
-+bool ImageSortSettings::operator==(const ImageSortSettings& other) const
-+{
-+ return
-+ categorizationMode == other.categorizationMode &&
-+ categorizationSortOrder == other.categorizationSortOrder &&
-+ categorizationCaseSensitivity == other.categorizationCaseSensitivity &&
-+ sortRole == other.sortRole &&
-+ sortOrder == other.sortOrder &&
-+ sortCaseSensitivity == other.sortCaseSensitivity;
-+}
-+
-+void ImageSortSettings::setCategorizationMode(CategorizationMode mode)
-+{
-+ categorizationMode = mode;
-+
-+ if (categorizationSortOrder == DefaultOrder)
-+ {
-+ currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-+ }
-+}
-+
-+void ImageSortSettings::setCategorizationSortOrder(SortOrder order)
-+{
-+ categorizationSortOrder = order;
-+
-+ if (categorizationSortOrder == DefaultOrder)
-+ {
-+ currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-+ }
-+ else
-+ {
-+ currentCategorizationSortOrder = (Qt::SortOrder)categorizationSortOrder;
-+ }
-+}
-+
-+void ImageSortSettings::setSortRole(SortRole role)
-+{
-+ sortRole = role;
-+
-+ if (sortOrder == DefaultOrder)
-+ {
-+ currentSortOrder = defaultSortOrderForSortRole(sortRole);
-+ }
-+}
-+
-+void ImageSortSettings::setSortOrder(SortOrder order)
-+{
-+ sortOrder = order;
-+
-+ if (sortOrder == DefaultOrder)
-+ {
-+ currentSortOrder = defaultSortOrderForSortRole(sortRole);
-+ }
-+ else
-+ {
-+ currentSortOrder = (Qt::SortOrder)order;
-+ }
-+}
-+
-+void ImageSortSettings::setStringTypeNatural(bool natural)
-+{
-+ strTypeNatural = natural;
-+}
-+
-+Qt::SortOrder ImageSortSettings::defaultSortOrderForCategorizationMode(CategorizationMode mode)
-+{
-+ switch (mode)
-+ {
-+ case NoCategories:
-+ case OneCategory:
-+ case CategoryByAlbum:
-+ case CategoryByFormat:
-+ default:
-+ return Qt::AscendingOrder;
-+ }
-+}
-+
-+Qt::SortOrder ImageSortSettings::defaultSortOrderForSortRole(SortRole role)
-+{
-+ switch (role)
-+ {
-+ case SortByFileName:
-+ case SortByFilePath:
-+ return Qt::AscendingOrder;
-+ case SortByFileSize:
-+ return Qt::DescendingOrder;
-+ case SortByModificationDate:
-+ case SortByCreationDate:
-+ return Qt::AscendingOrder;
-+ case SortByRating:
-+ case SortByImageSize:
-+ return Qt::DescendingOrder;
-+ case SortByAspectRatio:
-+ return Qt::DescendingOrder;
-+ case SortBySimilarity:
-+ return Qt::DescendingOrder;
-+ default:
-+ return Qt::AscendingOrder;
-+ }
-+}
-+
-+int ImageSortSettings::compareCategories(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ switch (categorizationMode)
-+ {
-+ case NoCategories:
-+ case OneCategory:
-+ return 0;
-+ case CategoryByAlbum:
-+ {
-+ int leftAlbum = left.albumId();
-+ int rightAlbum = right.albumId();
-+
-+ // return comparation result
-+ if (leftAlbum == rightAlbum)
-+ {
-+ return 0;
-+ }
-+ else if (lessThanByOrder(leftAlbum, rightAlbum, currentCategorizationSortOrder))
-+ {
-+ return -1;
-+ }
-+ else
-+ {
-+ return 1;
-+ }
-+ }
-+ case CategoryByFormat:
-+ {
-+ return naturalCompare(left.format(), right.format(),
-+ currentCategorizationSortOrder, categorizationCaseSensitivity, strTypeNatural);
-+ }
-+ default:
-+ return 0;
-+ }
-+}
-+
-+bool ImageSortSettings::lessThan(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ int result = compare(left, right, sortRole);
-+
-+ if (result != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ // are they identical?
-+ if (left == right)
-+ {
-+ return false;
-+ }
-+
-+ // If left and right equal for first sort order, use a hierarchy of all sort orders
-+ if ( (result = compare(left, right, SortByFileName)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByCreationDate)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByModificationDate)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByFilePath)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByFileSize)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortBySimilarity)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ return false;
-+}
-+
-+int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ return compare(left, right, sortRole);
-+}
-+
-+int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right, SortRole role) const
-+{
-+ switch (role)
-+ {
-+ case SortByFileName:
-+ {
-+ bool versioning = (left.name().contains(QLatin1String("_v"), Qt::CaseInsensitive) ||
-+ right.name().contains(QLatin1String("_v"), Qt::CaseInsensitive));
-+ return naturalCompare(left.name(), right.name(), currentSortOrder, sortCaseSensitivity, strTypeNatural, versioning);
-+ }
-+ case SortByFilePath:
-+ return naturalCompare(left.filePath(), right.filePath(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-+ case SortByFileSize:
-+ return compareByOrder(left.fileSize(), right.fileSize(), currentSortOrder);
-+ case SortByModificationDate:
-+ return compareByOrder(left.modDateTime(), right.modDateTime(), currentSortOrder);
-+ case SortByCreationDate:
-+ return compareByOrder(left.dateTime(), right.dateTime(), currentSortOrder);
-+ case SortByRating:
-+ // I have the feeling that inverting the sort order for rating is the natural order
-+ return - compareByOrder(left.rating(), right.rating(), currentSortOrder);
-+ case SortByImageSize:
-+ {
-+ QSize leftSize = left.dimensions();
-+ QSize rightSize = right.dimensions();
-+ int leftPixels = leftSize.width() * leftSize.height();
-+ int rightPixels = rightSize.width() * rightSize.height();
-+ return compareByOrder(leftPixels, rightPixels, currentSortOrder);
-+ }
-+ case SortByAspectRatio:
-+ {
-+ QSize leftSize = left.dimensions();
-+ QSize rightSize = right.dimensions();
-+ int leftAR = (double(leftSize.width()) / double(leftSize.height())) * 1000000;
-+ int rightAR = (double(rightSize.width()) / double(rightSize.height())) * 1000000;
-+ return compareByOrder(leftAR, rightAR, currentSortOrder);
-+ }
-+ case SortBySimilarity:
-+ {
-+ qlonglong leftReferenceImageId = left.currentReferenceImage();
-+ qlonglong rightReferenceImageId = right.currentReferenceImage();
-+ // make sure that the original image has always the highest similarity.
-+ double leftSimilarity = left.id() == leftReferenceImageId ? 1.1 : left.currentSimilarity();
-+ double rightSimilarity = right.id() == rightReferenceImageId ? 1.1 : right.currentSimilarity();
-+ return compareByOrder(leftSimilarity, rightSimilarity, currentSortOrder);
-+ }
-+ default:
-+ return 1;
-+ }
-+}
-+
-+bool ImageSortSettings::lessThan(const QVariant& left, const QVariant& right) const
-+{
-+ if (left.type() != right.type())
-+ {
-+ return false;
-+ }
-+
-+ switch (left.type())
-+ {
-+ case QVariant::Int:
-+ return compareByOrder(left.toInt(), right.toInt(), currentSortOrder);
-+ case QVariant::UInt:
-+ return compareByOrder(left.toUInt(), right.toUInt(), currentSortOrder);
-+ case QVariant::LongLong:
-+ return compareByOrder(left.toLongLong(), right.toLongLong(), currentSortOrder);
-+ case QVariant::ULongLong:
-+ return compareByOrder(left.toULongLong(), right.toULongLong(), currentSortOrder);
-+ case QVariant::Double:
-+ return compareByOrder(left.toDouble(), right.toDouble(), currentSortOrder);
-+ case QVariant::Date:
-+ return compareByOrder(left.toDate(), right.toDate(), currentSortOrder);
-+ case QVariant::DateTime:
-+ return compareByOrder(left.toDateTime(), right.toDateTime(), currentSortOrder);
-+ case QVariant::Time:
-+ return compareByOrder(left.toTime(), right.toTime(), currentSortOrder);
-+ case QVariant::Rect:
-+ case QVariant::RectF:
-+ {
-+ QRectF rectLeft = left.toRectF();
-+ QRectF rectRight = right.toRectF();
-+ int result;
-+
-+ if ((result = compareByOrder(rectLeft.top(), rectRight.top(), currentSortOrder)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ((result = compareByOrder(rectLeft.left(), rectRight.left(), currentSortOrder)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ QSizeF sizeLeft = rectLeft.size(), sizeRight = rectRight.size();
-+
-+ if ((result = compareByOrder(sizeLeft.width()*sizeLeft.height(), sizeRight.width()*sizeRight.height(), currentSortOrder)) != 0)
-+ {
-+ return result < 0;
-+ }
-+ // FIXME: fall through?? If not, add "break" here
-+ }
-+ default:
-+ return naturalCompare(left.toString(), right.toString(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-+ }
-+}
-+
-+DatabaseFields::Set ImageSortSettings::watchFlags() const
-+{
-+ DatabaseFields::Set set;
-+
-+ switch (sortRole)
-+ {
-+ case SortByFileName:
-+ set |= DatabaseFields::Name;
-+ break;
-+ case SortByFilePath:
-+ set |= DatabaseFields::Name;
-+ break;
-+ case SortByFileSize:
-+ set |= DatabaseFields::FileSize;
-+ break;
-+ case SortByModificationDate:
-+ set |= DatabaseFields::ModificationDate;
-+ break;
-+ case SortByCreationDate:
-+ set |= DatabaseFields::CreationDate;
-+ break;
-+ case SortByRating:
-+ set |= DatabaseFields::Rating;
-+ break;
-+ case SortByImageSize:
-+ set |= DatabaseFields::Width | DatabaseFields::Height;
-+ break;
-+ case SortByAspectRatio:
-+ set |= DatabaseFields::Width | DatabaseFields::Height;
-+ break;
-+ case SortBySimilarity:
-+ // TODO: Not sure what to do here....
-+ set |= DatabaseFields::Name;
-+ break;
-+ }
-+
-+ switch (categorizationMode)
-+ {
-+ case NoCategories:
-+ case OneCategory:
-+ case CategoryByAlbum:
-+ break;
-+ case CategoryByFormat:
-+ set |= DatabaseFields::Format;
-+ break;
-+ }
-+
-+ return set;
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagesortsettings.h b/libs/database/models/imagesortsettings.h
-new file mode 100644
-index 0000000..2a5fd8c
---- /dev/null
-+++ b/libs/database/models/imagesortsettings.h
-@@ -0,0 +1,225 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-05-31
-+ * Description : Sort settings for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGESORTSETTINGS_H
-+#define IMAGESORTSETTINGS_H
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QList>
-+#include <QMap>
-+#include <QString>
-+#include <QCollator>
-+
-+// Local includes
-+
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageInfo;
-+
-+namespace DatabaseFields
-+{
-+ class Set;
-+}
-+
-+class DIGIKAM_DATABASE_EXPORT ImageSortSettings
-+{
-+public:
-+
-+ ImageSortSettings();
-+
-+ bool operator==(const ImageSortSettings& other) const;
-+
-+ /** Compares the categories of left and right.
-+ * Return -1 if left is less than right, 0 if both fall in the same category,
-+ * and 1 if left is greater than right.
-+ * Adheres to set categorization mode and current category sort order.
-+ */
-+ int compareCategories(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Returns true if left is less than right.
-+ * Adheres to current sort role and sort order.
-+ */
-+ bool lessThan(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Compares the ImageInfos left and right.
-+ * Return -1 if left is less than right, 1 if left is greater than right,
-+ * and 0 if left equals right comparing the current sort role's value.
-+ * Adheres to set sort role and sort order.
-+ */
-+ int compare(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Returns true if left QVariant is less than right.
-+ * Adheres to current sort role and sort order.
-+ * Use for extraValue, if necessary.
-+ */
-+ bool lessThan(const QVariant& left, const QVariant& right) const;
-+
-+ enum SortOrder
-+ {
-+ AscendingOrder = Qt::AscendingOrder,
-+ DescendingOrder = Qt::DescendingOrder,
-+ DefaultOrder /// sort order depends on the chosen sort role
-+ };
-+
-+ /// --- Categories ---
-+
-+ enum CategorizationMode
-+ {
-+ NoCategories, /// categorization switched off
-+ OneCategory, /// all items in one global category
-+ CategoryByAlbum,
-+ CategoryByFormat
-+ };
-+
-+ CategorizationMode categorizationMode;
-+ SortOrder categorizationSortOrder;
-+
-+ void setCategorizationMode(CategorizationMode mode);
-+ void setCategorizationSortOrder(SortOrder order);
-+
-+ /// Only Ascending or Descending, never DefaultOrder
-+ Qt::SortOrder currentCategorizationSortOrder;
-+ Qt::CaseSensitivity categorizationCaseSensitivity;
-+
-+ bool isCategorized() const { return categorizationMode >= CategoryByAlbum; }
-+
-+ /// --- Image Sorting ---
-+
-+ enum SortRole
-+ {
-+ // Note: For legacy reasons, the order of the first five entries must remain unchanged
-+ SortByFileName,
-+ SortByFilePath,
-+ SortByCreationDate,
-+ SortByFileSize,
-+ SortByRating,
-+ SortByModificationDate,
-+ SortByImageSize, // pixel number
-+ SortByAspectRatio, // width / height * 100000
-+ SortBySimilarity
-+ };
-+
-+ SortRole sortRole;
-+ SortOrder sortOrder;
-+ bool strTypeNatural;
-+
-+ void setSortRole(SortRole role);
-+ void setSortOrder(SortOrder order);
-+ void setStringTypeNatural(bool natural);
-+
-+ Qt::SortOrder currentSortOrder;
-+ Qt::CaseSensitivity sortCaseSensitivity;
-+
-+ int compare(const ImageInfo& left, const ImageInfo& right, SortRole sortRole) const;
-+
-+ // --- ---
-+
-+ static Qt::SortOrder defaultSortOrderForCategorizationMode(CategorizationMode mode);
-+ static Qt::SortOrder defaultSortOrderForSortRole(SortRole role);
-+
-+ /// --- Change notification ---
-+
-+ /** Returns database fields a change in which would affect the current sorting.
-+ */
-+ DatabaseFields::Set watchFlags() const;
-+
-+ /// --- Utilities ---
-+
-+ /** Returns a < b if sortOrder is Ascending, or b < a if order is descending.
-+ */
-+ template <typename T>
-+ static inline bool lessThanByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-+ {
-+ if (sortOrder == Qt::AscendingOrder)
-+ {
-+ return a < b;
-+ }
-+ else
-+ {
-+ return b < a;
-+ }
-+ }
-+
-+ /** Returns the usual compare result of -1, 0, or 1 for lessThan, equals and greaterThan.
-+ */
-+ template <typename T>
-+ static inline int compareValue(const T& a, const T& b)
-+ {
-+ if (a == b)
-+ {
-+ return 0;
-+ }
-+
-+ if (a < b)
-+ {
-+ return -1;
-+ }
-+ else
-+ {
-+ return 1;
-+ }
-+ }
-+
-+ /** Takes a typical result from a compare method (0 is equal, -1 is less than, 1 is greater than)
-+ * and applies the given sort order to it.
-+ */
-+ static inline int compareByOrder(int compareResult, Qt::SortOrder sortOrder)
-+ {
-+ if (sortOrder == Qt::AscendingOrder)
-+ {
-+ return compareResult;
-+ }
-+ else
-+ {
-+ return - compareResult;
-+ }
-+ }
-+
-+ template <typename T>
-+ static inline int compareByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-+ {
-+ return compareByOrder(compareValue(a, b), sortOrder);
-+ }
-+
-+ /** Compares the two string by natural comparison and adheres to given sort order
-+ */
-+ static inline int naturalCompare(const QString& a, const QString& b, Qt::SortOrder sortOrder,
-+ Qt::CaseSensitivity caseSensitive = Qt::CaseSensitive,
-+ bool natural = true, bool versioning = false)
-+ {
-+ QCollator collator;
-+ collator.setNumericMode(natural);
-+ collator.setIgnorePunctuation(versioning);
-+ collator.setCaseSensitivity(caseSensitive);
-+ return (compareByOrder(collator.compare(a, b), sortOrder));
-+ }
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGESORTSETTINGS_H
-diff --git a/libs/database/models/imagethumbnailmodel.cpp b/libs/database/models/imagethumbnailmodel.cpp
-new file mode 100644
-index 0000000..b7f5661
---- /dev/null
-+++ b/libs/database/models/imagethumbnailmodel.cpp
-@@ -0,0 +1,323 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries with support for thumbnail loading
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagethumbnailmodel.h"
-+
-+// Qt includes
-+
-+#include <QHash>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "thumbnailloadthread.h"
-+#include "digikam_export.h"
-+#include "digikam_globals.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageThumbnailModel::ImageThumbnailModelPriv
-+{
-+public:
-+
-+ ImageThumbnailModelPriv() :
-+ thread(0),
-+ preloadThread(0),
-+ thumbSize(0),
-+ lastGlobalThumbSize(0),
-+ preloadThumbSize(0),
-+ emitDataChanged(true)
-+ {
-+ staticListContainingThumbnailRole << ImageModel::ThumbnailRole;
-+ }
-+
-+ ThumbnailLoadThread* thread;
-+ ThumbnailLoadThread* preloadThread;
-+ ThumbnailSize thumbSize;
-+ ThumbnailSize lastGlobalThumbSize;
-+ ThumbnailSize preloadThumbSize;
-+ QRect detailRect;
-+ QVector<int> staticListContainingThumbnailRole;
-+
-+ bool emitDataChanged;
-+
-+ int preloadThumbnailSize() const
-+ {
-+ if (preloadThumbSize.size())
-+ {
-+ return preloadThumbSize.size();
-+ }
-+
-+ return thumbSize.size();
-+ }
-+};
-+
-+ImageThumbnailModel::ImageThumbnailModel(QObject* parent)
-+ : ImageModel(parent), d(new ImageThumbnailModelPriv)
-+{
-+ setKeepsFilePathCache(true);
-+}
-+
-+ImageThumbnailModel::~ImageThumbnailModel()
-+{
-+ delete d->preloadThread;
-+ delete d;
-+}
-+
-+void ImageThumbnailModel::setThumbnailLoadThread(ThumbnailLoadThread* thread)
-+{
-+ d->thread = thread;
-+
-+ connect(d->thread, SIGNAL(signalThumbnailLoaded(LoadingDescription,QPixmap)),
-+ this, SLOT(slotThumbnailLoaded(LoadingDescription,QPixmap)));
-+}
-+
-+ThumbnailLoadThread* ImageThumbnailModel::thumbnailLoadThread() const
-+{
-+ return d->thread;
-+}
-+
-+ThumbnailSize ImageThumbnailModel::thumbnailSize() const
-+{
-+ return d->thumbSize;
-+}
-+
-+void ImageThumbnailModel::setThumbnailSize(const ThumbnailSize& size)
-+{
-+ d->lastGlobalThumbSize = size;
-+ d->thumbSize = size;
-+}
-+
-+void ImageThumbnailModel::setPreloadThumbnailSize(const ThumbnailSize& size)
-+{
-+ d->preloadThumbSize = size;
-+}
-+
-+void ImageThumbnailModel::setEmitDataChanged(bool emitSignal)
-+{
-+ d->emitDataChanged = emitSignal;
-+}
-+
-+void ImageThumbnailModel::setPreloadThumbnails(bool preload)
-+{
-+ if (preload)
-+ {
-+ if (!d->preloadThread)
-+ {
-+ d->preloadThread = new ThumbnailLoadThread;
-+ d->preloadThread->setPixmapRequested(false);
-+ d->preloadThread->setPriority(QThread::LowestPriority);
-+ }
-+
-+ connect(this, SIGNAL(allRefreshingFinished()),
-+ this, SLOT(preloadAllThumbnails()));
-+ }
-+ else
-+ {
-+ delete d->preloadThread;
-+ d->preloadThread = 0;
-+ disconnect(this, SIGNAL(allRefreshingFinished()),
-+ this, SLOT(preloadAllThumbnails()));
-+ }
-+}
-+
-+void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare)
-+{
-+ prepareThumbnails(indexesToPrepare, d->thumbSize);
-+}
-+
-+void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize)
-+{
-+ if (!d->thread)
-+ {
-+ return;
-+ }
-+
-+ QList<ThumbnailIdentifier> ids;
-+ foreach(const QModelIndex& index, indexesToPrepare)
-+ {
-+ ids << imageInfoRef(index).thumbnailIdentifier();
-+ }
-+ d->thread->findGroup(ids, thumbSize.size());
-+}
-+
-+void ImageThumbnailModel::preloadThumbnails(const QList<ImageInfo>& infos)
-+{
-+ if (!d->preloadThread)
-+ {
-+ return;
-+ }
-+
-+ QList<ThumbnailIdentifier> ids;
-+ foreach(const ImageInfo& info, infos)
-+ {
-+ ids << info.thumbnailIdentifier();
-+ }
-+ d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
-+}
-+
-+void ImageThumbnailModel::preloadThumbnails(const QList<QModelIndex>& indexesToPreload)
-+{
-+ if (!d->preloadThread)
-+ {
-+ return;
-+ }
-+
-+ QList<ThumbnailIdentifier> ids;
-+ foreach(const QModelIndex& index, indexesToPreload)
-+ {
-+ ids << imageInfoRef(index).thumbnailIdentifier();
-+ }
-+ d->preloadThread->stopAllTasks();
-+ d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
-+}
-+
-+void ImageThumbnailModel::preloadAllThumbnails()
-+{
-+ preloadThumbnails(imageInfos());
-+}
-+
-+void ImageThumbnailModel::imageInfosCleared()
-+{
-+ if (d->preloadThread)
-+ {
-+ d->preloadThread->stopAllTasks();
-+ }
-+}
-+
-+QVariant ImageThumbnailModel::data(const QModelIndex& index, int role) const
-+{
-+ if (role == ThumbnailRole && d->thread && index.isValid())
-+ {
-+ QPixmap thumbnail;
-+ ImageInfo info = imageInfo(index);
-+ QString path = info.filePath();
-+
-+ if (info.isNull())
-+ {
-+ return QVariant(QVariant::Pixmap);
-+ }
-+
-+ if (!d->detailRect.isNull())
-+ {
-+ if (d->thread->find(info.thumbnailIdentifier(), d->detailRect, thumbnail, d->thumbSize.size()))
-+ {
-+ return thumbnail;
-+ }
-+ }
-+ else
-+ {
-+ if (d->thread->find(info.thumbnailIdentifier(), thumbnail, d->thumbSize.size()))
-+ {
-+ return thumbnail;
-+ }
-+ }
-+
-+ return QVariant(QVariant::Pixmap);
-+ }
-+
-+ return ImageModel::data(index, role);
-+}
-+
-+bool ImageThumbnailModel::setData(const QModelIndex& index, const QVariant& value, int role)
-+{
-+ if (role == ThumbnailRole)
-+ {
-+ switch (value.type())
-+ {
-+ case QVariant::Invalid:
-+ d->thumbSize = d->lastGlobalThumbSize;
-+ d->detailRect = QRect();
-+ break;
-+
-+ case QVariant::Int:
-+
-+ if (value.isNull())
-+ {
-+ d->thumbSize = d->lastGlobalThumbSize;
-+ }
-+ else
-+ {
-+ d->thumbSize = value.toInt();
-+ }
-+ break;
-+
-+ case QVariant::Rect:
-+
-+ if (value.isNull())
-+ {
-+ d->detailRect = QRect();
-+ }
-+ else
-+ {
-+ d->detailRect = value.toRect();
-+ }
-+ break;
-+
-+ default:
-+ break;
-+ }
-+ }
-+
-+ return ImageModel::setData(index, value, role);
-+}
-+
-+void ImageThumbnailModel::slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb)
-+{
-+ if (thumb.isNull())
-+ {
-+ return;
-+ }
-+
-+ // In case of multiple occurrence, we currently do not know which thumbnail is this. Signal change on all.
-+ QModelIndexList indexes;
-+ ThumbnailIdentifier thumbId = loadingDescription.thumbnailIdentifier();
-+ if (thumbId.filePath.isEmpty())
-+ {
-+ indexes = indexesForImageId(thumbId.id);
-+ }
-+ else
-+ {
-+ indexes = indexesForPath(thumbId.filePath);
-+ }
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ if (thumb.isNull())
-+ {
-+ emit thumbnailFailed(index, loadingDescription.previewParameters.size);
-+ }
-+ else
-+ {
-+ emit thumbnailAvailable(index, loadingDescription.previewParameters.size);
-+
-+ if (d->emitDataChanged)
-+ {
-+ emit dataChanged(index, index, d->staticListContainingThumbnailRole);
-+ }
-+ }
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagethumbnailmodel.h b/libs/database/models/imagethumbnailmodel.h
-new file mode 100644
-index 0000000..366ca65
---- /dev/null
-+++ b/libs/database/models/imagethumbnailmodel.h
-@@ -0,0 +1,140 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries with support for thumbnail loading
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGETHUMBNAILMODEL_H
-+#define IMAGETHUMBNAILMODEL_H
-+
-+// Local includes
-+
-+#include "imagemodel.h"
-+#include "thumbnailsize.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class LoadingDescription;
-+class ThumbnailLoadThread;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageThumbnailModel : public ImageModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ /**
-+ * An ImageModel that supports thumbnail loading.
-+ * You need to set a ThumbnailLoadThread to enable thumbnail loading.
-+ * Adjust the thumbnail size to your needs.
-+ * Note that setKeepsFilePathCache is enabled per default.
-+ */
-+ explicit ImageThumbnailModel(QObject* parent);
-+ ~ImageThumbnailModel();
-+
-+ /** Enable thumbnail loading and set the thread that shall be used.
-+ * The thumbnail size of this thread will be adjusted.
-+ */
-+ void setThumbnailLoadThread(ThumbnailLoadThread* thread);
-+ ThumbnailLoadThread* thumbnailLoadThread() const;
-+
-+ /// Set the thumbnail size to use
-+ void setThumbnailSize(const ThumbnailSize& thumbSize);
-+
-+ /// If you want to fix a size for preloading, do it here.
-+ void setPreloadThumbnailSize(const ThumbnailSize& thumbSize);
-+
-+ void setExifRotate(bool rotate);
-+
-+ /**
-+ * Enable emitting dataChanged() when a thumbnail becomes available.
-+ * The thumbnailAvailable() signal will be emitted in any case.
-+ * Default is true.
-+ */
-+ void setEmitDataChanged(bool emitSignal);
-+
-+ /**
-+ * Enable preloading of thumbnails:
-+ * If preloading is enabled, for every entry in the model a thumbnail generation is started.
-+ * Default: false.
-+ */
-+ void setPreloadThumbnails(bool preload);
-+
-+ ThumbnailSize thumbnailSize() const;
-+
-+ /**
-+ * Handles the ThumbnailRole.
-+ * If the pixmap is available, returns it in the QVariant.
-+ * If it still needs to be loaded, returns a null QVariant and emits
-+ * thumbnailAvailable() as soon as it is available.
-+ */
-+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+
-+ /**
-+ * You can override the current thumbnail size by giving an integer value for ThumbnailRole.
-+ * Set a null QVariant to use the thumbnail size set by setThumbnailSize() again.
-+ * The index given here is ignored for this purpose.
-+ */
-+ virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::DisplayRole);
-+
-+public Q_SLOTS:
-+
-+ /** Prepare the thumbnail loading for the given indexes
-+ */
-+ void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare);
-+ void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize);
-+
-+ /**
-+ * Preload thumbnail for the given infos resp. indexes.
-+ * Note: Use setPreloadThumbnails to automatically preload all entries in the model.
-+ * Note: This only ensures thumbnail generation. It is not guaranteed that pixmaps
-+ * are stored in the cache. For thumbnails that are expect to be drawn immediately,
-+ * include them in prepareThumbnails().
-+ * Note: Stops preloading of previously added thumbnails.
-+ */
-+ void preloadThumbnails(const QList<ImageInfo>&);
-+ void preloadThumbnails(const QList<QModelIndex>&);
-+ void preloadAllThumbnails();
-+
-+Q_SIGNALS:
-+
-+ void thumbnailAvailable(const QModelIndex& index, int requestedSize);
-+ void thumbnailFailed(const QModelIndex& index, int requestedSize);
-+
-+protected:
-+
-+ virtual void imageInfosCleared();
-+
-+protected Q_SLOTS:
-+
-+ void slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb);
-+
-+private:
-+
-+ class ImageThumbnailModelPriv;
-+ ImageThumbnailModelPriv* const d;
-+};
-+
-+} // namespace Digikam
-+
-+#endif /* IMAGETHUMBNAILMODEL_H */
-diff --git a/libs/database/models/imageversionsmodel.cpp b/libs/database/models/imageversionsmodel.cpp
-new file mode 100644
-index 0000000..e6ba582
---- /dev/null
-+++ b/libs/database/models/imageversionsmodel.cpp
-@@ -0,0 +1,183 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-07-13
-+ * Description : Model for image versions
-+ *
-+ * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imageversionsmodel.h"
-+
-+// KDE includes
-+
-+#include <klocalizedstring.h>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "workingwidget.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageVersionsModel::Private
-+{
-+public:
-+
-+ Private()
-+ {
-+ data = 0;
-+ paintTree = false;
-+ }
-+
-+ ///Complete paths with filenames and tree level
-+ QList<QPair<QString, int> >* data;
-+ ///This is for delegate to paint it as selected
-+ QString currentSelectedImage;
-+ ///If true, the delegate will paint items as a tree
-+ ///if false, it will be painted as a list
-+ bool paintTree;
-+};
-+
-+ImageVersionsModel::ImageVersionsModel(QObject* parent)
-+ : QAbstractListModel(parent),
-+ d(new Private)
-+{
-+ d->data = new QList<QPair<QString, int> >;
-+}
-+
-+ImageVersionsModel::~ImageVersionsModel()
-+{
-+ //qDeleteAll(d->data);
-+ delete d;
-+}
-+
-+Qt::ItemFlags ImageVersionsModel::flags(const QModelIndex& index) const
-+{
-+ if (!index.isValid())
-+ {
-+ return 0;
-+ }
-+
-+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
-+}
-+
-+QVariant ImageVersionsModel::data(const QModelIndex& index, int role) const
-+{
-+ if (!index.isValid())
-+ {
-+ return QVariant();
-+ }
-+
-+ if (role == Qt::DisplayRole && !d->data->isEmpty())
-+ {
-+ return d->data->at(index.row()).first;
-+ }
-+ else if (role == Qt::UserRole && !d->data->isEmpty())
-+ {
-+ return d->data->at(index.row()).second;
-+ }
-+ else if (role == Qt::DisplayRole && d->data->isEmpty())
-+ {
-+ //TODO: make this text Italic
-+ return QVariant(QString(i18n("No image selected")));
-+ }
-+
-+ return QVariant();
-+}
-+
-+int ImageVersionsModel::rowCount(const QModelIndex& parent) const
-+{
-+ Q_UNUSED(parent)
-+ return d->data->count();
-+}
-+
-+void ImageVersionsModel::setupModelData(QList<QPair<QString, int> >& data)
-+{
-+ beginResetModel();
-+
-+ d->data->clear();
-+
-+ if (!data.isEmpty())
-+ {
-+ d->data->append(data);
-+ }
-+ else
-+ {
-+ d->data->append(qMakePair(QString(i18n("This is the original image")), 0));
-+ }
-+
-+ endResetModel();
-+}
-+
-+void ImageVersionsModel::clearModelData()
-+{
-+ beginResetModel();
-+
-+ if (!d->data->isEmpty())
-+ {
-+ d->data->clear();
-+ }
-+
-+ endResetModel();
-+}
-+
-+void ImageVersionsModel::slotAnimationStep()
-+{
-+ emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, 1));
-+}
-+
-+QString ImageVersionsModel::currentSelectedImage() const
-+{
-+ return d->currentSelectedImage;
-+}
-+
-+void ImageVersionsModel::setCurrentSelectedImage(const QString& path)
-+{
-+ d->currentSelectedImage = path;
-+}
-+
-+QModelIndex ImageVersionsModel::currentSelectedImageIndex() const
-+{
-+ return index(listIndexOf(d->currentSelectedImage), 0);
-+}
-+
-+bool ImageVersionsModel::paintTree() const
-+{
-+ return d->paintTree;
-+}
-+
-+void ImageVersionsModel::setPaintTree(bool paint)
-+{
-+ d->paintTree = paint;
-+}
-+
-+int ImageVersionsModel::listIndexOf(const QString& item) const
-+{
-+ for (int i = 0; i < d->data->size(); ++i)
-+ {
-+ if (d->data->at(i).first == item)
-+ {
-+ return i;
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imageversionsmodel.h b/libs/database/models/imageversionsmodel.h
-new file mode 100644
-index 0000000..ed08529
---- /dev/null
-+++ b/libs/database/models/imageversionsmodel.h
-@@ -0,0 +1,75 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-07-13
-+ * Description : Model for image versions
-+ *
-+ * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEVERSIONSMODEL_H
-+#define IMAGEVERSIONSMODEL_H
-+
-+// Qt includes
-+
-+#include <QModelIndex>
-+#include <QPixmap>
-+
-+// Local includes
-+
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class DIGIKAM_DATABASE_EXPORT ImageVersionsModel : public QAbstractListModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageVersionsModel(QObject* parent = 0);
-+ ~ImageVersionsModel();
-+
-+ Qt::ItemFlags flags(const QModelIndex& index) const;
-+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+ int rowCount(const QModelIndex& parent = QModelIndex()) const;
-+
-+ void setupModelData(QList<QPair<QString, int> >& data);
-+ void clearModelData();
-+
-+ QString currentSelectedImage() const;
-+ void setCurrentSelectedImage(const QString& path);
-+ QModelIndex currentSelectedImageIndex() const;
-+
-+ bool paintTree() const;
-+ int listIndexOf(const QString& item) const;
-+
-+public Q_SLOTS:
-+
-+ void slotAnimationStep();
-+ void setPaintTree(bool paint);
-+
-+private:
-+
-+ class Private;
-+ Private* const d;
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGEVERSIONSMODEL_H
-diff --git a/libs/models/CMakeLists.txt b/libs/models/CMakeLists.txt
-index cbabfaa..804456b 100644
---- a/libs/models/CMakeLists.txt
-+++ b/libs/models/CMakeLists.txt
-@@ -9,18 +9,6 @@ if (POLICY CMP0063)
- cmake_policy(SET CMP0063 NEW)
- endif (POLICY CMP0063)
-
--set(libdatabasemodels_SRCS
-- imagemodel.cpp
-- imagefiltermodel.cpp
-- imagefiltermodelpriv.cpp
-- imagefiltermodelthreads.cpp
-- imagefiltersettings.cpp
-- imagelistmodel.cpp
-- imagesortsettings.cpp
-- imagethumbnailmodel.cpp
-- imageversionsmodel.cpp
--)
--
- set(libalbummodels_SRCS
- imagealbummodel.cpp
- imagealbumfiltermodel.cpp
-@@ -52,5 +40,4 @@ endif()
- #for digikam core lib
- add_library(digikamgenericmodels_src OBJECT ${libgenericmodels_SRCS})
-
--add_library(digikamdatabasemodels_src OBJECT ${libdatabasemodels_SRCS})
--add_library(digikammodels_src OBJECT ${libalbummodels_SRCS} ${libgenericmodels_SRCS})
-+add_library(digikammodels_src OBJECT ${libalbummodels_SRCS} ${libgenericmodels_SRCS})
-diff --git a/libs/models/imagefiltermodel.cpp b/libs/models/imagefiltermodel.cpp
-deleted file mode 100644
-index 3d57e05..0000000
---- a/libs/models/imagefiltermodel.cpp
-+++ /dev/null
-@@ -1,1116 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltermodel.h"
--#include "imagefiltermodelpriv.h"
--#include "imagefiltermodelthreads.h"
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbaccess.h"
--#include "coredbchangesets.h"
--#include "coredbwatch.h"
--#include "imageinfolist.h"
--#include "imagemodel.h"
--
--namespace Digikam
--{
--
--ImageSortFilterModel::ImageSortFilterModel(QObject* parent)
-- : DCategorizedSortFilterProxyModel(parent), m_chainedModel(0)
--{
--}
--
--void ImageSortFilterModel::setSourceImageModel(ImageModel* source)
--{
-- if (m_chainedModel)
-- {
-- m_chainedModel->setSourceImageModel(source);
-- }
-- else
-- {
-- setDirectSourceImageModel(source);
-- }
--}
--
--void ImageSortFilterModel::setSourceFilterModel(ImageSortFilterModel* source)
--{
-- if (source)
-- {
-- ImageModel* const model = sourceImageModel();
--
-- if (model)
-- {
-- source->setSourceImageModel(model);
-- }
-- }
--
-- m_chainedModel = source;
-- setSourceModel(source);
--}
--
--void ImageSortFilterModel::setDirectSourceImageModel(ImageModel* model)
--{
-- setSourceModel(model);
--}
--
--void ImageSortFilterModel::setSourceModel(QAbstractItemModel* model)
--{
-- // made it protected, only setSourceImageModel is public
-- DCategorizedSortFilterProxyModel::setSourceModel(model);
--}
--
--ImageModel* ImageSortFilterModel::sourceImageModel() const
--{
-- if (m_chainedModel)
-- {
-- return m_chainedModel->sourceImageModel();
-- }
--
-- return static_cast<ImageModel*>(sourceModel());
--}
--
--ImageSortFilterModel* ImageSortFilterModel::sourceFilterModel() const
--{
-- return m_chainedModel;
--}
--
--ImageFilterModel* ImageSortFilterModel::imageFilterModel() const
--{
-- // reimplemented in ImageFilterModel
-- if (m_chainedModel)
-- {
-- return m_chainedModel->imageFilterModel();
-- }
--
-- return 0;
--}
--
--QModelIndex ImageSortFilterModel::mapToSourceImageModel(const QModelIndex& index) const
--{
-- if (m_chainedModel)
-- {
-- return m_chainedModel->mapToSourceImageModel(mapToSource(index));
-- }
--
-- return mapToSource(index);
--}
--
--QModelIndex ImageSortFilterModel::mapFromSourceImageModel(const QModelIndex& albummodel_index) const
--{
-- if (m_chainedModel)
-- {
-- return mapFromSource(m_chainedModel->mapFromSourceImageModel(albummodel_index));
-- }
--
-- return mapFromSource(albummodel_index);
--}
--
--
--QModelIndex ImageSortFilterModel::mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const
--{
-- if (m_chainedModel)
-- {
-- return m_chainedModel->mapToSourceImageModel(sourceModel_index);
-- }
-- return sourceModel_index;
--}
--
--// -------------- Convenience mappers -------------------------------------------------------------------
--
--QList<QModelIndex> ImageSortFilterModel::mapListToSource(const QList<QModelIndex>& indexes) const
--{
-- QList<QModelIndex> sourceIndexes;
-- foreach(const QModelIndex& index, indexes)
-- {
-- sourceIndexes << mapToSourceImageModel(index);
-- }
-- return sourceIndexes;
--}
--
--QList<QModelIndex> ImageSortFilterModel::mapListFromSource(const QList<QModelIndex>& sourceIndexes) const
--{
-- QList<QModelIndex> indexes;
-- foreach(const QModelIndex& index, sourceIndexes)
-- {
-- indexes << mapFromSourceImageModel(index);
-- }
-- return indexes;
--}
--
--ImageInfo ImageSortFilterModel::imageInfo(const QModelIndex& index) const
--{
-- return sourceImageModel()->imageInfo(mapToSourceImageModel(index));
--}
--
--qlonglong ImageSortFilterModel::imageId(const QModelIndex& index) const
--{
-- return sourceImageModel()->imageId(mapToSourceImageModel(index));
--}
--
--QList<ImageInfo> ImageSortFilterModel::imageInfos(const QList<QModelIndex>& indexes) const
--{
-- QList<ImageInfo> infos;
-- ImageModel* const model = sourceImageModel();
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- infos << model->imageInfo(mapToSourceImageModel(index));
-- }
--
-- return infos;
--}
--
--QList<qlonglong> ImageSortFilterModel::imageIds(const QList<QModelIndex>& indexes) const
--{
-- QList<qlonglong> ids;
-- ImageModel* const model = sourceImageModel();
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- ids << model->imageId(mapToSourceImageModel(index));
-- }
--
-- return ids;
--}
--
--QModelIndex ImageSortFilterModel::indexForPath(const QString& filePath) const
--{
-- return mapFromSourceImageModel(sourceImageModel()->indexForPath(filePath));
--}
--
--QModelIndex ImageSortFilterModel::indexForImageInfo(const ImageInfo& info) const
--{
-- return mapFromSourceImageModel(sourceImageModel()->indexForImageInfo(info));
--}
--
--QModelIndex ImageSortFilterModel::indexForImageId(qlonglong id) const
--{
-- return mapFromSourceImageModel(sourceImageModel()->indexForImageId(id));
--}
--
--QList<ImageInfo> ImageSortFilterModel::imageInfosSorted() const
--{
-- QList<ImageInfo> infos;
-- const int size = rowCount();
-- ImageModel* const model = sourceImageModel();
--
-- for (int i=0; i<size; ++i)
-- {
-- infos << model->imageInfo(mapToSourceImageModel(index(i, 0)));
-- }
--
-- return infos;
--}
--
--// --------------------------------------------------------------------------------------------
--
--ImageFilterModel::ImageFilterModel(QObject* parent)
-- : ImageSortFilterModel(parent),
-- d_ptr(new ImageFilterModelPrivate)
--{
-- d_ptr->init(this);
--}
--
--ImageFilterModel::ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent)
-- : ImageSortFilterModel(parent),
-- d_ptr(&dd)
--{
-- d_ptr->init(this);
--}
--
--ImageFilterModel::~ImageFilterModel()
--{
-- Q_D(ImageFilterModel);
-- delete d;
--}
--
--void ImageFilterModel::setDirectSourceImageModel(ImageModel* sourceModel)
--{
-- Q_D(ImageFilterModel);
--
-- if (d->imageModel)
-- {
-- d->imageModel->unsetPreprocessor(d);
-- disconnect(d->imageModel, SIGNAL(modelReset()),
-- this, SLOT(slotModelReset()));
-- slotModelReset();
-- }
--
-- d->imageModel = sourceModel;
--
-- if (d->imageModel)
-- {
-- d->imageModel->setPreprocessor(d);
--
-- connect(d->imageModel, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)),
-- d, SLOT(preprocessInfos(QList<ImageInfo>,QList<QVariant>)));
--
-- connect(d->imageModel, SIGNAL(processAdded(QList<ImageInfo>,QList<QVariant>)),
-- d, SLOT(processAddedInfos(QList<ImageInfo>,QList<QVariant>)));
--
-- connect(d, SIGNAL(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)),
-- d->imageModel, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
--
-- connect(d, SIGNAL(reAddingFinished()),
-- d->imageModel, SLOT(reAddingFinished()));
--
-- connect(d->imageModel, SIGNAL(modelReset()),
-- this, SLOT(slotModelReset()));
--
-- connect(d->imageModel, SIGNAL(imageChange(ImageChangeset,QItemSelection)),
-- this, SLOT(slotImageChange(ImageChangeset)));
--
-- connect(d->imageModel, SIGNAL(imageTagChange(ImageTagChangeset,QItemSelection)),
-- this, SLOT(slotImageTagChange(ImageTagChangeset)));
-- }
--
-- setSourceModel(d->imageModel);
--}
--
--QVariant ImageFilterModel::data(const QModelIndex& index, int role) const
--{
-- Q_D(const ImageFilterModel);
--
-- if (!index.isValid())
-- {
-- return QVariant();
-- }
--
-- switch (role)
-- {
-- // Attention: This breaks should there ever be another filter model between this and the ImageModel
--
-- case DCategorizedSortFilterProxyModel::CategoryDisplayRole:
-- return categoryIdentifier(d->imageModel->imageInfoRef(mapToSource(index)));
-- case CategorizationModeRole:
-- return d->sorter.categorizationMode;
-- case SortOrderRole:
-- return d->sorter.sortRole;
-- //case CategoryCountRole:
-- // return categoryCount(d->imageModel->imageInfoRef(mapToSource(index)));
-- case CategoryAlbumIdRole:
-- return d->imageModel->imageInfoRef(mapToSource(index)).albumId();
-- case CategoryFormatRole:
-- return d->imageModel->imageInfoRef(mapToSource(index)).format();
-- case GroupIsOpenRole:
-- return d->groupFilter.isAllOpen() ||
-- d->groupFilter.isOpen(d->imageModel->imageInfoRef(mapToSource(index)).id());
-- case ImageFilterModelPointerRole:
-- return QVariant::fromValue(const_cast<ImageFilterModel*>(this));
-- }
--
-- return DCategorizedSortFilterProxyModel::data(index, role);
--}
--
--ImageFilterModel* ImageFilterModel::imageFilterModel() const
--{
-- return const_cast<ImageFilterModel*>(this);
--}
--
--DatabaseFields::Set ImageFilterModel::suggestedWatchFlags() const
--{
-- DatabaseFields::Set watchFlags;
-- watchFlags |= DatabaseFields::Name | DatabaseFields::FileSize | DatabaseFields::ModificationDate;
-- watchFlags |= DatabaseFields::Rating | DatabaseFields::CreationDate | DatabaseFields::Orientation |
-- DatabaseFields::Width | DatabaseFields::Height;
-- watchFlags |= DatabaseFields::Comment;
-- watchFlags |= DatabaseFields::ImageRelations;
-- return watchFlags;
--}
--
--// -------------- Filter settings --------------
--
--void ImageFilterModel::setDayFilter(const QList<QDateTime>& days)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setDayFilter(days);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-- ImageFilterSettings::MatchingCondition matchingCond,
-- bool showUnTagged, const QList<int>& clTagIds, const QList<int>& plTagIds)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setTagFilter(includedTags, excludedTags, matchingCond, showUnTagged, clTagIds, plTagIds);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setRatingFilter(rating, ratingCond, isUnratedExcluded);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setUrlWhitelist(const QList<QUrl> urlList, const QString& id)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setUrlWhitelist(urlList, id);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setIdWhitelist(idList, id);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setMimeTypeFilter(int mimeTypeFilter)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setMimeTypeFilter(mimeTypeFilter);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setGeolocationFilter(condition);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setTextFilter(const SearchTextFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setTextFilter(settings);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setImageFilterSettings(const ImageFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
--
-- {
-- QMutexLocker lock(&d->mutex);
-- d->version++;
-- d->filter = settings;
-- d->filterCopy = settings;
-- d->versionFilterCopy = d->versionFilter;
-- d->groupFilterCopy = d->groupFilter;
--
-- d->needPrepareComments = settings.isFilteringByText();
-- d->needPrepareTags = settings.isFilteringByTags();
-- d->needPrepareGroups = true;
-- d->needPrepare = d->needPrepareComments || d->needPrepareTags || d->needPrepareGroups;
--
-- d->hasOneMatch = false;
-- d->hasOneMatchForText = false;
-- }
--
-- d->filterResults.clear();
--
-- //d->categoryCountHashInt.clear();
-- //d->categoryCountHashString.clear();
-- if (d->imageModel)
-- {
-- d->infosToProcess(d->imageModel->imageInfos());
-- }
--
-- emit filterSettingsChanged(settings);
--}
--
--void ImageFilterModel::setVersionManagerSettings(const VersionManagerSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->versionFilter.setVersionManagerSettings(settings);
-- setVersionImageFilterSettings(d->versionFilter);
--}
--
--void ImageFilterModel::setExceptionList(const QList<qlonglong>& idList, const QString& id)
--{
-- Q_D(ImageFilterModel);
-- d->versionFilter.setExceptionList(idList, id);
-- setVersionImageFilterSettings(d->versionFilter);
--}
--
--void ImageFilterModel::setVersionImageFilterSettings(const VersionImageFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->versionFilter = settings;
-- slotUpdateFilter();
--}
--
--bool ImageFilterModel::isGroupOpen(qlonglong group) const
--{
-- Q_D(const ImageFilterModel);
-- return d->groupFilter.isOpen(group);
--}
--
--bool ImageFilterModel::isAllGroupsOpen() const
--{
-- Q_D(const ImageFilterModel);
-- return d->groupFilter.isAllOpen();
--}
--
--void ImageFilterModel::setGroupOpen(qlonglong group, bool open)
--{
-- Q_D(ImageFilterModel);
-- d->groupFilter.setOpen(group, open);
-- setGroupImageFilterSettings(d->groupFilter);
--}
--
--void ImageFilterModel::toggleGroupOpen(qlonglong group)
--{
-- setGroupOpen(group, !isGroupOpen(group));
--}
--
--void ImageFilterModel::setAllGroupsOpen(bool open)
--{
-- Q_D(ImageFilterModel);
-- d->groupFilter.setAllOpen(open);
-- setGroupImageFilterSettings(d->groupFilter);
--}
--
--void ImageFilterModel::setGroupImageFilterSettings(const GroupImageFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->groupFilter = settings;
-- slotUpdateFilter();
--}
--
--void ImageFilterModel::slotUpdateFilter()
--{
-- Q_D(ImageFilterModel);
-- setImageFilterSettings(d->filter);
--}
--
--ImageFilterSettings ImageFilterModel::imageFilterSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->filter;
--}
--
--ImageSortSettings ImageFilterModel::imageSortSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->sorter;
--}
--
--VersionImageFilterSettings ImageFilterModel::versionImageFilterSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->versionFilter;
--}
--
--GroupImageFilterSettings ImageFilterModel::groupImageFilterSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->groupFilter;
--}
--
--void ImageFilterModel::slotModelReset()
--{
-- Q_D(ImageFilterModel);
-- {
-- QMutexLocker lock(&d->mutex);
-- // discard all packages on the way that are marked as send out for re-add
-- d->lastDiscardVersion = d->version;
-- d->sentOutForReAdd = 0;
-- // discard all packages on the way
-- d->version++;
-- d->sentOut = 0;
--
-- d->hasOneMatch = false;
-- d->hasOneMatchForText = false;
-- }
-- d->filterResults.clear();
--}
--
--bool ImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
--{
-- Q_D(const ImageFilterModel);
--
-- if (source_parent.isValid())
-- {
-- return false;
-- }
--
-- qlonglong id = d->imageModel->imageId(source_row);
-- QHash<qlonglong, bool>::const_iterator it = d->filterResults.constFind(id);
--
-- if (it != d->filterResults.constEnd())
-- {
-- return it.value();
-- }
--
-- // usually done in thread and cache, unless source model changed
-- ImageInfo info = d->imageModel->imageInfo(source_row);
-- bool match = d->filter.matches(info);
-- match = match ? d->versionFilter.matches(info) : false;
--
-- return match ? d->groupFilter.matches(info) : false;
--}
--
--void ImageFilterModel::setSendImageInfoSignals(bool sendSignals)
--{
-- if (sendSignals)
-- {
-- connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-- this, SLOT(slotRowsInserted(QModelIndex,int,int)));
--
-- connect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-- this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-- }
-- else
-- {
-- disconnect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-- this, SLOT(slotRowsInserted(QModelIndex,int,int)));
--
-- disconnect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-- this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-- }
--}
--
--void ImageFilterModel::slotRowsInserted(const QModelIndex& /*parent*/, int start, int end)
--{
-- QList<ImageInfo> infos;
--
-- for (int i=start; i<=end; ++i)
-- {
-- infos << imageInfo(index(i, 0));
-- }
--
-- emit imageInfosAdded(infos);
--}
--
--void ImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& /*parent*/, int start, int end)
--{
-- QList<ImageInfo> infos;
--
-- for (int i=start; i<=end; ++i)
-- {
-- infos << imageInfo(index(i, 0));
-- }
--
-- emit imageInfosAboutToBeRemoved(infos);
--}
--
--// -------------- Threaded preparation & filtering --------------
--
--void ImageFilterModel::addPrepareHook(ImageFilterModelPrepareHook* hook)
--{
-- Q_D(ImageFilterModel);
-- QMutexLocker lock(&d->mutex);
-- d->prepareHooks << hook;
--}
--
--void ImageFilterModel::removePrepareHook(ImageFilterModelPrepareHook* hook)
--{
-- Q_D(ImageFilterModel);
-- QMutexLocker lock(&d->mutex);
-- d->prepareHooks.removeAll(hook);
--}
--
--void ImageFilterModelPreparer::process(ImageFilterModelTodoPackage package)
--{
-- if (!checkVersion(package))
-- {
-- emit discarded(package);
-- return;
-- }
--
-- // get thread-local copy
-- bool needPrepareTags, needPrepareComments, needPrepareGroups;
-- QList<ImageFilterModelPrepareHook*> prepareHooks;
-- {
-- QMutexLocker lock(&d->mutex);
-- needPrepareTags = d->needPrepareTags;
-- needPrepareComments = d->needPrepareComments;
-- needPrepareGroups = d->needPrepareGroups;
-- prepareHooks = d->prepareHooks;
-- }
--
-- //TODO: Make efficient!!
-- if (needPrepareComments)
-- {
-- foreach(const ImageInfo& info, package.infos)
-- {
-- info.comment();
-- }
-- }
--
-- if (!checkVersion(package))
-- {
-- emit discarded(package);
-- return;
-- }
--
-- // The downside of QVector: At some point, we may need a QList for an API.
-- // Nonetheless, QList and ImageInfo is fast. We could as well
-- // reimplement ImageInfoList to ImageInfoVector (internally with templates?)
-- ImageInfoList infoList;
--
-- if (needPrepareTags || needPrepareGroups)
-- {
-- infoList = package.infos.toList();
-- }
--
-- if (needPrepareTags)
-- {
-- infoList.loadTagIds();
-- }
--
-- if (needPrepareGroups)
-- {
-- infoList.loadGroupImageIds();
-- }
--
-- foreach(ImageFilterModelPrepareHook* hook, prepareHooks)
-- {
-- hook->prepare(package.infos);
-- }
--
-- emit processed(package);
--}
--
--void ImageFilterModelFilterer::process(ImageFilterModelTodoPackage package)
--{
-- if (!checkVersion(package))
-- {
-- emit discarded(package);
-- return;
-- }
--
-- // get thread-local copy
-- ImageFilterSettings localFilter;
-- VersionImageFilterSettings localVersionFilter;
-- GroupImageFilterSettings localGroupFilter;
-- bool hasOneMatch;
-- bool hasOneMatchForText;
-- {
-- QMutexLocker lock(&d->mutex);
-- localFilter = d->filterCopy;
-- localVersionFilter = d->versionFilterCopy;
-- localGroupFilter = d->groupFilterCopy;
-- hasOneMatch = d->hasOneMatch;
-- hasOneMatchForText = d->hasOneMatchForText;
-- }
--
-- // Actual filtering. The variants to spare checking hasOneMatch over and over again.
-- if (hasOneMatch && hasOneMatchForText)
-- {
-- foreach(const ImageInfo& info, package.infos)
-- {
-- package.filterResults[info.id()] = localFilter.matches(info) &&
-- localVersionFilter.matches(info) &&
-- localGroupFilter.matches(info);
-- }
-- }
-- else if (hasOneMatch)
-- {
-- bool matchForText;
--
-- foreach(const ImageInfo& info, package.infos)
-- {
-- package.filterResults[info.id()] = localFilter.matches(info, &matchForText) &&
-- localVersionFilter.matches(info) &&
-- localGroupFilter.matches(info);
--
-- if (matchForText)
-- {
-- hasOneMatchForText = true;
-- }
-- }
-- }
-- else
-- {
-- bool result, matchForText;
--
-- foreach(const ImageInfo& info, package.infos)
-- {
-- result = localFilter.matches(info, &matchForText) &&
-- localVersionFilter.matches(info) &&
-- localGroupFilter.matches(info);
-- package.filterResults[info.id()] = result;
--
-- if (result)
-- {
-- hasOneMatch = true;
-- }
--
-- if (matchForText)
-- {
-- hasOneMatchForText = true;
-- }
-- }
-- }
--
-- if (checkVersion(package))
-- {
-- QMutexLocker lock(&d->mutex);
-- d->hasOneMatch = hasOneMatch;
-- d->hasOneMatchForText = hasOneMatchForText;
-- }
--
-- emit processed(package);
--}
--
--// -------------- Sorting and Categorization -------------------------------------------------------
--
--void ImageFilterModel::setImageSortSettings(const ImageSortSettings& sorter)
--{
-- Q_D(ImageFilterModel);
-- d->sorter = sorter;
-- setCategorizedModel(d->sorter.categorizationMode != ImageSortSettings::NoCategories);
-- invalidate();
--}
--
--void ImageFilterModel::setCategorizationMode(ImageSortSettings::CategorizationMode mode)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setCategorizationMode(mode);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setCategorizationSortOrder(ImageSortSettings::SortOrder order)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setCategorizationSortOrder(order);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setSortRole(ImageSortSettings::SortRole role)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setSortRole(role);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setSortOrder(ImageSortSettings::SortOrder order)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setSortOrder(order);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setStringTypeNatural(bool natural)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setStringTypeNatural(natural);
-- setImageSortSettings(d->sorter);
--}
--
--int ImageFilterModel::compareCategories(const QModelIndex& left, const QModelIndex& right) const
--{
-- // source indexes
-- Q_D(const ImageFilterModel);
--
-- if (!d->sorter.isCategorized())
-- {
-- return 0;
-- }
--
-- if (!left.isValid() || !right.isValid())
-- {
-- return -1;
-- }
--
-- const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-- const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
--
-- // Check grouping
-- qlonglong leftGroupImageId = leftInfo.groupImageId();
-- qlonglong rightGroupImageId = rightInfo.groupImageId();
--
-- return compareInfosCategories(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-- rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
--}
--
--bool ImageFilterModel::subSortLessThan(const QModelIndex& left, const QModelIndex& right) const
--{
-- // source indexes
-- Q_D(const ImageFilterModel);
--
-- if (!left.isValid() || !right.isValid())
-- {
-- return true;
-- }
--
-- if (left == right)
-- {
-- return false;
-- }
--
-- const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-- const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
--
-- if (leftInfo == rightInfo)
-- {
-- return d->sorter.lessThan(left.data(ImageModel::ExtraDataRole), right.data(ImageModel::ExtraDataRole));
-- }
--
-- // Check grouping
-- qlonglong leftGroupImageId = leftInfo.groupImageId();
-- qlonglong rightGroupImageId = rightInfo.groupImageId();
--
-- // Either no grouping (-1), or same group image, or same image
-- if (leftGroupImageId == rightGroupImageId)
-- {
-- return infosLessThan(leftInfo, rightInfo);
-- }
--
-- // We have grouping to handle
--
-- // Is one grouped on the other? Sort behind leader.
-- if (leftGroupImageId == rightInfo.id())
-- {
-- return false;
-- }
-- if (rightGroupImageId == leftInfo.id())
-- {
-- return true;
-- }
--
-- // Use the group leader for sorting
-- return infosLessThan(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-- rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
--}
--
--int ImageFilterModel::compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const
--{
-- // Note: reimplemented in ImageAlbumFilterModel
-- Q_D(const ImageFilterModel);
-- return d->sorter.compareCategories(left, right);
--}
--
--// Feel free to optimize. QString::number is 3x slower.
--static inline QString fastNumberToString(int id)
--{
-- const int size = sizeof(int) * 2;
-- char c[size+1];
-- c[size] = '\0';
-- char* p = c;
-- int number = id;
--
-- for (int i=0; i<size; ++i)
-- {
-- *p = 'a' + (number & 0xF);
-- number >>= 4;
-- ++p;
-- }
--
-- return QString::fromLatin1(c);
--}
--
--QString ImageFilterModel::categoryIdentifier(const ImageInfo& i) const
--{
-- Q_D(const ImageFilterModel);
--
-- if (!d->sorter.isCategorized())
-- {
-- return QString();
-- }
--
-- qlonglong groupedImageId = i.groupImageId();
-- ImageInfo info = groupedImageId == -1 ? i : ImageInfo(groupedImageId);
--
-- switch (d->sorter.categorizationMode)
-- {
-- case ImageSortSettings::NoCategories:
-- return QString();
-- case ImageSortSettings::OneCategory:
-- return QString();
-- case ImageSortSettings::CategoryByAlbum:
-- return fastNumberToString(info.albumId());
-- case ImageSortSettings::CategoryByFormat:
-- return info.format();
-- default:
-- return QString();
-- }
--}
--
--bool ImageFilterModel::infosLessThan(const ImageInfo& left, const ImageInfo& right) const
--{
-- Q_D(const ImageFilterModel);
-- return d->sorter.lessThan(left, right);
--}
--
--// -------------- Watching changes -----------------------------------------------------------------
--
--void ImageFilterModel::slotImageTagChange(const ImageTagChangeset& changeset)
--{
-- Q_D(ImageFilterModel);
--
-- if (!d->imageModel || d->imageModel->isEmpty())
-- {
-- return;
-- }
--
-- // already scheduled to re-filter?
-- if (d->updateFilterTimer->isActive())
-- {
-- return;
-- }
--
-- // do we filter at all?
-- if (!d->versionFilter.isFilteringByTags() &&
-- !d->filter.isFilteringByTags() &&
-- !d->filter.isFilteringByText())
-- {
-- return;
-- }
--
-- // is one of our images affected?
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- // if one matching image id is found, trigger a refresh
-- if (d->imageModel->hasImage(id))
-- {
-- d->updateFilterTimer->start();
-- return;
-- }
-- }
--}
--
--void ImageFilterModel::slotImageChange(const ImageChangeset& changeset)
--{
-- Q_D(ImageFilterModel);
--
-- if (!d->imageModel || d->imageModel->isEmpty())
-- {
-- return;
-- }
--
-- // already scheduled to re-filter?
-- if (d->updateFilterTimer->isActive())
-- {
-- return;
-- }
--
-- // is one of the values affected that we filter or sort by?
-- DatabaseFields::Set set = changeset.changes();
-- bool sortAffected = (set & d->sorter.watchFlags());
-- bool filterAffected = (set & d->filter.watchFlags()) || (set & d->groupFilter.watchFlags());
--
-- if (!sortAffected && !filterAffected)
-- {
-- return;
-- }
--
-- // is one of our images affected?
-- bool imageAffected = false;
--
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- // if one matching image id is found, trigger a refresh
-- if (d->imageModel->hasImage(id))
-- {
-- imageAffected = true;
-- break;
-- }
-- }
--
-- if (!imageAffected)
-- {
-- return;
-- }
--
-- if (filterAffected)
-- {
-- d->updateFilterTimer->start();
-- }
-- else
-- {
-- invalidate(); // just resort, reuse filter results
-- }
--}
--
--// -------------------------------------------------------------------------------------------------------
--
--NoDuplicatesImageFilterModel::NoDuplicatesImageFilterModel(QObject* parent)
-- : ImageSortFilterModel(parent)
--{
--}
--
--bool NoDuplicatesImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
--{
-- QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
--
-- if (index.data(ImageModel::ExtraDataDuplicateCount).toInt() <= 1)
-- {
-- return true;
-- }
--
-- QModelIndex previousIndex = sourceModel()->index(source_row - 1, 0, source_parent);
--
-- if (!previousIndex.isValid())
-- {
-- return true;
-- }
--
-- if (sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(index)) == sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(previousIndex)))
-- {
-- return false;
-- }
-- return true;
--}
--
--/*
--void NoDuplicatesImageFilterModel::setSourceModel(QAbstractItemModel* model)
--{
-- if (sourceModel())
-- {
-- }
--
-- ImageSortFilterModel::setSourceModel(model);
--
-- if (sourceModel())
-- {
-- connect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-- this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-- }
--}
--
--void NoDuplicatesImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& parent, int begin, int end)
--{
-- bool needInvalidate = false;
--
-- for (int i = begin; i<=end; ++i)
-- {
-- QModelIndex index = sourceModel()->index(i, 0, parent);
--
-- // filtered out by us?
-- if (!mapFromSource(index).isValid())
-- {
-- continue;
-- }
--
-- QModelIndex sourceIndex = mapFromDirectSourceToSourceImageModel(index);
-- qlonglong id = sourceImageModel()->imageId(sourceIndex);
--
-- if (sourceImageModel()->numberOfIndexesForImageId(id) > 1)
-- {
-- needInvalidate = true;
-- }
-- }
--}*/
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltermodel.h b/libs/models/imagefiltermodel.h
-deleted file mode 100644
-index d131b3e..0000000
---- a/libs/models/imagefiltermodel.h
-+++ /dev/null
-@@ -1,299 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERMODEL_H
--#define IMAGEFILTERMODEL_H
--
--// Local includes
--
--#include "dcategorizedsortfilterproxymodel.h"
--#include "textfilter.h"
--#include "imagefiltersettings.h"
--#include "imagemodel.h"
--#include "imagesortsettings.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageChangeset;
--class ImageFilterModel;
--class ImageTagChangeset;
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelPrepareHook
--{
--public:
--
-- virtual ~ImageFilterModelPrepareHook() {};
-- virtual void prepare(const QVector<ImageInfo>& infos) = 0;
--};
--
--// -----------------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageSortFilterModel : public DCategorizedSortFilterProxyModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageSortFilterModel(QObject* parent = 0);
--
-- void setSourceImageModel(ImageModel* model);
-- ImageModel* sourceImageModel() const;
--
-- void setSourceFilterModel(ImageSortFilterModel* model);
-- ImageSortFilterModel* sourceFilterModel() const;
--
-- QModelIndex mapToSourceImageModel(const QModelIndex& index) const;
-- QModelIndex mapFromSourceImageModel(const QModelIndex& imagemodel_index) const;
-- QModelIndex mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const;
--
-- /// Convenience methods mapped to ImageModel.
-- /// Mentioned indexes returned come from the source image model.
-- QList<QModelIndex> mapListToSource(const QList<QModelIndex>& indexes) const;
-- QList<QModelIndex> mapListFromSource(const QList<QModelIndex>& sourceIndexes) const;
--
-- ImageInfo imageInfo(const QModelIndex& index) const;
-- qlonglong imageId(const QModelIndex& index) const;
-- QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-- QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
--
-- QModelIndex indexForPath(const QString& filePath) const;
-- QModelIndex indexForImageInfo(const ImageInfo& info) const;
-- QModelIndex indexForImageId(qlonglong id) const;
--
-- /** Returns a list of all image infos, sorted according to this model.
-- * If you do not need a sorted list, use ImageModel's imageInfos() method.
-- */
-- QList<ImageInfo> imageInfosSorted() const;
--
-- /// Returns this, any chained ImageFilterModel, or 0.
-- virtual ImageFilterModel* imageFilterModel() const;
--
--protected:
--
-- /// Reimplement if needed. Called only when model shall be set as (direct) sourceModel.
-- virtual void setDirectSourceImageModel(ImageModel* model);
--
-- // made protected
-- virtual void setSourceModel(QAbstractItemModel* model);
--
--protected:
--
-- ImageSortFilterModel* m_chainedModel;
--};
--
--// -----------------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModel : public ImageSortFilterModel
--{
-- Q_OBJECT
--
--public:
--
-- enum ImageFilterModelRoles
-- {
-- /// Returns the current categorization mode
-- CategorizationModeRole = ImageModel::FilterModelRoles + 1,
-- /// Returns the current sort order
-- SortOrderRole = ImageModel::FilterModelRoles + 2,
-- // / Returns the number of items in the index' category
-- //CategoryCountRole = ImageModel::FilterModelRoles + 3,
-- /// Returns the id of the PAlbum of the index which is used for category
-- CategoryAlbumIdRole = ImageModel::FilterModelRoles + 3,
-- /// Returns the format of the index which is used for category
-- CategoryFormatRole = ImageModel::FilterModelRoles + 4,
-- /// Returns true if the given image is a group leader, and the group is opened
-- GroupIsOpenRole = ImageModel::FilterModelRoles + 5,
-- ImageFilterModelPointerRole = ImageModel::FilterModelRoles + 50
-- };
--
--public:
--
-- explicit ImageFilterModel(QObject* parent = 0);
-- ~ImageFilterModel();
--
-- /** Add a hook to get added images for preparation tasks before they are added in the model */
-- void addPrepareHook(ImageFilterModelPrepareHook* hook);
-- void removePrepareHook(ImageFilterModelPrepareHook* hook);
--
-- /** Returns a set of DatabaseFields suggested to set as watch flags on the source ImageModel.
-- * The contained flags will be those that this model can sort or filter by. */
-- DatabaseFields::Set suggestedWatchFlags() const;
--
-- ImageFilterSettings imageFilterSettings() const;
-- VersionImageFilterSettings versionImageFilterSettings() const;
-- GroupImageFilterSettings groupImageFilterSettings() const;
-- ImageSortSettings imageSortSettings() const;
--
-- // group is identified by the id of its group leader
-- bool isGroupOpen(qlonglong group) const;
-- bool isAllGroupsOpen() const;
--
-- /// Enables sending imageInfosAdded and imageInfosAboutToBeRemoved
-- void setSendImageInfoSignals(bool sendSignals);
--
-- virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-- virtual ImageFilterModel* imageFilterModel() const;
--
--public Q_SLOTS:
--
-- /** Changes the current version image filter settings and refilters. */
-- void setVersionImageFilterSettings(const VersionImageFilterSettings& settings);
--
-- /** Changes the current version image filter settings and refilters. */
-- void setGroupImageFilterSettings(const GroupImageFilterSettings& settings);
--
-- /** Adjust the current ImageFilterSettings.
-- * Equivalent to retrieving the current filter settings, adjusting the parameter
-- * and calling setImageFilterSettings.
-- * Provided for convenience.
-- * It is encouraged to use setImageFilterSettings if you change more than one
-- * parameter at a time.
-- */
-- void setDayFilter(const QList<QDateTime>& days);
-- void setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-- ImageFilterSettings::MatchingCondition matchingCond, bool showUnTagged,
-- const QList<int>& clTagIds, const QList<int>& plTagIds);
-- void setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded);
-- void setMimeTypeFilter(int mimeTypeFilter);
-- void setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition);
-- void setTextFilter(const SearchTextFilterSettings& settings);
--
-- void setCategorizationMode(ImageSortSettings::CategorizationMode mode);
-- void setCategorizationSortOrder(ImageSortSettings::SortOrder order);
-- void setSortRole(ImageSortSettings::SortRole role);
-- void setSortOrder(ImageSortSettings::SortOrder order);
-- void setStringTypeNatural(bool natural);
-- void setUrlWhitelist(const QList<QUrl> urlList, const QString& id);
-- void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
--
-- void setVersionManagerSettings(const VersionManagerSettings& settings);
-- void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
--
-- void setGroupOpen(qlonglong group, bool open);
-- void toggleGroupOpen(qlonglong group);
-- void setAllGroupsOpen(bool open);
--
-- /** Changes the current image filter settings and refilters. */
-- virtual void setImageFilterSettings(const ImageFilterSettings& settings);
--
-- /** Changes the current image sort settings and resorts. */
-- virtual void setImageSortSettings(const ImageSortSettings& settings);
--
--Q_SIGNALS:
--
-- /// Signals that the set filter matches at least one index
-- void filterMatches(bool matches);
--
-- /** Signals that the set text filter matches at least one entry.
-- If no text filter is set, this signal is emitted
-- with 'false' when filterMatches() is emitted.
-- */
-- void filterMatchesForText(bool matchesByText);
--
-- /** Emitted when the filter settings have been changed
-- (the model may not yet have been updated)
-- */
-- void filterSettingsChanged(const ImageFilterSettings& settings);
--
-- /** These signals need to be explicitly enabled with setSendImageInfoSignals()
-- */
-- void imageInfosAdded(const QList<ImageInfo>& infos);
-- void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
--
--public:
--
-- // Declared as public because of use in sub-classes.
-- class ImageFilterModelPrivate;
--
--protected:
--
-- ImageFilterModelPrivate* const d_ptr;
--
--protected:
--
-- ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent);
--
-- virtual void setDirectSourceImageModel(ImageModel* model);
--
-- virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
--
-- virtual int compareCategories(const QModelIndex& left, const QModelIndex& right) const;
-- virtual bool subSortLessThan(const QModelIndex& left, const QModelIndex& right) const;
-- //virtual int categoryCount(const ImageInfo& info) const;
--
-- /** Reimplement to customize category sorting,
-- * Return negative if category of left < category right,
-- * Return 0 if left and right are in the same category, else return positive.
-- */
-- virtual int compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Reimplement to customize sorting. Do not take categories into account here.
-- */
-- virtual bool infosLessThan(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Returns a unique identifier for the category if info. The string need not be for user display.
-- */
-- virtual QString categoryIdentifier(const ImageInfo& info) const;
--
--protected Q_SLOTS:
--
-- void slotModelReset();
-- void slotUpdateFilter();
--
-- void slotImageTagChange(const ImageTagChangeset& changeset);
-- void slotImageChange(const ImageChangeset& changeset);
--
-- void slotRowsInserted(const QModelIndex& parent, int start, int end);
-- void slotRowsAboutToBeRemoved(const QModelIndex& parent, int start, int end);
--
--private:
--
-- Q_DECLARE_PRIVATE(ImageFilterModel)
--};
--
--// -----------------------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT NoDuplicatesImageFilterModel : public ImageSortFilterModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit NoDuplicatesImageFilterModel(QObject* parent = 0);
--
--protected:
--
-- virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
--};
--
--} // namespace Digikam
--
--Q_DECLARE_METATYPE(Digikam::ImageFilterModel*)
--
--#endif // IMAGEMODEL_H
-diff --git a/libs/models/imagefiltermodelpriv.cpp b/libs/models/imagefiltermodelpriv.cpp
-deleted file mode 100644
-index 07d9e79..0000000
---- a/libs/models/imagefiltermodelpriv.cpp
-+++ /dev/null
-@@ -1,258 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltermodelpriv.h"
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "imagefiltermodelthreads.h"
--
--namespace Digikam
--{
--
--ImageFilterModel::ImageFilterModelPrivate::ImageFilterModelPrivate()
--{
-- imageModel = 0;
-- version = 0;
-- lastDiscardVersion = 0;
-- sentOut = 0;
-- sentOutForReAdd = 0;
-- updateFilterTimer = 0;
-- needPrepare = false;
-- needPrepareComments = false;
-- needPrepareTags = false;
-- needPrepareGroups = false;
-- preparer = 0;
-- filterer = 0;
-- hasOneMatch = false;
-- hasOneMatchForText = false;
--
-- setupWorkers();
--}
--
--ImageFilterModel::ImageFilterModelPrivate::~ImageFilterModelPrivate()
--{
-- // facilitate thread stopping
-- ++version;
-- preparer->deactivate();
-- filterer->deactivate();
-- delete preparer;
-- delete filterer;
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::init(ImageFilterModel* _q)
--{
-- q = _q;
--
-- updateFilterTimer = new QTimer(this);
-- updateFilterTimer->setSingleShot(true);
-- updateFilterTimer->setInterval(250);
--
-- connect(updateFilterTimer, SIGNAL(timeout()),
-- q, SLOT(slotUpdateFilter()));
--
-- // inter-thread redirection
-- qRegisterMetaType<ImageFilterModelTodoPackage>("ImageFilterModelTodoPackage");
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- infosToProcess(infos, extraValues, true);
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- // These have already been added, we just process them afterwards
-- infosToProcess(infos, extraValues, false);
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::setupWorkers()
--{
-- preparer = new ImageFilterModelPreparer(this);
-- filterer = new ImageFilterModelFilterer(this);
--
-- // A package in constructed in infosToProcess.
-- // Normal flow is infosToProcess -> preparer::process -> filterer::process -> packageFinished.
-- // If no preparation is needed, the first step is skipped.
-- // If filter version changes, both will discard old package and send them to packageDiscarded.
--
-- connect(this, SIGNAL(packageToPrepare(ImageFilterModelTodoPackage)),
-- preparer, SLOT(process(ImageFilterModelTodoPackage)));
--
-- connect(this, SIGNAL(packageToFilter(ImageFilterModelTodoPackage)),
-- filterer, SLOT(process(ImageFilterModelTodoPackage)));
--
-- connect(preparer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-- filterer, SLOT(process(ImageFilterModelTodoPackage)));
--
-- connect(filterer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-- this, SLOT(packageFinished(ImageFilterModelTodoPackage)));
--
-- connect(preparer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-- this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
--
-- connect(filterer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-- this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos)
--{
-- infosToProcess(infos, QList<QVariant>(), false);
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- filterer->schedule();
--
-- if (needPrepare)
-- {
-- preparer->schedule();
-- }
--
-- Q_ASSERT(extraValues.isEmpty() || infos.size() == extraValues.size());
--
-- // prepare and filter in chunks
-- const int size = infos.size();
-- const int maxChunkSize = needPrepare ? PrepareChunkSize : FilterChunkSize;
-- const bool hasExtraValues = !extraValues.isEmpty();
-- QList<ImageInfo>::const_iterator it = infos.constBegin(), end;
-- QList<QVariant>::const_iterator xit = extraValues.constBegin(), xend;
-- int index = 0;
-- QVector<ImageInfo> infoVector;
-- QVector<QVariant> extraValueVector;
--
-- while (it != infos.constEnd())
-- {
-- const int chunkSize = qMin(maxChunkSize, size - index);
-- infoVector.resize(chunkSize);
-- end = it + chunkSize;
-- qCopy(it, end, infoVector.begin());
--
-- if (hasExtraValues)
-- {
-- extraValueVector.resize(chunkSize);
-- xend = xit + chunkSize;
-- qCopy(xit, xend, extraValueVector.begin());
-- xit = xend;
-- }
--
-- it = end;
-- index += chunkSize;
--
-- ++sentOut;
--
-- if (forReAdd)
-- {
-- ++sentOutForReAdd;
-- }
--
-- if (needPrepare)
-- {
-- emit packageToPrepare(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-- }
-- else
-- {
-- emit packageToFilter(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-- }
-- }
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::packageFinished(const ImageFilterModelTodoPackage& package)
--{
-- // check if it got discarded on the journey
-- if (package.version != version)
-- {
-- packageDiscarded(package);
-- return;
-- }
--
-- // incorporate result
-- QHash<qlonglong, bool>::const_iterator it = package.filterResults.constBegin();
--
-- for (; it != package.filterResults.constEnd(); ++it)
-- {
-- filterResults.insert(it.key(), it.value());
-- }
--
-- // re-add if necessary
-- if (package.isForReAdd)
-- {
-- emit reAddImageInfos(package.infos.toList(), package.extraValues.toList());
--
-- if (sentOutForReAdd == 1) // last package
-- {
-- emit reAddingFinished();
-- }
-- }
--
-- // decrement counters
-- --sentOut;
--
-- if (package.isForReAdd)
-- {
-- --sentOutForReAdd;
-- }
--
-- // If all packages have returned, filtered and readded, and no more are expected,
-- // and there is need to tell the filter result to the view, do that
-- if (sentOut == 0 && sentOutForReAdd == 0 && !imageModel->isRefreshing())
-- {
-- q->invalidate(); // use invalidate, not invalidateFilter only. Sorting may have changed as well.
-- emit (q->filterMatches(hasOneMatch));
-- emit (q->filterMatchesForText(hasOneMatchForText));
-- filterer->deactivate();
-- preparer->deactivate();
-- }
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::packageDiscarded(const ImageFilterModelTodoPackage& package)
--{
-- // Either, the model was reset, or the filter changed
-- // In the former case throw all away, in the latter case, recycle
-- if (package.version > lastDiscardVersion)
-- {
-- // Recycle packages: Send again with current version
-- // Do not increment sentOut or sentOutForReAdd here: it was not decremented!
--
-- if (needPrepare)
-- {
-- emit packageToPrepare(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-- }
-- else
-- {
-- emit packageToFilter(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-- }
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltermodelpriv.h b/libs/models/imagefiltermodelpriv.h
-deleted file mode 100644
-index a9e3f22..0000000
---- a/libs/models/imagefiltermodelpriv.h
-+++ /dev/null
-@@ -1,159 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-11
-- * Description : Qt item model for database entries - private shared header
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERMODELPRIV_H
--#define IMAGEFILTERMODELPRIV_H
--
--// Qt includes
--
--#include <QHash>
--#include <QMutex>
--#include <QMutexLocker>
--#include <QSet>
--#include <QThread>
--#include <QTimer>
--#include <QWaitCondition>
--
--// Local includes
--
--#include "imageinfo.h"
--#include "imagefiltermodel.h"
--
--#include "digikam_export.h"
--// Yes, we need the EXPORT macro in a private header because
--// this private header is shared across binary objects.
--// This does NOT make this classes here any more public!
--
--namespace Digikam
--{
--
--const int PrepareChunkSize = 101;
--const int FilterChunkSize = 2001;
--
--class ImageFilterModelTodoPackage
--{
--public:
--
-- ImageFilterModelTodoPackage()
-- : version(0), isForReAdd(false)
-- {
-- }
--
-- ImageFilterModelTodoPackage(const QVector<ImageInfo>& infos, const QVector<QVariant>& extraValues, int version, bool isForReAdd)
-- : infos(infos), extraValues(extraValues), version(version), isForReAdd(isForReAdd)
-- {
-- }
--
-- QVector<ImageInfo> infos;
-- QVector<QVariant> extraValues;
-- unsigned int version;
-- bool isForReAdd;
-- QHash<qlonglong, bool> filterResults;
--};
--
--// ------------------------------------------------------------------------------------------------
--
--class ImageFilterModelPreparer;
--class ImageFilterModelFilterer;
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModel::ImageFilterModelPrivate : public QObject
--{
-- Q_OBJECT
--
--public:
--
-- ImageFilterModelPrivate();
-- ~ImageFilterModelPrivate();
--
-- void init(ImageFilterModel* q);
-- void setupWorkers();
-- void infosToProcess(const QList<ImageInfo>& infos);
-- void infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd = true);
--
--public:
--
-- ImageFilterModel* q;
--
-- ImageModel* imageModel;
--
-- ImageFilterSettings filter;
-- ImageSortSettings sorter;
-- VersionImageFilterSettings versionFilter;
-- GroupImageFilterSettings groupFilter;
--
-- volatile unsigned int version;
-- unsigned int lastDiscardVersion;
-- unsigned int lastFilteredVersion;
-- int sentOut;
-- int sentOutForReAdd;
--
-- QTimer* updateFilterTimer;
--
-- bool needPrepare;
-- bool needPrepareComments;
-- bool needPrepareTags;
-- bool needPrepareGroups;
--
-- QMutex mutex;
-- ImageFilterSettings filterCopy;
-- VersionImageFilterSettings versionFilterCopy;
-- GroupImageFilterSettings groupFilterCopy;
-- ImageFilterModelPreparer* preparer;
-- ImageFilterModelFilterer* filterer;
--
-- QHash<qlonglong, bool> filterResults;
-- bool hasOneMatch;
-- bool hasOneMatchForText;
--
-- QList<ImageFilterModelPrepareHook*> prepareHooks;
--
--/*
-- QHash<int, QSet<qlonglong> > categoryCountHashInt;
-- QHash<QString, QSet<qlonglong> > categoryCountHashString;
--
--public:
--
-- void cacheCategoryCount(int id, qlonglong imageid) const
-- { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashInt[id].insert(imageid); }
-- void cacheCategoryCount(const QString& id, qlonglong imageid) const
-- { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashString[id].insert(imageid); }
--*/
--
--public Q_SLOTS:
--
-- void preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void packageFinished(const ImageFilterModelTodoPackage& package);
-- void packageDiscarded(const ImageFilterModelTodoPackage& package);
--
--Q_SIGNALS:
--
-- void packageToPrepare(const ImageFilterModelTodoPackage& package);
-- void packageToFilter(const ImageFilterModelTodoPackage& package);
-- void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void reAddingFinished();
--};
--
--} // namespace Digikam
--
--#endif // IMAGEFILTERMODELPRIV_H
-diff --git a/libs/models/imagefiltermodelthreads.cpp b/libs/models/imagefiltermodelthreads.cpp
-deleted file mode 100644
-index aa5c462..0000000
---- a/libs/models/imagefiltermodelthreads.cpp
-+++ /dev/null
-@@ -1,40 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltermodel.h"
--#include "imagefiltermodelpriv.h"
--#include "imagefiltermodelthreads.h"
--
--namespace Digikam
--{
--
--ImageFilterModelWorker::ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d)
-- : d(d)
--{
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltermodelthreads.h b/libs/models/imagefiltermodelthreads.h
-deleted file mode 100644
-index 83fa987..0000000
---- a/libs/models/imagefiltermodelthreads.h
-+++ /dev/null
-@@ -1,100 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-11
-- * Description : Qt item model for database entries - private header
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERMODELTHREADS_H
--#define IMAGEFILTERMODELTHREADS_H
--
--// Qt includes
--
--#include <QThread>
--
--// Local includes
--
--#include "digikam_export.h"
--#include "workerobject.h"
--
--namespace Digikam
--{
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelWorker : public WorkerObject
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d);
--
-- bool checkVersion(const ImageFilterModelTodoPackage& package)
-- {
-- return d->version == package.version;
-- }
--
--public Q_SLOTS:
--
-- virtual void process(ImageFilterModelTodoPackage package) = 0;
--
--Q_SIGNALS:
--
-- void processed(const ImageFilterModelTodoPackage& package);
-- void discarded(const ImageFilterModelTodoPackage& package);
--
--protected:
--
-- ImageFilterModel::ImageFilterModelPrivate* d;
--};
--
--// -----------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelPreparer : public ImageFilterModelWorker
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageFilterModelPreparer(ImageFilterModel::ImageFilterModelPrivate* const d)
-- : ImageFilterModelWorker(d)
-- {
-- }
--
-- void process(ImageFilterModelTodoPackage package);
--};
--
--// ----------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelFilterer : public ImageFilterModelWorker
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageFilterModelFilterer(ImageFilterModel::ImageFilterModelPrivate* const d)
-- : ImageFilterModelWorker(d)
-- {
-- }
--
-- void process(ImageFilterModelTodoPackage package);
--};
--
--} // namespace Digikam
--
--#endif // IMAGEFILTERMODELTHREADS_H
-diff --git a/libs/models/imagefiltersettings.cpp b/libs/models/imagefiltersettings.cpp
-deleted file mode 100644
-index b61e7f9..0000000
---- a/libs/models/imagefiltersettings.cpp
-+++ /dev/null
-@@ -1,952 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Filter values for use with ImageFilterModel
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltersettings.h"
--
--// C++ includes
--
--#include <cmath>
--
--// Qt includes
--
--#include <QDateTime>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbfields.h"
--#include "digikam_globals.h"
--#include "imageinfo.h"
--#include "tagscache.h"
--#include "versionmanagersettings.h"
--
--namespace Digikam
--{
--
--ImageFilterSettings::ImageFilterSettings()
--{
-- m_untaggedFilter = false;
-- m_isUnratedExcluded = false;
-- m_ratingFilter = 0;
-- m_mimeTypeFilter = MimeFilter::AllFiles;
-- m_ratingCond = GreaterEqualCondition;
-- m_matchingCond = OrCondition;
-- m_geolocationCondition = GeolocationNoFilter;
--}
--
--DatabaseFields::Set ImageFilterSettings::watchFlags() const
--{
-- DatabaseFields::Set set;
--
-- if (isFilteringByDay())
-- {
-- set |= DatabaseFields::CreationDate;
-- }
--
-- if (isFilteringByText())
-- {
-- set |= DatabaseFields::Name;
-- set |= DatabaseFields::Comment;
-- }
--
-- if (isFilteringByRating())
-- {
-- set |= DatabaseFields::Rating;
-- }
--
-- if (isFilteringByTypeMime())
-- {
-- set |= DatabaseFields::Category;
-- set |= DatabaseFields::Format;
-- }
--
-- if (isFilteringByGeolocation())
-- {
-- set |= DatabaseFields::ImagePositionsAll;
-- }
--
-- if (isFilteringByColorLabels())
-- {
-- set |= DatabaseFields::ColorLabel;
-- }
--
-- if (isFilteringByPickLabels())
-- {
-- set |= DatabaseFields::PickLabel;
-- }
--
-- return set;
--}
--
--bool ImageFilterSettings::isFilteringByDay() const
--{
-- if (!m_dayFilter.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByTags() const
--{
-- if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty() || m_untaggedFilter)
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByColorLabels() const
--{
-- if (!m_colorLabelTagFilter.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByPickLabels() const
--{
-- if (!m_pickLabelTagFilter.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByText() const
--{
-- if (!m_textFilterSettings.text.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByTypeMime() const
--{
-- if (m_mimeTypeFilter != MimeFilter::AllFiles)
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByGeolocation() const
--{
-- return (m_geolocationCondition != GeolocationNoFilter);
--}
--
--bool ImageFilterSettings::isFilteringByRating() const
--{
-- if (m_ratingFilter != 0 || m_ratingCond != GreaterEqualCondition || m_isUnratedExcluded)
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringInternally() const
--{
-- return (isFiltering() || !m_urlWhitelists.isEmpty() || !m_idWhitelists.isEmpty());
--}
--
--bool ImageFilterSettings::isFiltering() const
--{
-- return isFilteringByDay() ||
-- isFilteringByTags() ||
-- isFilteringByText() ||
-- isFilteringByRating() ||
-- isFilteringByTypeMime() ||
-- isFilteringByColorLabels() ||
-- isFilteringByPickLabels() ||
-- isFilteringByGeolocation();
--}
--
--void ImageFilterSettings::setDayFilter(const QList<QDateTime>& days)
--{
-- m_dayFilter.clear();
--
-- for (QList<QDateTime>::const_iterator it = days.constBegin(); it != days.constEnd(); ++it)
-- {
-- m_dayFilter.insert(*it, true);
-- }
--}
--
--void ImageFilterSettings::setTagFilter(const QList<int>& includedTags,
-- const QList<int>& excludedTags,
-- MatchingCondition matchingCondition,
-- bool showUnTagged,
-- const QList<int>& clTagIds,
-- const QList<int>& plTagIds)
--{
-- m_includeTagFilter = includedTags;
-- m_excludeTagFilter = excludedTags;
-- m_matchingCond = matchingCondition;
-- m_untaggedFilter = showUnTagged;
-- m_colorLabelTagFilter = clTagIds;
-- m_pickLabelTagFilter = plTagIds;
--}
--
--void ImageFilterSettings::setRatingFilter(int rating, RatingCondition ratingCondition, bool isUnratedExcluded)
--{
-- m_ratingFilter = rating;
-- m_ratingCond = ratingCondition;
-- m_isUnratedExcluded = isUnratedExcluded;
--}
--
--void ImageFilterSettings::setMimeTypeFilter(int mime)
--{
-- m_mimeTypeFilter = (MimeFilter::TypeMimeFilter)mime;
--}
--
--void ImageFilterSettings::setGeolocationFilter(const GeolocationCondition& condition)
--{
-- m_geolocationCondition = condition;
--}
--
--void ImageFilterSettings::setTextFilter(const SearchTextFilterSettings& settings)
--{
-- m_textFilterSettings = settings;
--}
--
--void ImageFilterSettings::setTagNames(const QHash<int, QString>& hash)
--{
-- m_tagNameHash = hash;
--}
--
--void ImageFilterSettings::setAlbumNames(const QHash<int, QString>& hash)
--{
-- m_albumNameHash = hash;
--}
--
--void ImageFilterSettings::setUrlWhitelist(const QList<QUrl>& urlList, const QString& id)
--{
-- if (urlList.isEmpty())
-- {
-- m_urlWhitelists.remove(id);
-- }
-- else
-- {
-- m_urlWhitelists.insert(id, urlList);
-- }
--}
--
--void ImageFilterSettings::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
--{
-- if (idList.isEmpty())
-- {
-- m_idWhitelists.remove(id);
-- }
-- else
-- {
-- m_idWhitelists.insert(id, idList);
-- }
--}
--
--template <class ContainerA, class ContainerB>
--bool containsAnyOf(const ContainerA& listA, const ContainerB& listB)
--{
-- foreach (const typename ContainerA::value_type& a, listA)
-- {
-- if (listB.contains(a))
-- {
-- return true;
-- }
-- }
-- return false;
--}
--
--template <class ContainerA, typename Value, class ContainerB>
--bool containsNoneOfExcept(const ContainerA& list, const ContainerB& noneOfList, const Value& exception)
--{
-- foreach (const typename ContainerB::value_type& n, noneOfList)
-- {
-- if (n != exception && list.contains(n))
-- {
-- return false;
-- }
-- }
-- return true;
--}
--
--bool ImageFilterSettings::matches(const ImageInfo& info, bool* const foundText) const
--{
-- if (foundText)
-- {
-- *foundText = false;
-- }
--
-- if (!isFilteringInternally())
-- {
-- return true;
-- }
--
-- bool match = false;
--
-- if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty())
-- {
-- QList<int> tagIds = info.tagIds();
-- QList<int>::const_iterator it;
--
-- match = m_includeTagFilter.isEmpty();
--
-- if (m_matchingCond == OrCondition)
-- {
-- for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-- {
-- if (tagIds.contains(*it))
-- {
-- match = true;
-- break;
-- }
-- }
--
-- match |= (m_untaggedFilter && tagIds.isEmpty());
-- }
-- else // AND matching condition...
-- {
-- // m_untaggedFilter and non-empty tag filter, combined with AND, is logically no match
-- if (!m_untaggedFilter)
-- {
-- for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-- {
-- if (!tagIds.contains(*it))
-- {
-- break;
-- }
-- }
--
-- if (it == m_includeTagFilter.end())
-- {
-- match = true;
-- }
-- }
-- }
--
-- for (it = m_excludeTagFilter.begin(); it != m_excludeTagFilter.end(); ++it)
-- {
-- if (tagIds.contains(*it))
-- {
-- match = false;
-- break;
-- }
-- }
-- }
-- else if (m_untaggedFilter)
-- {
-- match = !TagsCache::instance()->containsPublicTags(info.tagIds());
-- }
-- else
-- {
-- match = true;
-- }
--
-- //-- Filter by pick labels ------------------------------------------------
--
-- if (!m_pickLabelTagFilter.isEmpty())
-- {
-- QList<int> tagIds = info.tagIds();
-- bool matchPL = false;
--
-- if (containsAnyOf(m_pickLabelTagFilter, tagIds))
-- {
-- matchPL = true;
-- }
-- else if (!matchPL)
-- {
-- int noPickLabelTagId = TagsCache::instance()->tagForPickLabel(NoPickLabel);
--
-- if (m_pickLabelTagFilter.contains(noPickLabelTagId))
-- {
-- // Searching for "has no ColorLabel" requires special handling:
-- // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-- matchPL = containsNoneOfExcept(tagIds, TagsCache::instance()->pickLabelTags(), noPickLabelTagId);
-- }
-- }
--
-- match &= matchPL;
-- }
--
-- //-- Filter by color labels ------------------------------------------------
--
-- if (!m_colorLabelTagFilter.isEmpty())
-- {
-- QList<int> tagIds = info.tagIds();
-- bool matchCL = false;
--
-- if (containsAnyOf(m_colorLabelTagFilter, tagIds))
-- {
-- matchCL = true;
-- }
-- else if (!matchCL)
-- {
-- int noColorLabelTagId = TagsCache::instance()->tagForColorLabel(NoColorLabel);
--
-- if (m_colorLabelTagFilter.contains(noColorLabelTagId))
-- {
-- // Searching for "has no ColorLabel" requires special handling:
-- // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-- matchCL = containsNoneOfExcept(tagIds, TagsCache::instance()->colorLabelTags(), noColorLabelTagId);
-- }
-- }
--
-- match &= matchCL;
-- }
--
-- //-- Filter by date -----------------------------------------------------------
--
-- if (!m_dayFilter.isEmpty())
-- {
-- match &= m_dayFilter.contains(QDateTime(info.dateTime().date(), QTime()));
-- }
--
-- //-- Filter by rating ---------------------------------------------------------
--
-- if (m_ratingFilter >= 0)
-- {
-- // for now we treat -1 (no rating) just like a rating of 0.
-- int rating = info.rating();
--
-- if (rating == -1)
-- {
-- rating = 0;
-- }
--
-- if(m_isUnratedExcluded && rating == 0)
-- {
-- match = false;
-- }
-- else
-- {
-- if (m_ratingCond == GreaterEqualCondition)
-- {
-- // If the rating is not >=, i.e it is <, then it does not match.
-- if (rating < m_ratingFilter)
-- {
-- match = false;
-- }
-- }
-- else if (m_ratingCond == EqualCondition)
-- {
-- // If the rating is not =, i.e it is !=, then it does not match.
-- if (rating != m_ratingFilter)
-- {
-- match = false;
-- }
-- }
-- else
-- {
-- // If the rating is not <=, i.e it is >, then it does not match.
-- if (rating > m_ratingFilter)
-- {
-- match = false;
-- }
-- }
-- }
-- }
--
-- // -- Filter by mime type -----------------------------------------------------
--
-- switch (m_mimeTypeFilter)
-- {
-- // info.format is a standardized string: Only one possibility per mime type
-- case MimeFilter::ImageFiles:
-- {
-- if (info.category() != DatabaseItem::Image)
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::JPGFiles:
-- {
-- if (info.format() != QLatin1String("JPG"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::PNGFiles:
-- {
-- if (info.format() != QLatin1String("PNG"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::TIFFiles:
-- {
-- if (info.format() != QLatin1String("TIFF"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::DNGFiles:
-- {
-- if (info.format() != QLatin1String("RAW-DNG"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::NoRAWFiles:
-- {
-- if (info.format().startsWith(QLatin1String("RAW")))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::RAWFiles:
-- {
-- if (!info.format().startsWith(QLatin1String("RAW")))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::MoviesFiles:
-- {
-- if (info.category() != DatabaseItem::Video)
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::AudioFiles:
-- {
-- if (info.category() != DatabaseItem::Audio)
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::RasterFiles:
-- {
-- if (info.format() != QLatin1String("PSD") && // Adobe Photoshop Document
-- info.format() != QLatin1String("PSB") && // Adobe Photoshop Big
-- info.format() != QLatin1String("XCF") && // Gimp
-- info.format() != QLatin1String("KRA") && // Krita
-- info.format() != QLatin1String("ORA") // Open Raster
-- )
-- {
-- match = false;
-- }
--
-- break;
-- }
-- default:
-- {
-- // All Files: do nothing...
-- break;
-- }
-- }
--
-- //-- Filter by geolocation ----------------------------------------------------
--
-- if (m_geolocationCondition!=GeolocationNoFilter)
-- {
-- if (m_geolocationCondition==GeolocationNoCoordinates)
-- {
-- if (info.hasCoordinates())
-- {
-- match = false;
-- }
-- }
-- else if (m_geolocationCondition==GeolocationHasCoordinates)
-- {
-- if (!info.hasCoordinates())
-- {
-- match = false;
-- }
-- }
-- }
--
-- //-- Filter by text -----------------------------------------------------------
--
-- if (!m_textFilterSettings.text.isEmpty())
-- {
-- bool textMatch = false;
--
-- // Image name
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageName &&
-- info.name().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Image title
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageTitle &&
-- info.title().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Image comment
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageComment &&
-- info.comment().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Tag names
-- foreach(int id, info.tagIds())
-- {
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::TagName &&
-- m_tagNameHash.value(id).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
-- }
--
-- // Album names
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::AlbumName &&
-- m_albumNameHash.value(info.albumId()).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Image Aspect Ratio
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageAspectRatio)
-- {
-- QRegExp expRatio (QLatin1String("^\\d+:\\d+$"));
-- QRegExp expFloat (QLatin1String("^\\d+(.\\d+)?$"));
--
-- if (expRatio.indexIn(m_textFilterSettings.text) > -1 && m_textFilterSettings.text.contains(QRegExp(QLatin1String(":\\d+"))))
-- {
-- QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-- QStringList numberStringList = trimmedTextFilterSettingsText.split(QLatin1String(":"), QString::SkipEmptyParts);
--
-- if (numberStringList.length() == 2)
-- {
-- QString numString = (QString)numberStringList.at(0), denomString = (QString)numberStringList.at(1);
-- bool canConverseNum = false;
-- bool canConverseDenom = false;
-- int num = numString.toInt(&canConverseNum, 10), denom = denomString.toInt(&canConverseDenom, 10);
--
-- if (canConverseNum && canConverseDenom)
-- {
-- if (fabs(info.aspectRatio() - (double)num / denom) < 0.1)
-- textMatch = true;
-- }
-- }
-- }
-- else if (expFloat.indexIn(m_textFilterSettings.text) > -1)
-- {
-- QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-- bool canConverse = false;
-- double ratio = trimmedTextFilterSettingsText.toDouble(&canConverse);
--
-- if (canConverse)
-- {
-- if (fabs(info.aspectRatio() - ratio) < 0.1)
-- textMatch = true;
-- }
-- }
-- }
--
-- // Image Pixel Size
-- // See bug #341053 for details.
--
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImagePixelSize)
-- {
-- QSize size = info.dimensions();
-- int pixelSize = size.height()*size.width();
-- QString text = m_textFilterSettings.text;
--
-- if(text.contains(QRegExp(QLatin1String("^>\\d{1,15}$"))) && pixelSize > (text.remove(0,1)).toInt())
-- {
-- textMatch = true;
-- }
-- else if(text.contains(QRegExp(QLatin1String("^<\\d{1,15}$"))) && pixelSize < (text.remove(0,1)).toInt())
-- {
-- textMatch = true;
-- }
-- else if(text.contains(QRegExp(QLatin1String("^\\d+$"))) && pixelSize == text.toInt())
-- {
-- textMatch = true;
-- }
-- }
--
-- match &= textMatch;
--
-- if (foundText)
-- {
-- *foundText = textMatch;
-- }
-- }
--
-- // -- filter by URL-whitelists ------------------------------------------------
-- // NOTE: whitelists are always AND for now.
--
-- if (match)
-- {
-- const QUrl url = info.fileUrl();
--
-- for (QHash<QString, QList<QUrl>>::const_iterator it = m_urlWhitelists.constBegin();
-- it!=m_urlWhitelists.constEnd(); ++it)
-- {
-- match = it->contains(url);
--
-- if (!match)
-- {
-- break;
-- }
-- }
-- }
--
-- if (match)
-- {
-- const qlonglong id = info.id();
--
-- for (QHash<QString, QList<qlonglong> >::const_iterator it = m_idWhitelists.constBegin();
-- it!=m_idWhitelists.constEnd(); ++it)
-- {
-- match = it->contains(id);
--
-- if (!match)
-- {
-- break;
-- }
-- }
-- }
--
-- return match;
--}
--
--// -------------------------------------------------------------------------------------------------
--
--VersionImageFilterSettings::VersionImageFilterSettings()
--{
-- m_includeTagFilter = 0;
-- m_exceptionTagFilter = 0;
--}
--
--VersionImageFilterSettings::VersionImageFilterSettings(const VersionManagerSettings& settings)
--{
-- setVersionManagerSettings(settings);
--}
--
--bool VersionImageFilterSettings::operator==(const VersionImageFilterSettings& other) const
--{
-- return m_excludeTagFilter == other.m_excludeTagFilter &&
-- m_exceptionLists == other.m_exceptionLists;
--}
--
--bool VersionImageFilterSettings::matches(const ImageInfo& info) const
--{
-- if (!isFiltering())
-- {
-- return true;
-- }
--
-- const qlonglong id = info.id();
--
-- for (QHash<QString, QList<qlonglong> >::const_iterator it = m_exceptionLists.constBegin();
-- it != m_exceptionLists.constEnd(); ++it)
-- {
-- if (it->contains(id))
-- {
-- return true;
-- }
-- }
--
-- bool match = true;
-- QList<int> tagIds = info.tagIds();
--
-- if (!tagIds.contains(m_includeTagFilter))
-- {
-- for (QList<int>::const_iterator it = m_excludeTagFilter.begin();
-- it != m_excludeTagFilter.end(); ++it)
-- {
-- if (tagIds.contains(*it))
-- {
-- match = false;
-- break;
-- }
-- }
-- }
--
-- if (!match)
-- {
-- if (tagIds.contains(m_exceptionTagFilter))
-- {
-- match = true;
-- }
-- }
--
-- return match;
--}
--
--bool VersionImageFilterSettings::isHiddenBySettings(const ImageInfo& info) const
--{
-- QList<int> tagIds = info.tagIds();
--
-- foreach(int tagId, m_excludeTagFilter)
-- {
-- if (tagIds.contains(tagId))
-- {
-- return true;
-- }
-- }
--
-- return false;
--}
--
--bool VersionImageFilterSettings::isExemptedBySettings(const ImageInfo& info) const
--{
-- return info.tagIds().contains(m_exceptionTagFilter);
--}
--
--void VersionImageFilterSettings::setVersionManagerSettings(const VersionManagerSettings& settings)
--{
-- m_excludeTagFilter.clear();
--
-- if (!settings.enabled)
-- {
-- return;
-- }
--
-- if (!(settings.showInViewFlags & VersionManagerSettings::ShowOriginal))
-- {
-- m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::originalVersion());
-- }
--
-- if (!(settings.showInViewFlags & VersionManagerSettings::ShowIntermediates))
-- {
-- m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::intermediateVersion());
-- }
--
-- m_includeTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::currentVersion());
-- m_exceptionTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::versionAlwaysVisible());
--}
--
--void VersionImageFilterSettings::setExceptionList(const QList<qlonglong>& idList, const QString& id)
--{
-- if (idList.isEmpty())
-- {
-- m_exceptionLists.remove(id);
-- }
-- else
-- {
-- m_exceptionLists.insert(id, idList);
-- }
--}
--
--bool VersionImageFilterSettings::isFiltering() const
--{
-- return !m_excludeTagFilter.isEmpty();
--}
--
--bool VersionImageFilterSettings::isFilteringByTags() const
--{
-- return isFiltering();
--}
--
--// -------------------------------------------------------------------------------------------------
--
--GroupImageFilterSettings::GroupImageFilterSettings()
-- : m_allOpen(false)
--{
--}
--
--bool GroupImageFilterSettings::operator==(const GroupImageFilterSettings& other) const
--{
-- return (m_allOpen == other.m_allOpen &&
-- m_openGroups == other.m_openGroups);
--}
--
--bool GroupImageFilterSettings::matches(const ImageInfo& info) const
--{
-- if (m_allOpen)
-- {
-- return true;
-- }
--
-- if (info.isGrouped())
-- {
-- return m_openGroups.contains(info.groupImage().id());
-- }
-- return true;
--}
--
--void GroupImageFilterSettings::setOpen(qlonglong group, bool open)
--{
-- if (open)
-- {
-- m_openGroups << group;
-- }
-- else
-- {
-- m_openGroups.remove(group);
-- }
--}
--
--bool GroupImageFilterSettings::isOpen(qlonglong group) const
--{
-- return m_openGroups.contains(group);
--}
--
--void GroupImageFilterSettings::setAllOpen(bool open)
--{
-- m_allOpen = open;
--}
--
--bool GroupImageFilterSettings::isAllOpen() const
--{
-- return m_allOpen;
--}
--
--bool GroupImageFilterSettings::isFiltering() const
--{
-- return !m_allOpen;
--}
--
--DatabaseFields::Set GroupImageFilterSettings::watchFlags() const
--{
-- return DatabaseFields::ImageRelations;
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltersettings.h b/libs/models/imagefiltersettings.h
-deleted file mode 100644
-index 0e7beae..0000000
---- a/libs/models/imagefiltersettings.h
-+++ /dev/null
-@@ -1,349 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Filter values for use with ImageFilterModel
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERSETTINGS_H
--#define IMAGEFILTERSETTINGS_H
--
--// Qt includes
--
--#include <QHash>
--#include <QList>
--#include <QMap>
--#include <QString>
--#include <QSet>
--#include <QUrl>
--
--// Local includes
--
--#include "searchtextbar.h"
--#include "mimefilter.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageInfo;
--class VersionManagerSettings;
--
--namespace DatabaseFields
--{
-- class Set;
--}
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT SearchTextFilterSettings : public SearchTextSettings
--{
--
--public:
--
-- enum TextFilterFields
-- {
-- None = 0x00,
-- ImageName = 0x01,
-- ImageTitle = 0x02,
-- ImageComment = 0x04,
-- TagName = 0x08,
-- AlbumName = 0x10,
-- ImageAspectRatio = 0x20,
-- ImagePixelSize = 0x40,
-- All = ImageName | ImageTitle | ImageComment | TagName | AlbumName | ImageAspectRatio | ImagePixelSize
-- };
--
--public:
--
-- SearchTextFilterSettings()
-- {
-- textFields = None;
-- }
--
-- explicit SearchTextFilterSettings(const SearchTextSettings& settings)
-- {
-- caseSensitive = settings.caseSensitive;
-- text = settings.text;
-- textFields = None;
-- }
--
-- TextFilterFields textFields;
--};
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterSettings
--{
--public:
--
-- ImageFilterSettings();
--
-- /**
-- * Returns true if the given ImageInfo matches the filter criteria.
-- * Optionally, foundText is set to true if it matched by text search.
-- */
-- bool matches(const ImageInfo& info, bool* const foundText = 0) const;
--
--public:
--
-- /// --- Tags filter ---
--
-- /// Possible logical matching condition used to sort tags id.
-- enum MatchingCondition
-- {
-- OrCondition,
-- AndCondition
-- };
--
-- void setTagFilter(const QList<int>& includedTags,
-- const QList<int>& excludedTags,
-- MatchingCondition matchingCond,
-- bool showUnTagged,
-- const QList<int>& clTagIds,
-- const QList<int>& plTagIds);
--
--public:
--
-- /// --- Rating filter ---
--
-- /// Possible conditions used to filter rating: >=, =, <=
-- enum RatingCondition
-- {
-- GreaterEqualCondition,
-- EqualCondition,
-- LessEqualCondition
-- };
--
-- void setRatingFilter(int rating, RatingCondition ratingCond, bool isUnratedExcluded);
--
--public:
--
-- /// --- Date filter ---
-- void setDayFilter(const QList<QDateTime>& days);
--
--public:
--
-- /// --- Text filter ---
-- void setTextFilter(const SearchTextFilterSettings& settings);
-- void setTagNames(const QHash<int, QString>& tagNameHash);
-- void setAlbumNames(const QHash<int, QString>& albumNameHash);
--
--public:
--
-- /// --- Mime filter ---
-- void setMimeTypeFilter(int mimeTypeFilter);
--
--public:
--
-- /// --- Geolocation filter
-- enum GeolocationCondition
-- {
-- GeolocationNoFilter = 0,
-- GeolocationNoCoordinates = 1 << 1,
-- GeolocationHasCoordinates = 1 << 2
-- };
--
-- void setGeolocationFilter(const GeolocationCondition& condition);
--
--public:
--
-- /// Returns if the day is a filter criteria
-- bool isFilteringByDay() const;
--
-- /// Returns if the type mime is a filter criteria
-- bool isFilteringByTypeMime() const;
--
-- /// Returns whether geolocation is a filter criteria
-- bool isFilteringByGeolocation() const;
--
-- /// Returns if the rating is a filter criteria
-- bool isFilteringByRating() const;
--
-- /// Returns if the pick labels is a filter criteria
-- bool isFilteringByPickLabels() const;
--
-- /// Returns if the color labels is a filter criteria
-- bool isFilteringByColorLabels() const;
--
-- /// Returns if the tag is a filter criteria
-- bool isFilteringByTags() const;
--
-- /// Returns if the text (including comment) is a filter criteria
-- bool isFilteringByText() const;
--
-- /// Returns if images will be filtered by these criteria at all
-- bool isFiltering() const;
--
--public:
--
-- /// --- URL whitelist filter
-- void setUrlWhitelist(const QList<QUrl>& urlList, const QString& id);
--
--public:
--
-- /// --- ID whitelist filter
-- void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
--
--public:
--
-- /// --- Change notification ---
--
-- /** Returns database fields a change in which would affect the current filtering.
-- * To find out if an image tag change affects filtering, test isFilteringByTags().
-- * The text filter will also be affected by changes in tags and album names.
-- */
-- DatabaseFields::Set watchFlags() const;
--
--private:
--
-- /**
-- * @brief Returns whether some internal filtering (whitelist by id or URL) or normal filtering is going on
-- */
-- bool isFilteringInternally() const;
--
--private:
--
-- /// --- Tags filter ---
-- bool m_untaggedFilter;
-- QList<int> m_includeTagFilter;
-- QList<int> m_excludeTagFilter;
-- MatchingCondition m_matchingCond;
-- QList<int> m_colorLabelTagFilter;
-- QList<int> m_pickLabelTagFilter;
--
-- /// --- Rating filter ---
-- int m_ratingFilter;
-- RatingCondition m_ratingCond;
-- bool m_isUnratedExcluded;
--
-- /// --- Date filter ---
-- QMap<QDateTime, bool> m_dayFilter;
--
-- /// --- Text filter ---
-- SearchTextFilterSettings m_textFilterSettings;
--
-- /// Helpers for text search: Set these if you want to search album or tag names with text search
-- QHash<int, QString> m_tagNameHash;
-- QHash<int, QString> m_albumNameHash;
--
-- /// --- Mime filter ---
-- MimeFilter::TypeMimeFilter m_mimeTypeFilter;
--
-- /// --- Geolocation filter
-- GeolocationCondition m_geolocationCondition;
--
-- /// --- URL whitelist filter
-- QHash<QString,QList<QUrl>> m_urlWhitelists;
--
-- /// --- ID whitelist filter
-- QHash<QString,QList<qlonglong> > m_idWhitelists;
--};
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT VersionImageFilterSettings
--{
--public:
--
-- VersionImageFilterSettings();
-- explicit VersionImageFilterSettings(const VersionManagerSettings& settings);
--
-- bool operator==(const VersionImageFilterSettings& other) const;
--
-- /**
-- * Returns true if the given ImageInfo matches the filter criteria.
-- */
-- bool matches(const ImageInfo& info) const;
--
-- bool isHiddenBySettings(const ImageInfo& info) const;
-- bool isExemptedBySettings(const ImageInfo& info) const;
--
-- /// --- Tags filter ---
--
-- void setVersionManagerSettings(const VersionManagerSettings& settings);
--
-- /**
-- * Add list with exceptions: These images will be exempted from filtering by this filter
-- */
-- void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
--
-- /// Returns if images will be filtered by these criteria at all
-- bool isFiltering() const;
--
-- /// Returns if the tag is a filter criteria
-- bool isFilteringByTags() const;
--
-- /// DatabaseFields::Set watchFlags() const: Would return 0
--
--protected:
--
-- QList<int> m_excludeTagFilter;
-- int m_includeTagFilter;
-- int m_exceptionTagFilter;
-- QHash<QString,QList<qlonglong> > m_exceptionLists;
--};
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT GroupImageFilterSettings
--{
--public:
--
-- GroupImageFilterSettings();
--
-- bool operator==(const GroupImageFilterSettings& other) const;
--
-- /**
-- * Returns true if the given ImageInfo matches the filter criteria.
-- */
-- bool matches(const ImageInfo& info) const;
--
-- /**
-- * Open or close a group.
-- */
-- void setOpen(qlonglong group, bool open);
-- bool isOpen(qlonglong group) const;
--
-- /**
-- * Open all groups
-- */
-- void setAllOpen(bool open);
-- bool isAllOpen() const;
--
-- /// Returns if images will be filtered by these criteria at all
-- bool isFiltering() const;
--
-- DatabaseFields::Set watchFlags() const;
--
--protected:
--
-- bool m_allOpen;
-- QSet<qlonglong> m_openGroups;
--};
--
--} // namespace Digikam
--
--Q_DECLARE_METATYPE(Digikam::ImageFilterSettings::GeolocationCondition)
--
--#endif // IMAGEFILTERSETTINGS_H
-diff --git a/libs/models/imagelistmodel.cpp b/libs/models/imagelistmodel.cpp
-deleted file mode 100644
-index fafce34..0000000
---- a/libs/models/imagelistmodel.cpp
-+++ /dev/null
-@@ -1,70 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-12-06
-- * Description : An image model based on a static list
-- *
-- * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagelistmodel.h"
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbaccess.h"
--#include "coredbchangesets.h"
--#include "coredbwatch.h"
--#include "imageinfo.h"
--#include "imageinfolist.h"
--
--namespace Digikam
--{
--
--ImageListModel::ImageListModel(QObject* parent)
-- : ImageThumbnailModel(parent)
--{
-- connect(CoreDbAccess::databaseWatch(), SIGNAL(collectionImageChange(CollectionImageChangeset)),
-- this, SLOT(slotCollectionImageChange(CollectionImageChangeset)));
--}
--
--ImageListModel::~ImageListModel()
--{
--}
--
--void ImageListModel::slotCollectionImageChange(const CollectionImageChangeset& changeset)
--{
-- if (isEmpty())
-- {
-- return;
-- }
--
-- switch (changeset.operation())
-- {
-- case CollectionImageChangeset::Added:
-- break;
-- case CollectionImageChangeset::Removed:
-- case CollectionImageChangeset::RemovedAll:
-- removeImageInfos(ImageInfoList(changeset.ids()));
-- break;
--
-- default:
-- break;
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagelistmodel.h b/libs/models/imagelistmodel.h
-deleted file mode 100644
-index a225b1b..0000000
---- a/libs/models/imagelistmodel.h
-+++ /dev/null
-@@ -1,63 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-12-06
-- * Description : An image model based on a static list
-- *
-- * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGELISTMODEL_H
--#define IMAGELISTMODEL_H
--
--// Local includes
--
--#include "imagethumbnailmodel.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageChangeset;
--class CollectionImageChangeset;
--
--class DIGIKAM_DATABASE_EXPORT ImageListModel : public ImageThumbnailModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageListModel(QObject* parent = 0);
-- ~ImageListModel();
--
-- // NOTE: necessary methods to add and remove ImageInfos to the model are inherited from ImageModel
--
--Q_SIGNALS:
--
-- /**
-- * Emitted when images are removed from the model because they are removed in the database
-- */
-- void imageInfosRemoved(const QList<ImageInfo>& infos);
--
--protected Q_SLOTS:
--
-- void slotCollectionImageChange(const CollectionImageChangeset& changeset);
--};
--
--} // namespace Digikam
--
--#endif // IMAGELISTMODEL_H
-diff --git a/libs/models/imagemodel.cpp b/libs/models/imagemodel.cpp
-deleted file mode 100644
-index 41b43cf..0000000
---- a/libs/models/imagemodel.cpp
-+++ /dev/null
-@@ -1,1368 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagemodel.h"
--
--// Qt includes
--
--#include <QHash>
--#include <QItemSelection>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbchangesets.h"
--#include "coredbfields.h"
--#include "coredbwatch.h"
--#include "imageinfo.h"
--#include "imageinfolist.h"
--#include "abstractitemdragdrophandler.h"
--
--namespace Digikam
--{
--
--class ImageModel::Private
--{
--public:
--
-- Private()
-- {
-- preprocessor = 0;
-- keepFilePathCache = false;
-- sendRemovalSignals = false;
-- incrementalUpdater = 0;
-- refreshing = false;
-- reAdding = false;
-- incrementalRefreshRequested = false;
-- }
--
-- ImageInfoList infos;
-- QList<QVariant> extraValues;
-- QHash<qlonglong, int> idHash;
--
-- bool keepFilePathCache;
-- QHash<QString, qlonglong> filePathHash;
--
-- bool sendRemovalSignals;
--
-- QObject* preprocessor;
-- bool refreshing;
-- bool reAdding;
-- bool incrementalRefreshRequested;
--
-- DatabaseFields::Set watchFlags;
--
-- class ImageModelIncrementalUpdater* incrementalUpdater;
--
-- ImageInfoList pendingInfos;
-- QList<QVariant> pendingExtraValues;
--
-- inline bool isValid(const QModelIndex& index)
-- {
-- if (!index.isValid())
-- {
-- return false;
-- }
--
-- if (index.row() < 0 || index.row() >= infos.size())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index" << index;
-- return false;
-- }
--
-- return true;
-- }
-- inline bool extraValueValid(const QModelIndex& index)
-- {
-- // we assume isValid() being called before, no duplicate checks
-- if (index.row() >= extraValues.size())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index for extraData" << index;
-- return false;
-- }
--
-- return true;
-- }
--};
--
--typedef QPair<int, int> IntPair; // to make foreach macro happy
--typedef QList<IntPair> IntPairList;
--
--class ImageModelIncrementalUpdater
--{
--public:
--
-- explicit ImageModelIncrementalUpdater(ImageModel::Private* d);
--
-- void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void aboutToBeRemovedInModel(const IntPairList& aboutToBeRemoved);
-- QList<IntPair> oldIndexes();
--
-- static QList<IntPair> toContiguousPairs(const QList<int>& ids);
--
--public:
--
-- QHash<qlonglong, int> oldIds;
-- QList<QVariant> oldExtraValues;
-- QList<ImageInfo> newInfos;
-- QList<QVariant> newExtraValues;
-- QList<IntPairList> modelRemovals;
--};
--
--ImageModel::ImageModel(QObject* parent)
-- : QAbstractListModel(parent),
-- d(new Private)
--{
-- connect(CoreDbAccess::databaseWatch(), SIGNAL(imageChange(ImageChangeset)),
-- this, SLOT(slotImageChange(ImageChangeset)));
--
-- connect(CoreDbAccess::databaseWatch(), SIGNAL(imageTagChange(ImageTagChangeset)),
-- this, SLOT(slotImageTagChange(ImageTagChangeset)));
--}
--
--ImageModel::~ImageModel()
--{
-- delete d->incrementalUpdater;
-- delete d;
--}
--
--// ------------ Access methods -------------
--
--void ImageModel::setKeepsFilePathCache(bool keepCache)
--{
-- d->keepFilePathCache = keepCache;
--}
--
--bool ImageModel::keepsFilePathCache() const
--{
-- return d->keepFilePathCache;
--}
--
--bool ImageModel::isEmpty() const
--{
-- return d->infos.isEmpty();
--}
--
--void ImageModel::setWatchFlags(const DatabaseFields::Set& set)
--{
-- d->watchFlags = set;
--}
--
--ImageInfo ImageModel::imageInfo(const QModelIndex& index) const
--{
-- if (!d->isValid(index))
-- {
-- return ImageInfo();
-- }
--
-- return d->infos.at(index.row());
--}
--
--ImageInfo& ImageModel::imageInfoRef(const QModelIndex& index) const
--{
-- return d->infos[index.row()];
--}
--
--qlonglong ImageModel::imageId(const QModelIndex& index) const
--{
-- if (!d->isValid(index))
-- {
-- return 0;
-- }
--
-- return d->infos.at(index.row()).id();
--}
--
--QList<ImageInfo> ImageModel::imageInfos(const QList<QModelIndex>& indexes) const
--{
-- QList<ImageInfo> infos;
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- infos << imageInfo(index);
-- }
--
-- return infos;
--}
--
--QList<qlonglong> ImageModel::imageIds(const QList<QModelIndex>& indexes) const
--{
-- QList<qlonglong> ids;
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- ids << imageId(index);
-- }
--
-- return ids;
--}
--
--ImageInfo ImageModel::imageInfo(int row) const
--{
-- if (row >= d->infos.size())
-- {
-- return ImageInfo();
-- }
--
-- return d->infos.at(row);
--}
--
--ImageInfo& ImageModel::imageInfoRef(int row) const
--{
-- return d->infos[row];
--}
--
--qlonglong ImageModel::imageId(int row) const
--{
-- if (row < 0 || row >= d->infos.size())
-- {
-- return -1;
-- }
--
-- return d->infos.at(row).id();
--}
--
--QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info) const
--{
-- return indexForImageId(info.id());
--}
--
--QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const
--{
-- return indexForImageId(info.id(), extraValue);
--}
--
--QList<QModelIndex> ImageModel::indexesForImageInfo(const ImageInfo& info) const
--{
-- return indexesForImageId(info.id());
--}
--
--QModelIndex ImageModel::indexForImageId(qlonglong id) const
--{
-- int index = d->idHash.value(id, -1);
--
-- if (index != -1)
-- {
-- return createIndex(index, 0);
-- }
--
-- return QModelIndex();
--}
--
--QModelIndex ImageModel::indexForImageId(qlonglong id, const QVariant& extraValue) const
--{
-- if (d->extraValues.isEmpty())
-- return indexForImageId(id);
--
-- QHash<qlonglong, int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- if (d->extraValues.at(it.value()) == extraValue)
-- return createIndex(it.value(), 0);
-- }
--
-- return QModelIndex();
--}
--
--QList<QModelIndex> ImageModel::indexesForImageId(qlonglong id) const
--{
-- QList<QModelIndex> indexes;
-- QHash<qlonglong, int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- indexes << createIndex(it.value(), 0);
-- }
--
-- return indexes;
--}
--
--int ImageModel::numberOfIndexesForImageInfo(const ImageInfo& info) const
--{
-- return numberOfIndexesForImageId(info.id());
--}
--
--int ImageModel::numberOfIndexesForImageId(qlonglong id) const
--{
-- if (d->extraValues.isEmpty())
-- {
-- return 0;
-- }
--
-- int count = 0;
-- QHash<qlonglong,int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- ++count;
-- }
--
-- return count;
--}
--
--// static method
--ImageInfo ImageModel::retrieveImageInfo(const QModelIndex& index)
--{
-- if (!index.isValid())
-- {
-- return ImageInfo();
-- }
--
-- ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-- int row = index.data(ImageModelInternalId).toInt();
--
-- if (!model)
-- {
-- return ImageInfo();
-- }
--
-- return model->imageInfo(row);
--}
--
--// static method
--qlonglong ImageModel::retrieveImageId(const QModelIndex& index)
--{
-- if (!index.isValid())
-- {
-- return 0;
-- }
--
-- ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-- int row = index.data(ImageModelInternalId).toInt();
--
-- if (!model)
-- {
-- return 0;
-- }
--
-- return model->imageId(row);
--}
--
--QModelIndex ImageModel::indexForPath(const QString& filePath) const
--{
-- if (d->keepFilePathCache)
-- {
-- return indexForImageId(d->filePathHash.value(filePath));
-- }
-- else
-- {
-- const int size = d->infos.size();
--
-- for (int i=0; i<size; ++i)
-- {
-- if (d->infos.at(i).filePath() == filePath)
-- {
-- return createIndex(i, 0);
-- }
-- }
-- }
--
-- return QModelIndex();
--}
--
--QList<QModelIndex> ImageModel::indexesForPath(const QString& filePath) const
--{
-- if (d->keepFilePathCache)
-- {
-- return indexesForImageId(d->filePathHash.value(filePath));
-- }
-- else
-- {
-- QList<QModelIndex> indexes;
-- const int size = d->infos.size();
--
-- for (int i=0; i<size; ++i)
-- {
-- if (d->infos.at(i).filePath() == filePath)
-- {
-- indexes << createIndex(i, 0);
-- }
-- }
--
-- return indexes;
-- }
--}
--
--ImageInfo ImageModel::imageInfo(const QString& filePath) const
--{
-- if (d->keepFilePathCache)
-- {
-- qlonglong id = d->filePathHash.value(filePath);
--
-- if (id)
-- {
-- int index = d->idHash.value(id, -1);
--
-- if (index != -1)
-- {
-- return d->infos.at(index);
-- }
-- }
-- }
-- else
-- {
-- foreach(const ImageInfo& info, d->infos)
-- {
-- if (info.filePath() == filePath)
-- {
-- return info;
-- }
-- }
-- }
--
-- return ImageInfo();
--}
--
--QList<ImageInfo> ImageModel::imageInfos(const QString& filePath) const
--{
-- QList<ImageInfo> infos;
--
-- if (d->keepFilePathCache)
-- {
-- qlonglong id = d->filePathHash.value(filePath);
--
-- if (id)
-- {
-- foreach(int index, d->idHash.values(id))
-- {
-- infos << d->infos.at(index);
-- }
-- }
-- }
-- else
-- {
-- foreach(const ImageInfo& info, d->infos)
-- {
-- if (info.filePath() == filePath)
-- {
-- infos << info;
-- }
-- }
-- }
--
-- return infos;
--}
--
--void ImageModel::addImageInfo(const ImageInfo& info)
--{
-- addImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
--}
--
--void ImageModel::addImageInfos(const QList<ImageInfo>& infos)
--{
-- addImageInfos(infos, QList<QVariant>());
--}
--
--void ImageModel::addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- if (d->incrementalUpdater)
-- {
-- d->incrementalUpdater->appendInfos(infos, extraValues);
-- }
-- else
-- {
-- appendInfos(infos, extraValues);
-- }
--}
--
--void ImageModel::addImageInfoSynchronously(const ImageInfo& info)
--{
-- addImageInfosSynchronously(QList<ImageInfo>() << info, QList<QVariant>());
--}
--
--void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos)
--{
-- addImageInfos(infos, QList<QVariant>());
--}
--
--void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- publiciseInfos(infos, extraValues);
-- emit processAdded(infos, extraValues);
--}
--
--void ImageModel::ensureHasImageInfo(const ImageInfo& info)
--{
-- ensureHasImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
--}
--
--void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos)
--{
-- ensureHasImageInfos(infos, QList<QVariant>());
--}
--
--void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (extraValues.isEmpty())
-- {
-- if (!d->pendingExtraValues.isEmpty())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-- return;
-- }
-- }
-- else
-- {
-- if (d->pendingInfos.size() != d->pendingExtraValues.size())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-- return;
-- }
-- }
--
-- d->pendingInfos << infos;
-- d->pendingExtraValues << extraValues;
-- cleanSituationChecks();
--}
--
--void ImageModel::clearImageInfos()
--{
-- d->infos.clear();
-- d->extraValues.clear();
-- d->idHash.clear();
-- d->filePathHash.clear();
-- delete d->incrementalUpdater;
-- d->incrementalUpdater = 0;
-- d->pendingInfos.clear();
-- d->pendingExtraValues.clear();
-- d->refreshing = false;
-- d->reAdding = false;
-- d->incrementalRefreshRequested = false;
--
-- beginResetModel();
-- endResetModel();
--
-- imageInfosCleared();
--}
--
--void ImageModel::setImageInfos(const QList<ImageInfo>& infos)
--{
-- clearImageInfos();
-- addImageInfos(infos);
--}
--
--QList<ImageInfo> ImageModel::imageInfos() const
--{
-- return d->infos;
--}
--
--QList<qlonglong> ImageModel::imageIds() const
--{
-- return d->idHash.keys();
--}
--
--bool ImageModel::hasImage(qlonglong id) const
--{
-- return d->idHash.contains(id);
--}
--
--bool ImageModel::hasImage(const ImageInfo& info) const
--{
-- return d->idHash.contains(info.id());
--}
--
--bool ImageModel::hasImage(const ImageInfo& info, const QVariant& extraValue) const
--{
-- return hasImage(info.id(), extraValue);
--}
--
--bool ImageModel::hasImage(qlonglong id, const QVariant& extraValue) const
--{
-- if (d->extraValues.isEmpty())
-- return hasImage(id);
--
-- QHash<qlonglong, int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- if (d->extraValues.at(it.value()) == extraValue)
-- return true;
-- }
--
-- return false;;
--}
--
--QList<ImageInfo> ImageModel::uniqueImageInfos() const
--{
-- if (d->extraValues.isEmpty())
-- {
-- return d->infos;
-- }
--
-- QList<ImageInfo> uniqueInfos;
-- const int size = d->infos.size();
--
-- for (int i=0; i<size; ++i)
-- {
-- const ImageInfo& info = d->infos.at(i);
--
-- if (d->idHash.value(info.id()) == i)
-- {
-- uniqueInfos << info;
-- }
-- }
--
-- return uniqueInfos;
--}
--
--void ImageModel::emitDataChangedForAll()
--{
-- if (d->infos.isEmpty())
-- {
-- return;
-- }
--
-- QModelIndex first = createIndex(0, 0);
-- QModelIndex last = createIndex(d->infos.size() - 1, 0);
-- emit dataChanged(first, last);
--}
--
--void ImageModel::emitDataChangedForSelection(const QItemSelection& selection)
--{
-- if (!selection.isEmpty())
-- {
-- foreach(const QItemSelectionRange& range, selection)
-- {
-- emit dataChanged(range.topLeft(), range.bottomRight());
-- }
-- }
--}
--
--void ImageModel::ensureHasGroupedImages(const ImageInfo& groupLeader)
--{
-- ensureHasImageInfos(groupLeader.groupedImages());
--}
--
--// ------------ Preprocessing -------------
--
--void ImageModel::setPreprocessor(QObject* preprocessor)
--{
-- unsetPreprocessor(d->preprocessor);
-- d->preprocessor = preprocessor;
--}
--
--void ImageModel::unsetPreprocessor(QObject* preprocessor)
--{
-- if (preprocessor && d->preprocessor == preprocessor)
-- {
-- disconnect(this, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)), 0, 0);
-- disconnect(d->preprocessor, 0, this, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
-- disconnect(d->preprocessor, 0, this, SLOT(reAddingFinished()));
-- }
--}
--
--void ImageModel::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- if (d->preprocessor)
-- {
-- d->reAdding = true;
-- emit preprocess(infos, extraValues);
-- }
-- else
-- {
-- publiciseInfos(infos, extraValues);
-- }
--}
--
--void ImageModel::appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- // This method does deduplication. It is private because in context of readding or refreshing it is of no use.
--
-- if (extraValues.isEmpty())
-- {
-- QList<ImageInfo> checkedInfos;
--
-- foreach (const ImageInfo& info, infos)
-- {
-- if (!hasImage(info))
-- {
-- checkedInfos << info;
-- }
-- }
--
-- appendInfos(checkedInfos, QList<QVariant>());
-- }
-- else
-- {
-- QList<ImageInfo> checkedInfos;
-- QList<QVariant> checkedExtraValues;
-- const int size = infos.size();
--
-- for (int i=0; i<size; i++)
-- {
-- if (!hasImage(infos[i], extraValues[i]))
-- {
-- checkedInfos << infos[i];
-- checkedExtraValues << extraValues[i];
-- }
-- }
--
-- appendInfos(checkedInfos, checkedExtraValues);
-- }
--}
--
--void ImageModel::reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- // addImageInfos -> appendInfos -> preprocessor -> reAddImageInfos
-- publiciseInfos(infos, extraValues);
--}
--
--void ImageModel::reAddingFinished()
--{
-- d->reAdding = false;
-- cleanSituationChecks();
--}
--
--void ImageModel::startRefresh()
--{
-- d->refreshing = true;
--}
--
--void ImageModel::finishRefresh()
--{
-- d->refreshing = false;
-- cleanSituationChecks();
--}
--
--bool ImageModel::isRefreshing() const
--{
-- return d->refreshing;
--}
--
--void ImageModel::cleanSituationChecks()
--{
-- // For starting an incremental refresh we want a clear situation:
-- // Any remaining batches from non-incremental refreshing subclasses have been received in appendInfos(),
-- // any batches sent to preprocessor for re-adding have been re-added.
-- if (d->refreshing || d->reAdding)
-- {
-- return;
-- }
--
-- if (!d->pendingInfos.isEmpty())
-- {
-- appendInfosChecked(d->pendingInfos, d->pendingExtraValues);
-- d->pendingInfos.clear();
-- d->pendingExtraValues.clear();
-- cleanSituationChecks();
-- return;
-- }
--
-- if (d->incrementalRefreshRequested)
-- {
-- d->incrementalRefreshRequested = false;
-- emit readyForIncrementalRefresh();
-- }
-- else
-- {
-- emit allRefreshingFinished();
-- }
--}
--
--void ImageModel::publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- Q_ASSERT(infos.size() == extraValues.size() || (extraValues.isEmpty() && d->extraValues.isEmpty()));
--
-- emit imageInfosAboutToBeAdded(infos);
-- const int firstNewIndex = d->infos.size();
-- const int lastNewIndex = d->infos.size() + infos.size() - 1;
-- beginInsertRows(QModelIndex(), firstNewIndex, lastNewIndex);
-- d->infos << infos;
-- d->extraValues << extraValues;
--
-- for (int i=firstNewIndex; i<=lastNewIndex; ++i)
-- {
-- const ImageInfo& info = d->infos.at(i);
-- qlonglong id = info.id();
-- d->idHash.insertMulti(id, i);
--
-- if (d->keepFilePathCache)
-- {
-- d->filePathHash[info.filePath()] = id;
-- }
-- }
--
-- endInsertRows();
-- emit imageInfosAdded(infos);
--}
--
--void ImageModel::requestIncrementalRefresh()
--{
-- if (d->reAdding)
-- {
-- d->incrementalRefreshRequested = true;
-- }
-- else
-- {
-- emit readyForIncrementalRefresh();
-- }
--}
--
--bool ImageModel::hasIncrementalRefreshPending() const
--{
-- return d->incrementalRefreshRequested;
--}
--
--void ImageModel::startIncrementalRefresh()
--{
-- delete d->incrementalUpdater;
--
-- d->incrementalUpdater = new ImageModelIncrementalUpdater(d);
--}
--
--void ImageModel::finishIncrementalRefresh()
--{
-- if (!d->incrementalUpdater)
-- {
-- return;
-- }
--
-- // remove old entries
-- QList<QPair<int, int> > pairs = d->incrementalUpdater->oldIndexes();
-- removeRowPairs(pairs);
--
-- // add new indexes
-- appendInfos(d->incrementalUpdater->newInfos, d->incrementalUpdater->newExtraValues);
--
-- delete d->incrementalUpdater;
-- d->incrementalUpdater = 0;
--}
--
--void ImageModel::removeIndex(const QModelIndex& index)
--{
-- removeIndexes(QList<QModelIndex>() << index);
--}
--
--void ImageModel::removeIndexes(const QList<QModelIndex>& indexes)
--{
-- QList<int> listIndexes;
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- if (d->isValid(index))
-- {
-- listIndexes << index.row();
-- }
-- }
--
-- if (listIndexes.isEmpty())
-- {
-- return;
-- }
--
-- removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
--}
--
--void ImageModel::removeImageInfo(const ImageInfo& info)
--{
-- removeImageInfos(QList<ImageInfo>() << info);
--}
--
--void ImageModel::removeImageInfos(const QList<ImageInfo>& infos)
--{
-- QList<int> listIndexes;
--
-- foreach(const ImageInfo& info, infos)
-- {
-- QModelIndex index = indexForImageId(info.id());
--
-- if (index.isValid())
-- {
-- listIndexes << index.row();
-- }
-- }
-- removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
--}
--
--void ImageModel::removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (extraValues.isEmpty())
-- {
-- removeImageInfos(infos);
-- return;
-- }
--
-- QList<int> listIndexes;
--
-- for (int i=0; i<infos.size(); ++i)
-- {
-- QModelIndex index = indexForImageId(infos.at(i).id(), extraValues.at(i));
--
-- if (index.isValid())
-- {
-- listIndexes << index.row();
-- }
-- }
--
-- removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
--}
--
--void ImageModel::setSendRemovalSignals(bool send)
--{
-- d->sendRemovalSignals = send;
--}
--
--template <class List, typename T>
--static bool pairsContain(const List& list, T value)
--{
-- typename List::const_iterator middle;
-- typename List::const_iterator begin = list.begin();
-- typename List::const_iterator end = list.end();
-- int n = int(end - begin);
-- int half;
--
-- while (n > 0)
-- {
-- half = n >> 1;
-- middle = begin + half;
--
-- if (middle->first <= value && middle->second >= value)
-- {
-- return true;
-- }
-- else if (middle->second < value)
-- {
-- begin = middle + 1;
-- n -= half + 1;
-- }
-- else
-- {
-- n = half;
-- }
-- }
--
-- return false;
--}
--
--void ImageModel::removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove)
--{
-- if (d->incrementalUpdater)
-- {
-- d->incrementalUpdater->aboutToBeRemovedInModel(toRemove);
-- }
--
-- removeRowPairs(toRemove);
--}
--
--void ImageModel::removeRowPairs(const QList<QPair<int, int> >& toRemove)
--{
-- if (toRemove.isEmpty())
-- {
-- return;
-- }
--
-- // Remove old indexes
-- // Keep in mind that when calling beginRemoveRows all structures announced to be removed
-- // must still be valid, and this includes our hashes as well, which limits what we can optimize
--
-- int removedRows = 0, offset = 0;
-- typedef QPair<int, int> IntPair; // to make foreach macro happy
--
-- foreach(const IntPair& pair, toRemove)
-- {
-- const int begin = pair.first - offset;
-- const int end = pair.second - offset; // inclusive
-- removedRows = end - begin + 1;
--
-- // when removing from the list, all subsequent indexes are affected
-- offset += removedRows;
--
-- QList<ImageInfo> removedInfos;
--
-- if (d->sendRemovalSignals)
-- {
-- qCopy(d->infos.begin() + begin, d->infos.begin() + end, removedInfos.begin());
-- emit imageInfosAboutToBeRemoved(removedInfos);
-- }
--
-- imageInfosAboutToBeRemoved(begin, end);
-- beginRemoveRows(QModelIndex(), begin, end);
--
-- // update idHash - which points to indexes of d->infos, and these change now!
-- QHash<qlonglong, int>::iterator it;
--
-- for (it = d->idHash.begin(); it != d->idHash.end(); )
-- {
-- if (it.value() >= begin)
-- {
-- if (it.value() > end)
-- {
-- // after the removed interval: adjust index
-- it.value() -= removedRows;
-- }
-- else
-- {
-- // in the removed interval
-- it = d->idHash.erase(it);
-- continue;
-- }
-- }
--
-- ++it;
-- }
--
-- // remove from list
-- d->infos.erase(d->infos.begin() + begin, d->infos.begin() + (end + 1));
--
-- if (!d->extraValues.isEmpty())
-- {
-- d->extraValues.erase(d->extraValues.begin() + begin, d->extraValues.begin() + (end + 1));
-- }
--
-- endRemoveRows();
--
-- if (d->sendRemovalSignals)
-- {
-- emit imageInfosRemoved(removedInfos);
-- }
-- }
--
-- // tidy up: remove old indexes from file path hash now
-- if (d->keepFilePathCache)
-- {
-- QHash<QString, qlonglong>::iterator it;
--
-- for (it = d->filePathHash.begin(); it != d->filePathHash.end(); )
-- {
-- if (pairsContain(toRemove, it.value()))
-- {
-- it = d->filePathHash.erase(it);
-- }
-- else
-- {
-- ++it;
-- }
-- }
-- }
--}
--
--ImageModelIncrementalUpdater::ImageModelIncrementalUpdater(ImageModel::Private* d)
--{
-- oldIds = d->idHash;
-- oldExtraValues = d->extraValues;
--}
--
--void ImageModelIncrementalUpdater::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (extraValues.isEmpty())
-- {
-- foreach(const ImageInfo& info, infos)
-- {
-- QHash<qlonglong,int>::iterator it = oldIds.find(info.id());
--
-- if (it != oldIds.end())
-- {
-- oldIds.erase(it);
-- }
-- else
-- {
-- newInfos << info;
-- }
-- }
-- }
-- else
-- {
-- for (int i=0; i<infos.size(); ++i)
-- {
-- const ImageInfo& info = infos.at(i);
-- bool found = false;
-- QHash<qlonglong,int>::iterator it;
--
-- for (it = oldIds.find(info.id()); it != oldIds.end() && it.key() == info.id(); ++it)
-- {
-- // first check is for bug #262596. Not sure if needed.
-- if (it.value() < oldExtraValues.size() && extraValues.at(i) == oldExtraValues.at(it.value()))
-- {
-- found = true;
-- break;
-- }
-- }
--
-- if (found)
-- {
-- oldIds.erase(it);
-- // do not erase from oldExtraValues - oldIds is a hash id -> index.
-- }
-- else
-- {
-- newInfos << info;
-- newExtraValues << extraValues.at(i);
-- }
-- }
-- }
--}
--
--void ImageModelIncrementalUpdater::aboutToBeRemovedInModel(const IntPairList& toRemove)
--{
-- modelRemovals << toRemove;
--}
--
--QList<QPair<int, int> > ImageModelIncrementalUpdater::oldIndexes()
--{
-- // first, apply all changes to indexes by direct removal in model
-- // while the updater was active
-- foreach(const IntPairList& list, modelRemovals)
-- {
-- int removedRows = 0, offset = 0;
--
-- foreach(const IntPair& pair, list)
-- {
-- const int begin = pair.first - offset;
-- const int end = pair.second - offset; // inclusive
-- removedRows = end - begin + 1;
--
-- // when removing from the list, all subsequent indexes are affected
-- offset += removedRows;
--
-- // update idHash - which points to indexes of d->infos, and these change now!
-- QHash<qlonglong, int>::iterator it;
--
-- for (it = oldIds.begin(); it != oldIds.end(); )
-- {
-- if (it.value() >= begin)
-- {
-- if (it.value() > end)
-- {
-- // after the removed interval: adjust index
-- it.value() -= removedRows;
-- }
-- else
-- {
-- // in the removed interval
-- it = oldIds.erase(it);
-- continue;
-- }
-- }
--
-- ++it;
-- }
-- }
-- }
--
-- modelRemovals.clear();
--
-- return toContiguousPairs(oldIds.values());
--}
--
--QList<QPair<int, int> > ImageModelIncrementalUpdater::toContiguousPairs(const QList<int>& unsorted)
--{
-- // Take the given indices and return them as contiguous pairs [begin, end]
--
-- QList<QPair<int, int> > pairs;
--
-- if (unsorted.isEmpty())
-- {
-- return pairs;
-- }
--
-- QList<int> indices(unsorted);
-- qSort(indices);
--
-- QPair<int, int> pair(indices.first(), indices.first());
--
-- for (int i=1; i<indices.size(); ++i)
-- {
-- const int &index = indices.at(i);
--
-- if (index == pair.second + 1)
-- {
-- pair.second = index;
-- continue;
-- }
--
-- pairs << pair; // insert last pair
-- pair.first = index;
-- pair.second = index;
-- }
--
-- pairs << pair;
--
-- return pairs;
--}
--
--// ------------ QAbstractItemModel implementation -------------
--
--QVariant ImageModel::data(const QModelIndex& index, int role) const
--{
-- if (!d->isValid(index))
-- {
-- return QVariant();
-- }
--
-- switch (role)
-- {
-- case Qt::DisplayRole:
-- case Qt::ToolTipRole:
-- return d->infos.at(index.row()).name();
--
-- case ImageModelPointerRole:
-- return QVariant::fromValue(const_cast<ImageModel*>(this));
--
-- case ImageModelInternalId:
-- return index.row();
--
-- case CreationDateRole:
-- return d->infos.at(index.row()).dateTime();
--
-- case ExtraDataRole:
--
-- if (d->extraValueValid(index))
-- {
-- return d->extraValues.at(index.row());
-- }
-- else
-- {
-- return QVariant();
-- }
--
-- case ExtraDataDuplicateCount:
-- {
-- qlonglong id = d->infos.at(index.row()).id();
-- return numberOfIndexesForImageId(id);
-- }
-- }
--
-- return QVariant();
--}
--
--QVariant ImageModel::headerData(int section, Qt::Orientation orientation, int role) const
--{
-- Q_UNUSED(section)
-- Q_UNUSED(orientation)
-- Q_UNUSED(role)
-- return QVariant();
--}
--
--int ImageModel::rowCount(const QModelIndex& parent) const
--{
-- if (parent.isValid())
-- {
-- return 0;
-- }
--
-- return d->infos.size();
--}
--
--Qt::ItemFlags ImageModel::flags(const QModelIndex& index) const
--{
-- if (!d->isValid(index))
-- {
-- return 0;
-- }
--
-- Qt::ItemFlags f = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
--
-- f |= dragDropFlags(index);
--
-- return f;
--}
--
--QModelIndex ImageModel::index(int row, int column, const QModelIndex& parent) const
--{
-- if (column != 0 || row < 0 || parent.isValid() || row >= d->infos.size())
-- {
-- return QModelIndex();
-- }
--
-- return createIndex(row, 0);
--}
--
--// ------------ Database watch -------------
--
--void ImageModel::slotImageChange(const ImageChangeset& changeset)
--{
-- if (d->infos.isEmpty())
-- {
-- return;
-- }
--
-- if (d->watchFlags & changeset.changes())
-- {
-- QItemSelection items;
--
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- QModelIndex index = indexForImageId(id);
--
-- if (index.isValid())
-- {
-- items.select(index, index);
-- }
-- }
--
-- if (!items.isEmpty())
-- {
-- emitDataChangedForSelection(items);
-- emit imageChange(changeset, items);
-- }
-- }
--}
--
--void ImageModel::slotImageTagChange(const ImageTagChangeset& changeset)
--{
-- if (d->infos.isEmpty())
-- {
-- return;
-- }
--
-- QItemSelection items;
--
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- QModelIndex index = indexForImageId(id);
--
-- if (index.isValid())
-- {
-- items.select(index, index);
-- }
-- }
--
-- if (!items.isEmpty())
-- {
-- emitDataChangedForSelection(items);
-- emit imageTagChange(changeset, items);
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagemodel.h b/libs/models/imagemodel.h
-deleted file mode 100644
-index dcf94c2..0000000
---- a/libs/models/imagemodel.h
-+++ /dev/null
-@@ -1,364 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEMODEL_H
--#define IMAGEMODEL_H
--
--// Qt includes
--
--#include <QAbstractListModel>
--
--// Local includes
--
--#include "dragdropimplementations.h"
--#include "imageinfo.h"
--#include "digikam_export.h"
--
--class QItemSelection;
--
--namespace Digikam
--{
--
--class ImageChangeset;
--class ImageTagChangeset;
--
--namespace DatabaseFields
--{
--class Set;
--}
--
--class DIGIKAM_DATABASE_EXPORT ImageModel : public QAbstractListModel, public DragDropModelImplementation
--{
-- Q_OBJECT
--
--public:
--
-- enum ImageModelRoles
-- {
-- /// An ImageModel* pointer to this model
-- ImageModelPointerRole = Qt::UserRole,
-- ImageModelInternalId = Qt::UserRole + 1,
-- /// Returns a thumbnail pixmap. May be implemented by subclasses.
-- /// Returns either a valid pixmap or a null QVariant.
-- ThumbnailRole = Qt::UserRole + 2,
-- /// Returns a QDateTime with the creation date
-- CreationDateRole = Qt::UserRole + 3,
-- /// Return (optional) extraData field
-- ExtraDataRole = Qt::UserRole + 5,
-- /// Returns the number of duplicate indexes for the same image id
-- ExtraDataDuplicateCount = Qt::UserRole + 6,
--
-- // Roles which are defined here but not implemented by ImageModel
-- /// Returns position of item in Left Light Table preview.
-- LTLeftPanelRole = Qt::UserRole + 50,
-- /// Returns position of item in Right Light Table preview.
-- LTRightPanelRole = Qt::UserRole + 51,
--
-- // For use by subclasses
-- SubclassRoles = Qt::UserRole + 100,
-- // For use by filter models
-- FilterModelRoles = Qt::UserRole + 500
-- };
--
--public:
--
-- explicit ImageModel(QObject* parent = 0);
-- ~ImageModel();
--
-- /** If a cache is kept, lookup by file path is fast,
-- * without a cache it is O(n). Default is false.
-- */
-- void setKeepsFilePathCache(bool keepCache);
-- bool keepsFilePathCache() const;
--
-- /** Set a set of database fields to watch.
-- * If either of these is changed, dataChanged() will be emitted.
-- * Default is no flag (no signal will be emitted).
-- */
-- void setWatchFlags(const DatabaseFields::Set& set);
--
-- /** Returns the ImageInfo object, reference or image id from the underlying data
-- * pointed to by the index.
-- * If the index is not valid, imageInfo will return a null ImageInfo, imageId will
-- * return 0, imageInfoRef must not be called with an invalid index.
-- */
-- ImageInfo imageInfo(const QModelIndex& index) const;
-- ImageInfo& imageInfoRef(const QModelIndex& index) const;
-- qlonglong imageId(const QModelIndex& index) const;
-- QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-- QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
--
-- /** Returns the ImageInfo object, reference or image id from the underlying data
-- * of the given row (parent is the invalid QModelIndex, column is 0).
-- * Note that imageInfoRef will crash if index is invalid.
-- */
-- ImageInfo imageInfo(int row) const;
-- ImageInfo& imageInfoRef(int row) const;
-- qlonglong imageId(int row) const;
--
-- /** Return the index for the given ImageInfo or id, if contained in this model.
-- */
-- QModelIndex indexForImageInfo(const ImageInfo& info) const;
-- QModelIndex indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const;
-- QModelIndex indexForImageId(qlonglong id) const;
-- QModelIndex indexForImageId(qlonglong id, const QVariant& extraValue) const;
-- QList<QModelIndex> indexesForImageInfo(const ImageInfo& info) const;
-- QList<QModelIndex> indexesForImageId(qlonglong id) const;
--
-- int numberOfIndexesForImageInfo(const ImageInfo& info) const;
-- int numberOfIndexesForImageId(qlonglong id) const;
--
-- /** Returns the index or ImageInfo object from the underlying data
-- * for the given file path. This is fast if keepsFilePathCache is enabled.
-- * The file path is as returned by ImageInfo.filePath().
-- * In case of multiple occurrences of the same file, the simpler variants return
-- * any one found first, use the QList methods to retrieve all occurrences.
-- */
-- QModelIndex indexForPath(const QString& filePath) const;
-- ImageInfo imageInfo(const QString& filePath) const;
-- QList<QModelIndex> indexesForPath(const QString& filePath) const;
-- QList<ImageInfo> imageInfos(const QString& filePath) const;
--
-- /** Main entry point for subclasses adding image infos to the model.
-- * If you list entries not unique per image id, you must add an extraValue
-- * so that every entry is unique by imageId and extraValues.
-- * Please note that these methods do not prevent addition of duplicate entries.
-- */
-- void addImageInfo(const ImageInfo& info);
-- void addImageInfos(const QList<ImageInfo>& infos);
-- void addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /** Clears image infos and resets model.
-- */
-- void clearImageInfos();
--
-- /** Clears and adds the infos.
-- */
-- void setImageInfos(const QList<ImageInfo>& infos);
--
-- /**
-- * Directly remove the given indexes or infos from the model.
-- */
-- void removeIndex(const QModelIndex& indexes);
-- void removeIndexes(const QList<QModelIndex>& indexes);
-- void removeImageInfo(const ImageInfo& info);
-- void removeImageInfos(const QList<ImageInfo>& infos);
-- void removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /**
-- * addImageInfo() is asynchronous if a prepocessor is set.
-- * This method first adds the info, synchronously.
-- * Only afterwards, the preprocessor will have the opportunity to process it.
-- * This method also bypasses any incremental updates.
-- * Please note that these methods do not prevent addition of duplicate entries.
-- */
-- void addImageInfoSynchronously(const ImageInfo& info);
-- void addImageInfosSynchronously(const QList<ImageInfo>& infos);
-- void addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /**
-- * Add the given entries. Method returns immediately, the
-- * addition may happen later asynchronously.
-- * These methods prevent the addition of duplicate entries.
-- */
-- void ensureHasImageInfo(const ImageInfo& info);
-- void ensureHasImageInfos(const QList<ImageInfo>& infos);
-- void ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /**
-- * Ensure that all images grouped on the given leader are contained in the model.
-- */
-- void ensureHasGroupedImages(const ImageInfo& groupLeader);
--
-- QList<ImageInfo> imageInfos() const;
-- QList<qlonglong> imageIds() const;
-- QList<ImageInfo> uniqueImageInfos() const;
--
-- bool hasImage(qlonglong id) const;
-- bool hasImage(const ImageInfo& info) const;
-- bool hasImage(const ImageInfo& info, const QVariant& extraValue) const;
-- bool hasImage(qlonglong id, const QVariant& extraValue) const;
--
-- bool isEmpty() const;
--
-- // Drag and Drop
-- DECLARE_MODEL_DRAG_DROP_METHODS
--
-- /**
-- * Install an object as a preprocessor for ImageInfos added to this model.
-- * For every QList of ImageInfos added to addImageInfo, the signal preprocess()
-- * will be emitted. The preprocessor may process the items and shall then readd
-- * them by calling reAddImageInfos(). It may take some time to process.
-- * It shall discard any held infos when the modelReset() signal is sent.
-- * It shall call readdFinished() when no reset occurred and all infos on the way have been readded.
-- * This means that only after calling this method, you shall make three connections
-- * (preprocess -> your slot, your signal -> reAddImageInfos, your signal -> reAddingFinished)
-- * and make or already hold a connection modelReset() -> your slot.
-- * There is only one preprocessor at a time, a previously set object will be disconnected.
-- */
-- void setPreprocessor(QObject* processor);
-- void unsetPreprocessor(QObject* processor);
--
-- /**
-- * Returns true if this model is currently refreshing.
-- * For a preprocessor this means that, although the preprocessor may currently have
-- * processed all it got, more batches are to be expected.
-- */
-- bool isRefreshing() const;
--
-- /**
-- * Enable sending of imageInfosAboutToBeRemoved and imageInfosRemoved signals.
-- * Default: false
-- */
-- void setSendRemovalSignals(bool send);
--
-- virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-- virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
-- virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
-- virtual Qt::ItemFlags flags(const QModelIndex& index) const;
-- virtual QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const;
--
-- /** Retrieves the imageInfo object from the data() method of the given index.
-- * The index may be from a QSortFilterProxyModel as long as an ImageModel is at the end. */
-- static ImageInfo retrieveImageInfo(const QModelIndex& index);
-- static qlonglong retrieveImageId(const QModelIndex& index);
--
--Q_SIGNALS:
--
-- /** Informs that ImageInfos will be added to the model.
-- * This signal is sent before the model data is changed and views are informed.
-- */
-- void imageInfosAboutToBeAdded(const QList<ImageInfo>& infos);
--
-- /** Informs that ImageInfos have been added to the model.
-- * This signal is sent after the model data is changed and views are informed.
-- */
-- void imageInfosAdded(const QList<ImageInfo>& infos);
--
-- /** Informs that ImageInfos will be removed from the model.
-- * This signal is sent before the model data is changed and views are informed.
-- * Note: You need to explicitly enable sending of this signal. It is not sent
-- * in clearImageInfos().
-- */
-- void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
--
-- /** Informs that ImageInfos have been removed from the model.
-- * This signal is sent after the model data is changed and views are informed. *
-- * Note: You need to explicitly enable sending of this signal. It is not sent
-- * in clearImageInfos().
-- */
-- void imageInfosRemoved(const QList<ImageInfo>& infos);
--
-- /** Connect to this signal only if you are the current preprocessor.
-- */
-- void preprocess(const QList<ImageInfo>& infos, const QList<QVariant>&);
-- void processAdded(const QList<ImageInfo>& infos, const QList<QVariant>&);
--
-- /** If an ImageChangeset affected indexes of this model with changes as set in watchFlags(),
-- * this signal contains the changeset and the affected indexes.
-- */
-- void imageChange(const ImageChangeset&, const QItemSelection&);
--
-- /** If an ImageTagChangeset affected indexes of this model,
-- * this signal contains the changeset and the affected indexes.
-- */
-- void imageTagChange(const ImageTagChangeset&, const QItemSelection&);
--
-- /** Signals that the model is right now ready to start an incremental refresh.
-- * This is guaranteed only for the scope of emitting this signal.
-- */
-- void readyForIncrementalRefresh();
--
-- /** Signals that the model has finished currently with all scheduled
-- * refreshing, full or incremental, and all preprocessing.
-- * The model is in polished, clean situation right now.
-- */
-- void allRefreshingFinished();
--
--public Q_SLOTS:
--
-- void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void reAddingFinished();
--
--protected:
--
-- /** Subclasses that add ImageInfos in batches shall call startRefresh()
-- * when they start sending batches and finishRefresh() when they have finished.
-- * No incremental refreshes will be started while listing.
-- * A clearImageInfos() always stops listing, calling finishRefresh() is then not necessary.
-- */
-- void startRefresh();
-- void finishRefresh();
--
-- /** As soon as the model is ready to start an incremental refresh, the signal
-- * readyForIncrementalRefresh() will be emitted. The signal will be emitted inline
-- * if the model is ready right now.
-- */
-- void requestIncrementalRefresh();
-- bool hasIncrementalRefreshPending() const;
--
-- /** Starts an incremental refresh operation. You shall only call this method from a slot
-- * connected to readyForIncrementalRefresh(). To initiate an incremental refresh,
-- * call requestIncrementalRefresh().
-- */
-- void startIncrementalRefresh();
-- void finishIncrementalRefresh();
--
-- void emitDataChangedForAll();
-- void emitDataChangedForSelection(const QItemSelection& selection);
--
-- // Called when the internal storage is cleared
-- virtual void imageInfosCleared() {};
--
-- // Called before rowsAboutToBeRemoved
-- virtual void imageInfosAboutToBeRemoved(int /*begin*/, int /*end*/) {};
--
--protected Q_SLOTS:
--
-- virtual void slotImageChange(const ImageChangeset& changeset);
-- virtual void slotImageTagChange(const ImageTagChangeset& changeset);
--
--private:
--
-- void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void cleanSituationChecks();
-- void removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove);
-- void removeRowPairs(const QList<QPair<int, int> >& toRemove);
--
--public:
--
-- // Declared public because it's used in ImageModelIncrementalUpdater class
-- class Private;
--
--private:
--
-- Private* const d;
--};
--
--} // namespace Digikam
--
--Q_DECLARE_METATYPE(Digikam::ImageModel*)
--
--#endif // IMAGEMODEL_H
-diff --git a/libs/models/imagesortsettings.cpp b/libs/models/imagesortsettings.cpp
-deleted file mode 100644
-index 39ee6e1..0000000
---- a/libs/models/imagesortsettings.cpp
-+++ /dev/null
-@@ -1,400 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Filter values for use with ImageFilterModel
-- *
-- * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagesortsettings.h"
--
--// Qt includes
--
--#include <QDateTime>
--#include <QRectF>
--
--// Local includes
--
--#include "coredbfields.h"
--#include "imageinfo.h"
--
--namespace Digikam
--{
--
--ImageSortSettings::ImageSortSettings()
--{
-- categorizationMode = NoCategories;
-- categorizationSortOrder = DefaultOrder;
-- categorizationCaseSensitivity = Qt::CaseSensitive;
-- sortRole = SortByFileName;
-- sortOrder = DefaultOrder;
-- strTypeNatural = true;
-- sortCaseSensitivity = Qt::CaseSensitive;
-- currentCategorizationSortOrder = Qt::AscendingOrder;
-- currentSortOrder = Qt::AscendingOrder;
--}
--
--bool ImageSortSettings::operator==(const ImageSortSettings& other) const
--{
-- return
-- categorizationMode == other.categorizationMode &&
-- categorizationSortOrder == other.categorizationSortOrder &&
-- categorizationCaseSensitivity == other.categorizationCaseSensitivity &&
-- sortRole == other.sortRole &&
-- sortOrder == other.sortOrder &&
-- sortCaseSensitivity == other.sortCaseSensitivity;
--}
--
--void ImageSortSettings::setCategorizationMode(CategorizationMode mode)
--{
-- categorizationMode = mode;
--
-- if (categorizationSortOrder == DefaultOrder)
-- {
-- currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-- }
--}
--
--void ImageSortSettings::setCategorizationSortOrder(SortOrder order)
--{
-- categorizationSortOrder = order;
--
-- if (categorizationSortOrder == DefaultOrder)
-- {
-- currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-- }
-- else
-- {
-- currentCategorizationSortOrder = (Qt::SortOrder)categorizationSortOrder;
-- }
--}
--
--void ImageSortSettings::setSortRole(SortRole role)
--{
-- sortRole = role;
--
-- if (sortOrder == DefaultOrder)
-- {
-- currentSortOrder = defaultSortOrderForSortRole(sortRole);
-- }
--}
--
--void ImageSortSettings::setSortOrder(SortOrder order)
--{
-- sortOrder = order;
--
-- if (sortOrder == DefaultOrder)
-- {
-- currentSortOrder = defaultSortOrderForSortRole(sortRole);
-- }
-- else
-- {
-- currentSortOrder = (Qt::SortOrder)order;
-- }
--}
--
--void ImageSortSettings::setStringTypeNatural(bool natural)
--{
-- strTypeNatural = natural;
--}
--
--Qt::SortOrder ImageSortSettings::defaultSortOrderForCategorizationMode(CategorizationMode mode)
--{
-- switch (mode)
-- {
-- case NoCategories:
-- case OneCategory:
-- case CategoryByAlbum:
-- case CategoryByFormat:
-- default:
-- return Qt::AscendingOrder;
-- }
--}
--
--Qt::SortOrder ImageSortSettings::defaultSortOrderForSortRole(SortRole role)
--{
-- switch (role)
-- {
-- case SortByFileName:
-- case SortByFilePath:
-- return Qt::AscendingOrder;
-- case SortByFileSize:
-- return Qt::DescendingOrder;
-- case SortByModificationDate:
-- case SortByCreationDate:
-- return Qt::AscendingOrder;
-- case SortByRating:
-- case SortByImageSize:
-- return Qt::DescendingOrder;
-- case SortByAspectRatio:
-- return Qt::DescendingOrder;
-- case SortBySimilarity:
-- return Qt::DescendingOrder;
-- default:
-- return Qt::AscendingOrder;
-- }
--}
--
--int ImageSortSettings::compareCategories(const ImageInfo& left, const ImageInfo& right) const
--{
-- switch (categorizationMode)
-- {
-- case NoCategories:
-- case OneCategory:
-- return 0;
-- case CategoryByAlbum:
-- {
-- int leftAlbum = left.albumId();
-- int rightAlbum = right.albumId();
--
-- // return comparation result
-- if (leftAlbum == rightAlbum)
-- {
-- return 0;
-- }
-- else if (lessThanByOrder(leftAlbum, rightAlbum, currentCategorizationSortOrder))
-- {
-- return -1;
-- }
-- else
-- {
-- return 1;
-- }
-- }
-- case CategoryByFormat:
-- {
-- return naturalCompare(left.format(), right.format(),
-- currentCategorizationSortOrder, categorizationCaseSensitivity, strTypeNatural);
-- }
-- default:
-- return 0;
-- }
--}
--
--bool ImageSortSettings::lessThan(const ImageInfo& left, const ImageInfo& right) const
--{
-- int result = compare(left, right, sortRole);
--
-- if (result != 0)
-- {
-- return result < 0;
-- }
--
-- // are they identical?
-- if (left == right)
-- {
-- return false;
-- }
--
-- // If left and right equal for first sort order, use a hierarchy of all sort orders
-- if ( (result = compare(left, right, SortByFileName)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByCreationDate)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByModificationDate)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByFilePath)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByFileSize)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortBySimilarity)) != 0)
-- {
-- return result < 0;
-- }
--
-- return false;
--}
--
--int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right) const
--{
-- return compare(left, right, sortRole);
--}
--
--int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right, SortRole role) const
--{
-- switch (role)
-- {
-- case SortByFileName:
-- {
-- bool versioning = (left.name().contains(QLatin1String("_v"), Qt::CaseInsensitive) ||
-- right.name().contains(QLatin1String("_v"), Qt::CaseInsensitive));
-- return naturalCompare(left.name(), right.name(), currentSortOrder, sortCaseSensitivity, strTypeNatural, versioning);
-- }
-- case SortByFilePath:
-- return naturalCompare(left.filePath(), right.filePath(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-- case SortByFileSize:
-- return compareByOrder(left.fileSize(), right.fileSize(), currentSortOrder);
-- case SortByModificationDate:
-- return compareByOrder(left.modDateTime(), right.modDateTime(), currentSortOrder);
-- case SortByCreationDate:
-- return compareByOrder(left.dateTime(), right.dateTime(), currentSortOrder);
-- case SortByRating:
-- // I have the feeling that inverting the sort order for rating is the natural order
-- return - compareByOrder(left.rating(), right.rating(), currentSortOrder);
-- case SortByImageSize:
-- {
-- QSize leftSize = left.dimensions();
-- QSize rightSize = right.dimensions();
-- int leftPixels = leftSize.width() * leftSize.height();
-- int rightPixels = rightSize.width() * rightSize.height();
-- return compareByOrder(leftPixels, rightPixels, currentSortOrder);
-- }
-- case SortByAspectRatio:
-- {
-- QSize leftSize = left.dimensions();
-- QSize rightSize = right.dimensions();
-- int leftAR = (double(leftSize.width()) / double(leftSize.height())) * 1000000;
-- int rightAR = (double(rightSize.width()) / double(rightSize.height())) * 1000000;
-- return compareByOrder(leftAR, rightAR, currentSortOrder);
-- }
-- case SortBySimilarity:
-- {
-- qlonglong leftReferenceImageId = left.currentReferenceImage();
-- qlonglong rightReferenceImageId = right.currentReferenceImage();
-- // make sure that the original image has always the highest similarity.
-- double leftSimilarity = left.id() == leftReferenceImageId ? 1.1 : left.currentSimilarity();
-- double rightSimilarity = right.id() == rightReferenceImageId ? 1.1 : right.currentSimilarity();
-- return compareByOrder(leftSimilarity, rightSimilarity, currentSortOrder);
-- }
-- default:
-- return 1;
-- }
--}
--
--bool ImageSortSettings::lessThan(const QVariant& left, const QVariant& right) const
--{
-- if (left.type() != right.type())
-- {
-- return false;
-- }
--
-- switch (left.type())
-- {
-- case QVariant::Int:
-- return compareByOrder(left.toInt(), right.toInt(), currentSortOrder);
-- case QVariant::UInt:
-- return compareByOrder(left.toUInt(), right.toUInt(), currentSortOrder);
-- case QVariant::LongLong:
-- return compareByOrder(left.toLongLong(), right.toLongLong(), currentSortOrder);
-- case QVariant::ULongLong:
-- return compareByOrder(left.toULongLong(), right.toULongLong(), currentSortOrder);
-- case QVariant::Double:
-- return compareByOrder(left.toDouble(), right.toDouble(), currentSortOrder);
-- case QVariant::Date:
-- return compareByOrder(left.toDate(), right.toDate(), currentSortOrder);
-- case QVariant::DateTime:
-- return compareByOrder(left.toDateTime(), right.toDateTime(), currentSortOrder);
-- case QVariant::Time:
-- return compareByOrder(left.toTime(), right.toTime(), currentSortOrder);
-- case QVariant::Rect:
-- case QVariant::RectF:
-- {
-- QRectF rectLeft = left.toRectF();
-- QRectF rectRight = right.toRectF();
-- int result;
--
-- if ((result = compareByOrder(rectLeft.top(), rectRight.top(), currentSortOrder)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ((result = compareByOrder(rectLeft.left(), rectRight.left(), currentSortOrder)) != 0)
-- {
-- return result < 0;
-- }
--
-- QSizeF sizeLeft = rectLeft.size(), sizeRight = rectRight.size();
--
-- if ((result = compareByOrder(sizeLeft.width()*sizeLeft.height(), sizeRight.width()*sizeRight.height(), currentSortOrder)) != 0)
-- {
-- return result < 0;
-- }
-- // FIXME: fall through?? If not, add "break" here
-- }
-- default:
-- return naturalCompare(left.toString(), right.toString(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-- }
--}
--
--DatabaseFields::Set ImageSortSettings::watchFlags() const
--{
-- DatabaseFields::Set set;
--
-- switch (sortRole)
-- {
-- case SortByFileName:
-- set |= DatabaseFields::Name;
-- break;
-- case SortByFilePath:
-- set |= DatabaseFields::Name;
-- break;
-- case SortByFileSize:
-- set |= DatabaseFields::FileSize;
-- break;
-- case SortByModificationDate:
-- set |= DatabaseFields::ModificationDate;
-- break;
-- case SortByCreationDate:
-- set |= DatabaseFields::CreationDate;
-- break;
-- case SortByRating:
-- set |= DatabaseFields::Rating;
-- break;
-- case SortByImageSize:
-- set |= DatabaseFields::Width | DatabaseFields::Height;
-- break;
-- case SortByAspectRatio:
-- set |= DatabaseFields::Width | DatabaseFields::Height;
-- break;
-- case SortBySimilarity:
-- // TODO: Not sure what to do here....
-- set |= DatabaseFields::Name;
-- break;
-- }
--
-- switch (categorizationMode)
-- {
-- case NoCategories:
-- case OneCategory:
-- case CategoryByAlbum:
-- break;
-- case CategoryByFormat:
-- set |= DatabaseFields::Format;
-- break;
-- }
--
-- return set;
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagesortsettings.h b/libs/models/imagesortsettings.h
-deleted file mode 100644
-index 2a5fd8c..0000000
---- a/libs/models/imagesortsettings.h
-+++ /dev/null
-@@ -1,225 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-05-31
-- * Description : Sort settings for use with ImageFilterModel
-- *
-- * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGESORTSETTINGS_H
--#define IMAGESORTSETTINGS_H
--
--// Qt includes
--
--#include <QHash>
--#include <QList>
--#include <QMap>
--#include <QString>
--#include <QCollator>
--
--// Local includes
--
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageInfo;
--
--namespace DatabaseFields
--{
-- class Set;
--}
--
--class DIGIKAM_DATABASE_EXPORT ImageSortSettings
--{
--public:
--
-- ImageSortSettings();
--
-- bool operator==(const ImageSortSettings& other) const;
--
-- /** Compares the categories of left and right.
-- * Return -1 if left is less than right, 0 if both fall in the same category,
-- * and 1 if left is greater than right.
-- * Adheres to set categorization mode and current category sort order.
-- */
-- int compareCategories(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Returns true if left is less than right.
-- * Adheres to current sort role and sort order.
-- */
-- bool lessThan(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Compares the ImageInfos left and right.
-- * Return -1 if left is less than right, 1 if left is greater than right,
-- * and 0 if left equals right comparing the current sort role's value.
-- * Adheres to set sort role and sort order.
-- */
-- int compare(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Returns true if left QVariant is less than right.
-- * Adheres to current sort role and sort order.
-- * Use for extraValue, if necessary.
-- */
-- bool lessThan(const QVariant& left, const QVariant& right) const;
--
-- enum SortOrder
-- {
-- AscendingOrder = Qt::AscendingOrder,
-- DescendingOrder = Qt::DescendingOrder,
-- DefaultOrder /// sort order depends on the chosen sort role
-- };
--
-- /// --- Categories ---
--
-- enum CategorizationMode
-- {
-- NoCategories, /// categorization switched off
-- OneCategory, /// all items in one global category
-- CategoryByAlbum,
-- CategoryByFormat
-- };
--
-- CategorizationMode categorizationMode;
-- SortOrder categorizationSortOrder;
--
-- void setCategorizationMode(CategorizationMode mode);
-- void setCategorizationSortOrder(SortOrder order);
--
-- /// Only Ascending or Descending, never DefaultOrder
-- Qt::SortOrder currentCategorizationSortOrder;
-- Qt::CaseSensitivity categorizationCaseSensitivity;
--
-- bool isCategorized() const { return categorizationMode >= CategoryByAlbum; }
--
-- /// --- Image Sorting ---
--
-- enum SortRole
-- {
-- // Note: For legacy reasons, the order of the first five entries must remain unchanged
-- SortByFileName,
-- SortByFilePath,
-- SortByCreationDate,
-- SortByFileSize,
-- SortByRating,
-- SortByModificationDate,
-- SortByImageSize, // pixel number
-- SortByAspectRatio, // width / height * 100000
-- SortBySimilarity
-- };
--
-- SortRole sortRole;
-- SortOrder sortOrder;
-- bool strTypeNatural;
--
-- void setSortRole(SortRole role);
-- void setSortOrder(SortOrder order);
-- void setStringTypeNatural(bool natural);
--
-- Qt::SortOrder currentSortOrder;
-- Qt::CaseSensitivity sortCaseSensitivity;
--
-- int compare(const ImageInfo& left, const ImageInfo& right, SortRole sortRole) const;
--
-- // --- ---
--
-- static Qt::SortOrder defaultSortOrderForCategorizationMode(CategorizationMode mode);
-- static Qt::SortOrder defaultSortOrderForSortRole(SortRole role);
--
-- /// --- Change notification ---
--
-- /** Returns database fields a change in which would affect the current sorting.
-- */
-- DatabaseFields::Set watchFlags() const;
--
-- /// --- Utilities ---
--
-- /** Returns a < b if sortOrder is Ascending, or b < a if order is descending.
-- */
-- template <typename T>
-- static inline bool lessThanByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-- {
-- if (sortOrder == Qt::AscendingOrder)
-- {
-- return a < b;
-- }
-- else
-- {
-- return b < a;
-- }
-- }
--
-- /** Returns the usual compare result of -1, 0, or 1 for lessThan, equals and greaterThan.
-- */
-- template <typename T>
-- static inline int compareValue(const T& a, const T& b)
-- {
-- if (a == b)
-- {
-- return 0;
-- }
--
-- if (a < b)
-- {
-- return -1;
-- }
-- else
-- {
-- return 1;
-- }
-- }
--
-- /** Takes a typical result from a compare method (0 is equal, -1 is less than, 1 is greater than)
-- * and applies the given sort order to it.
-- */
-- static inline int compareByOrder(int compareResult, Qt::SortOrder sortOrder)
-- {
-- if (sortOrder == Qt::AscendingOrder)
-- {
-- return compareResult;
-- }
-- else
-- {
-- return - compareResult;
-- }
-- }
--
-- template <typename T>
-- static inline int compareByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-- {
-- return compareByOrder(compareValue(a, b), sortOrder);
-- }
--
-- /** Compares the two string by natural comparison and adheres to given sort order
-- */
-- static inline int naturalCompare(const QString& a, const QString& b, Qt::SortOrder sortOrder,
-- Qt::CaseSensitivity caseSensitive = Qt::CaseSensitive,
-- bool natural = true, bool versioning = false)
-- {
-- QCollator collator;
-- collator.setNumericMode(natural);
-- collator.setIgnorePunctuation(versioning);
-- collator.setCaseSensitivity(caseSensitive);
-- return (compareByOrder(collator.compare(a, b), sortOrder));
-- }
--};
--
--} // namespace Digikam
--
--#endif // IMAGESORTSETTINGS_H
-diff --git a/libs/models/imagethumbnailmodel.cpp b/libs/models/imagethumbnailmodel.cpp
-deleted file mode 100644
-index b7f5661..0000000
---- a/libs/models/imagethumbnailmodel.cpp
-+++ /dev/null
-@@ -1,323 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries with support for thumbnail loading
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagethumbnailmodel.h"
--
--// Qt includes
--
--#include <QHash>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "thumbnailloadthread.h"
--#include "digikam_export.h"
--#include "digikam_globals.h"
--
--namespace Digikam
--{
--
--class ImageThumbnailModel::ImageThumbnailModelPriv
--{
--public:
--
-- ImageThumbnailModelPriv() :
-- thread(0),
-- preloadThread(0),
-- thumbSize(0),
-- lastGlobalThumbSize(0),
-- preloadThumbSize(0),
-- emitDataChanged(true)
-- {
-- staticListContainingThumbnailRole << ImageModel::ThumbnailRole;
-- }
--
-- ThumbnailLoadThread* thread;
-- ThumbnailLoadThread* preloadThread;
-- ThumbnailSize thumbSize;
-- ThumbnailSize lastGlobalThumbSize;
-- ThumbnailSize preloadThumbSize;
-- QRect detailRect;
-- QVector<int> staticListContainingThumbnailRole;
--
-- bool emitDataChanged;
--
-- int preloadThumbnailSize() const
-- {
-- if (preloadThumbSize.size())
-- {
-- return preloadThumbSize.size();
-- }
--
-- return thumbSize.size();
-- }
--};
--
--ImageThumbnailModel::ImageThumbnailModel(QObject* parent)
-- : ImageModel(parent), d(new ImageThumbnailModelPriv)
--{
-- setKeepsFilePathCache(true);
--}
--
--ImageThumbnailModel::~ImageThumbnailModel()
--{
-- delete d->preloadThread;
-- delete d;
--}
--
--void ImageThumbnailModel::setThumbnailLoadThread(ThumbnailLoadThread* thread)
--{
-- d->thread = thread;
--
-- connect(d->thread, SIGNAL(signalThumbnailLoaded(LoadingDescription,QPixmap)),
-- this, SLOT(slotThumbnailLoaded(LoadingDescription,QPixmap)));
--}
--
--ThumbnailLoadThread* ImageThumbnailModel::thumbnailLoadThread() const
--{
-- return d->thread;
--}
--
--ThumbnailSize ImageThumbnailModel::thumbnailSize() const
--{
-- return d->thumbSize;
--}
--
--void ImageThumbnailModel::setThumbnailSize(const ThumbnailSize& size)
--{
-- d->lastGlobalThumbSize = size;
-- d->thumbSize = size;
--}
--
--void ImageThumbnailModel::setPreloadThumbnailSize(const ThumbnailSize& size)
--{
-- d->preloadThumbSize = size;
--}
--
--void ImageThumbnailModel::setEmitDataChanged(bool emitSignal)
--{
-- d->emitDataChanged = emitSignal;
--}
--
--void ImageThumbnailModel::setPreloadThumbnails(bool preload)
--{
-- if (preload)
-- {
-- if (!d->preloadThread)
-- {
-- d->preloadThread = new ThumbnailLoadThread;
-- d->preloadThread->setPixmapRequested(false);
-- d->preloadThread->setPriority(QThread::LowestPriority);
-- }
--
-- connect(this, SIGNAL(allRefreshingFinished()),
-- this, SLOT(preloadAllThumbnails()));
-- }
-- else
-- {
-- delete d->preloadThread;
-- d->preloadThread = 0;
-- disconnect(this, SIGNAL(allRefreshingFinished()),
-- this, SLOT(preloadAllThumbnails()));
-- }
--}
--
--void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare)
--{
-- prepareThumbnails(indexesToPrepare, d->thumbSize);
--}
--
--void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize)
--{
-- if (!d->thread)
-- {
-- return;
-- }
--
-- QList<ThumbnailIdentifier> ids;
-- foreach(const QModelIndex& index, indexesToPrepare)
-- {
-- ids << imageInfoRef(index).thumbnailIdentifier();
-- }
-- d->thread->findGroup(ids, thumbSize.size());
--}
--
--void ImageThumbnailModel::preloadThumbnails(const QList<ImageInfo>& infos)
--{
-- if (!d->preloadThread)
-- {
-- return;
-- }
--
-- QList<ThumbnailIdentifier> ids;
-- foreach(const ImageInfo& info, infos)
-- {
-- ids << info.thumbnailIdentifier();
-- }
-- d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
--}
--
--void ImageThumbnailModel::preloadThumbnails(const QList<QModelIndex>& indexesToPreload)
--{
-- if (!d->preloadThread)
-- {
-- return;
-- }
--
-- QList<ThumbnailIdentifier> ids;
-- foreach(const QModelIndex& index, indexesToPreload)
-- {
-- ids << imageInfoRef(index).thumbnailIdentifier();
-- }
-- d->preloadThread->stopAllTasks();
-- d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
--}
--
--void ImageThumbnailModel::preloadAllThumbnails()
--{
-- preloadThumbnails(imageInfos());
--}
--
--void ImageThumbnailModel::imageInfosCleared()
--{
-- if (d->preloadThread)
-- {
-- d->preloadThread->stopAllTasks();
-- }
--}
--
--QVariant ImageThumbnailModel::data(const QModelIndex& index, int role) const
--{
-- if (role == ThumbnailRole && d->thread && index.isValid())
-- {
-- QPixmap thumbnail;
-- ImageInfo info = imageInfo(index);
-- QString path = info.filePath();
--
-- if (info.isNull())
-- {
-- return QVariant(QVariant::Pixmap);
-- }
--
-- if (!d->detailRect.isNull())
-- {
-- if (d->thread->find(info.thumbnailIdentifier(), d->detailRect, thumbnail, d->thumbSize.size()))
-- {
-- return thumbnail;
-- }
-- }
-- else
-- {
-- if (d->thread->find(info.thumbnailIdentifier(), thumbnail, d->thumbSize.size()))
-- {
-- return thumbnail;
-- }
-- }
--
-- return QVariant(QVariant::Pixmap);
-- }
--
-- return ImageModel::data(index, role);
--}
--
--bool ImageThumbnailModel::setData(const QModelIndex& index, const QVariant& value, int role)
--{
-- if (role == ThumbnailRole)
-- {
-- switch (value.type())
-- {
-- case QVariant::Invalid:
-- d->thumbSize = d->lastGlobalThumbSize;
-- d->detailRect = QRect();
-- break;
--
-- case QVariant::Int:
--
-- if (value.isNull())
-- {
-- d->thumbSize = d->lastGlobalThumbSize;
-- }
-- else
-- {
-- d->thumbSize = value.toInt();
-- }
-- break;
--
-- case QVariant::Rect:
--
-- if (value.isNull())
-- {
-- d->detailRect = QRect();
-- }
-- else
-- {
-- d->detailRect = value.toRect();
-- }
-- break;
--
-- default:
-- break;
-- }
-- }
--
-- return ImageModel::setData(index, value, role);
--}
--
--void ImageThumbnailModel::slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb)
--{
-- if (thumb.isNull())
-- {
-- return;
-- }
--
-- // In case of multiple occurrence, we currently do not know which thumbnail is this. Signal change on all.
-- QModelIndexList indexes;
-- ThumbnailIdentifier thumbId = loadingDescription.thumbnailIdentifier();
-- if (thumbId.filePath.isEmpty())
-- {
-- indexes = indexesForImageId(thumbId.id);
-- }
-- else
-- {
-- indexes = indexesForPath(thumbId.filePath);
-- }
-- foreach(const QModelIndex& index, indexes)
-- {
-- if (thumb.isNull())
-- {
-- emit thumbnailFailed(index, loadingDescription.previewParameters.size);
-- }
-- else
-- {
-- emit thumbnailAvailable(index, loadingDescription.previewParameters.size);
--
-- if (d->emitDataChanged)
-- {
-- emit dataChanged(index, index, d->staticListContainingThumbnailRole);
-- }
-- }
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagethumbnailmodel.h b/libs/models/imagethumbnailmodel.h
-deleted file mode 100644
-index 366ca65..0000000
---- a/libs/models/imagethumbnailmodel.h
-+++ /dev/null
-@@ -1,140 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries with support for thumbnail loading
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGETHUMBNAILMODEL_H
--#define IMAGETHUMBNAILMODEL_H
--
--// Local includes
--
--#include "imagemodel.h"
--#include "thumbnailsize.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class LoadingDescription;
--class ThumbnailLoadThread;
--
--class DIGIKAM_DATABASE_EXPORT ImageThumbnailModel : public ImageModel
--{
-- Q_OBJECT
--
--public:
--
-- /**
-- * An ImageModel that supports thumbnail loading.
-- * You need to set a ThumbnailLoadThread to enable thumbnail loading.
-- * Adjust the thumbnail size to your needs.
-- * Note that setKeepsFilePathCache is enabled per default.
-- */
-- explicit ImageThumbnailModel(QObject* parent);
-- ~ImageThumbnailModel();
--
-- /** Enable thumbnail loading and set the thread that shall be used.
-- * The thumbnail size of this thread will be adjusted.
-- */
-- void setThumbnailLoadThread(ThumbnailLoadThread* thread);
-- ThumbnailLoadThread* thumbnailLoadThread() const;
--
-- /// Set the thumbnail size to use
-- void setThumbnailSize(const ThumbnailSize& thumbSize);
--
-- /// If you want to fix a size for preloading, do it here.
-- void setPreloadThumbnailSize(const ThumbnailSize& thumbSize);
--
-- void setExifRotate(bool rotate);
--
-- /**
-- * Enable emitting dataChanged() when a thumbnail becomes available.
-- * The thumbnailAvailable() signal will be emitted in any case.
-- * Default is true.
-- */
-- void setEmitDataChanged(bool emitSignal);
--
-- /**
-- * Enable preloading of thumbnails:
-- * If preloading is enabled, for every entry in the model a thumbnail generation is started.
-- * Default: false.
-- */
-- void setPreloadThumbnails(bool preload);
--
-- ThumbnailSize thumbnailSize() const;
--
-- /**
-- * Handles the ThumbnailRole.
-- * If the pixmap is available, returns it in the QVariant.
-- * If it still needs to be loaded, returns a null QVariant and emits
-- * thumbnailAvailable() as soon as it is available.
-- */
-- virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
--
-- /**
-- * You can override the current thumbnail size by giving an integer value for ThumbnailRole.
-- * Set a null QVariant to use the thumbnail size set by setThumbnailSize() again.
-- * The index given here is ignored for this purpose.
-- */
-- virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::DisplayRole);
--
--public Q_SLOTS:
--
-- /** Prepare the thumbnail loading for the given indexes
-- */
-- void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare);
-- void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize);
--
-- /**
-- * Preload thumbnail for the given infos resp. indexes.
-- * Note: Use setPreloadThumbnails to automatically preload all entries in the model.
-- * Note: This only ensures thumbnail generation. It is not guaranteed that pixmaps
-- * are stored in the cache. For thumbnails that are expect to be drawn immediately,
-- * include them in prepareThumbnails().
-- * Note: Stops preloading of previously added thumbnails.
-- */
-- void preloadThumbnails(const QList<ImageInfo>&);
-- void preloadThumbnails(const QList<QModelIndex>&);
-- void preloadAllThumbnails();
--
--Q_SIGNALS:
--
-- void thumbnailAvailable(const QModelIndex& index, int requestedSize);
-- void thumbnailFailed(const QModelIndex& index, int requestedSize);
--
--protected:
--
-- virtual void imageInfosCleared();
--
--protected Q_SLOTS:
--
-- void slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb);
--
--private:
--
-- class ImageThumbnailModelPriv;
-- ImageThumbnailModelPriv* const d;
--};
--
--} // namespace Digikam
--
--#endif /* IMAGETHUMBNAILMODEL_H */
-diff --git a/libs/models/imageversionsmodel.cpp b/libs/models/imageversionsmodel.cpp
-deleted file mode 100644
-index e6ba582..0000000
---- a/libs/models/imageversionsmodel.cpp
-+++ /dev/null
-@@ -1,183 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-07-13
-- * Description : Model for image versions
-- *
-- * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imageversionsmodel.h"
--
--// KDE includes
--
--#include <klocalizedstring.h>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "workingwidget.h"
--
--namespace Digikam
--{
--
--class ImageVersionsModel::Private
--{
--public:
--
-- Private()
-- {
-- data = 0;
-- paintTree = false;
-- }
--
-- ///Complete paths with filenames and tree level
-- QList<QPair<QString, int> >* data;
-- ///This is for delegate to paint it as selected
-- QString currentSelectedImage;
-- ///If true, the delegate will paint items as a tree
-- ///if false, it will be painted as a list
-- bool paintTree;
--};
--
--ImageVersionsModel::ImageVersionsModel(QObject* parent)
-- : QAbstractListModel(parent),
-- d(new Private)
--{
-- d->data = new QList<QPair<QString, int> >;
--}
--
--ImageVersionsModel::~ImageVersionsModel()
--{
-- //qDeleteAll(d->data);
-- delete d;
--}
--
--Qt::ItemFlags ImageVersionsModel::flags(const QModelIndex& index) const
--{
-- if (!index.isValid())
-- {
-- return 0;
-- }
--
-- return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
--}
--
--QVariant ImageVersionsModel::data(const QModelIndex& index, int role) const
--{
-- if (!index.isValid())
-- {
-- return QVariant();
-- }
--
-- if (role == Qt::DisplayRole && !d->data->isEmpty())
-- {
-- return d->data->at(index.row()).first;
-- }
-- else if (role == Qt::UserRole && !d->data->isEmpty())
-- {
-- return d->data->at(index.row()).second;
-- }
-- else if (role == Qt::DisplayRole && d->data->isEmpty())
-- {
-- //TODO: make this text Italic
-- return QVariant(QString(i18n("No image selected")));
-- }
--
-- return QVariant();
--}
--
--int ImageVersionsModel::rowCount(const QModelIndex& parent) const
--{
-- Q_UNUSED(parent)
-- return d->data->count();
--}
--
--void ImageVersionsModel::setupModelData(QList<QPair<QString, int> >& data)
--{
-- beginResetModel();
--
-- d->data->clear();
--
-- if (!data.isEmpty())
-- {
-- d->data->append(data);
-- }
-- else
-- {
-- d->data->append(qMakePair(QString(i18n("This is the original image")), 0));
-- }
--
-- endResetModel();
--}
--
--void ImageVersionsModel::clearModelData()
--{
-- beginResetModel();
--
-- if (!d->data->isEmpty())
-- {
-- d->data->clear();
-- }
--
-- endResetModel();
--}
--
--void ImageVersionsModel::slotAnimationStep()
--{
-- emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, 1));
--}
--
--QString ImageVersionsModel::currentSelectedImage() const
--{
-- return d->currentSelectedImage;
--}
--
--void ImageVersionsModel::setCurrentSelectedImage(const QString& path)
--{
-- d->currentSelectedImage = path;
--}
--
--QModelIndex ImageVersionsModel::currentSelectedImageIndex() const
--{
-- return index(listIndexOf(d->currentSelectedImage), 0);
--}
--
--bool ImageVersionsModel::paintTree() const
--{
-- return d->paintTree;
--}
--
--void ImageVersionsModel::setPaintTree(bool paint)
--{
-- d->paintTree = paint;
--}
--
--int ImageVersionsModel::listIndexOf(const QString& item) const
--{
-- for (int i = 0; i < d->data->size(); ++i)
-- {
-- if (d->data->at(i).first == item)
-- {
-- return i;
-- }
-- }
--
-- return -1;
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imageversionsmodel.h b/libs/models/imageversionsmodel.h
-deleted file mode 100644
-index ed08529..0000000
---- a/libs/models/imageversionsmodel.h
-+++ /dev/null
-@@ -1,75 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-07-13
-- * Description : Model for image versions
-- *
-- * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEVERSIONSMODEL_H
--#define IMAGEVERSIONSMODEL_H
--
--// Qt includes
--
--#include <QModelIndex>
--#include <QPixmap>
--
--// Local includes
--
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class DIGIKAM_DATABASE_EXPORT ImageVersionsModel : public QAbstractListModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageVersionsModel(QObject* parent = 0);
-- ~ImageVersionsModel();
--
-- Qt::ItemFlags flags(const QModelIndex& index) const;
-- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-- int rowCount(const QModelIndex& parent = QModelIndex()) const;
--
-- void setupModelData(QList<QPair<QString, int> >& data);
-- void clearModelData();
--
-- QString currentSelectedImage() const;
-- void setCurrentSelectedImage(const QString& path);
-- QModelIndex currentSelectedImageIndex() const;
--
-- bool paintTree() const;
-- int listIndexOf(const QString& item) const;
--
--public Q_SLOTS:
--
-- void slotAnimationStep();
-- void setPaintTree(bool paint);
--
--private:
--
-- class Private;
-- Private* const d;
--};
--
--} // namespace Digikam
--
--#endif // IMAGEVERSIONSMODEL_H
---
-cgit v0.11.2
-
diff --git a/kde/patch/digikam/digikam_imagemagick7.patch b/kde/patch/digikam/digikam_imagemagick7.patch
deleted file mode 100644
index 04a7752..0000000
--- a/kde/patch/digikam/digikam_imagemagick7.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From: Antonio Rojas <arojas@archlinux.org>
-Date: Thu, 7 Nov 2019 09:25:02 +0100
-Subject: Properly initialize ExceptionInfo in libMagick
-
-Otherwise it will crash if some plugins can't be loaded.
-
-diff --git a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp
-index 1858b4d..20ef01b 100644
---- a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp
-+++ b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp
-@@ -125,7 +125,7 @@ QMap<QString, QString> DImgImageMagickPlugin::extraAboutData() const
- QString mimes = typeMimes();
-
- QMap<QString, QString> map;
-- ExceptionInfo ex;
-+ ExceptionInfo ex = *AcquireExceptionInfo();
- size_t n = 0;
- const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex);
-
-@@ -219,7 +219,7 @@ int DImgImageMagickPlugin::canRead(const QFileInfo& fileInfo, bool magic) const
- int DImgImageMagickPlugin::canWrite(const QString& format) const
- {
- QStringList formats;
-- ExceptionInfo ex;
-+ ExceptionInfo ex = *AcquireExceptionInfo();
- size_t n = 0;
- const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex);
-
-@@ -266,7 +266,7 @@ DImgLoader* DImgImageMagickPlugin::loader(DImg* const image, const DRawDecoding&
- QStringList DImgImageMagickPlugin::decoderFormats() const
- {
- QStringList formats;
-- ExceptionInfo ex;
-+ ExceptionInfo ex = *AcquireExceptionInfo();
- size_t n = 0;
- const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex);
-
---
-cgit v1.1
-
diff --git a/kde/patch/dolphin.patch b/kde/patch/dolphin.patch
index dfe3a2f..02a7950 100644
--- a/kde/patch/dolphin.patch
+++ b/kde/patch/dolphin.patch
@@ -1,3 +1,2 @@
# Let the user decide whether she wants to run Dolphin as root:
cat $CWD/patch/dolphin/dolphin_revert_noroot.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/falkon.patch b/kde/patch/falkon.patch
new file mode 100644
index 0000000..27a4668
--- /dev/null
+++ b/kde/patch/falkon.patch
@@ -0,0 +1,2 @@
+# Fix build against Qt 5.15:
+cat $CWD/patch/falkon/falkon.qt-5.15.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/falkon/falkon.qt-5.15.diff b/kde/patch/falkon/falkon.qt-5.15.diff
new file mode 100644
index 0000000..60f1699
--- /dev/null
+++ b/kde/patch/falkon/falkon.qt-5.15.diff
@@ -0,0 +1,20 @@
+--- ./src/lib/tools/qztools.cpp.orig 2019-03-19 13:06:45.000000000 -0500
++++ ./src/lib/tools/qztools.cpp 2020-07-18 15:00:08.881313780 -0500
+@@ -25,6 +25,7 @@
+ #include <QByteArray>
+ #include <QPixmap>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QBuffer>
+ #include <QFile>
+ #include <QDir>
+--- ./src/plugins/VerticalTabs/verticaltabsplugin.cpp.orig 2019-03-19 13:06:45.000000000 -0500
++++ ./src/plugins/VerticalTabs/verticaltabsplugin.cpp 2020-07-18 15:03:16.468303404 -0500
+@@ -31,6 +31,7 @@
+ #include "desktopfile.h"
+
+ #include <QSettings>
++#include <QFile>
+
+ VerticalTabsPlugin::VerticalTabsPlugin()
+ : QObject()
diff --git a/kde/patch/gwenview.patch b/kde/patch/gwenview.patch
deleted file mode 100644
index 04dfe50..0000000
--- a/kde/patch/gwenview.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Prevent dataloss when importing pictures;
-# Will be fixed in 17.04.2:
-#cat $CWD/patch/gwenview/gwenview-17.04.1_dataloss.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/gwenview/gwenview-17.04.1_dataloss.patch b/kde/patch/gwenview/gwenview-17.04.1_dataloss.patch
deleted file mode 100644
index fa93428..0000000
--- a/kde/patch/gwenview/gwenview-17.04.1_dataloss.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-From 6ce5d2f8d82f83c5a3d726ee5807ebaf7a6e3c6c Mon Sep 17 00:00:00 2001
-From: Henrik Fehlauer <rkflx@lab12.net>
-Date: Thu, 11 May 2017 22:40:15 +0200
-Subject: Avoid data loss when importing pictures
-
-Summary:
-Fix porting regressions, which left users of Gwenview Importer with:
-- failed import (import destination still empty)
-- additionally (when choosing "Delete" instead of "Keep" after import):
- pictures also removed from import source, with no way to recover
-
-Correct additional problems remaining after fixing the import failure:
-- hang on duplicate filenames
-- identically named files with different content are never imported
-- error dialog when deleting pictures from import source
-
-BUG: 379615
-
-In detail:
-
-1st problem (introduced in 017b4fe5dc7f4b6e876cfd7b108dcebbf609ae94):
-
- Initially, pictures are copied to a temporary folder
- (e.g. "foo/.gwenview_importer-IcQqvo/"), before being moved/renamed
- to the final destination (e.g. "foo/"), which is determined by
- calling "cd .." on the temporary folder.
-
- However, mistakenly this path contains a superfluous '/'
- (e.g. "foo/.gwenview_importer-IcQqvo//"), resulting in the final
- destination reading "foo/.gwenview_importer-IcQqvo/" instead of
- "foo/". On cleanup, the temporary folder is removed, simultaneously
- deleting all new pictures.
-
- Fix: Omit '/' where appropriate.
-
-2nd problem (broken by a3262e9b197ee97323ef8bf3a9dca1e13f61a74c):
-
- When trying to find a unique filename, the while loop "stat"ing the
- file repeats forever.
-
- Fix: Call "KIO::stat" and "KJobWidgets::setWindow"
- also inside the loop.
-
-3rd problem (introduced in 017b4fe5dc7f4b6e876cfd7b108dcebbf609ae94):
-
- If the destination directory already contains an identically named
- file, we try to find a different name by appending a number. For
- this, we need to strip the old filename from the full path.
- Unfortunately, only calling "path()" is incorrect, giving
- "foo/pict0001.jpg/pict0001_1.jpg", rather than "foo/pict0001_1.jpg".
-
- Fix: Use "adjusted(QUrl::RemoveFilename)".
-
-4th problem (broken by a3262e9b197ee97323ef8bf3a9dca1e13f61a74c):
-
- Although deletion works, we show a warning dialog stating failure.
-
- Fix: Invert the logic of "job->exec()", as the error handling should
- be skipped by "break"ing out of the while loop.
-
-Test Plan:
-Steps to reproduce (see https://bugs.kde.org/show_bug.cgi?id=379615) no longer result in data loss.
-
-Autotests for importer (separate review request in D5750) pass. Hopefully, this helps catching any future porting regressions.
-
-Reviewers: ltoscano, sandsmark, gateau
-
-Reviewed By: ltoscano
-
-Differential Revision: https://phabricator.kde.org/D5749
----
- importer/fileutils.cpp | 5 ++++-
- importer/importdialog.cpp | 2 +-
- importer/importer.cpp | 4 ++--
- 3 files changed, 7 insertions(+), 4 deletions(-)
-
-diff --git a/importer/fileutils.cpp b/importer/fileutils.cpp
-index 5293d56..a51a18c 100644
---- a/importer/fileutils.cpp
-+++ b/importer/fileutils.cpp
-@@ -128,7 +128,10 @@ RenameResult rename(const QUrl& src, const QUrl& dst_, QWidget* authWindow)
- }
- result = RenamedUnderNewName;
-
-- dst.setPath(dst.path() + '/' + prefix + QString::number(count) + suffix);
-+ dst.setPath(dst.adjusted(QUrl::RemoveFilename).path() + prefix + QString::number(count) + suffix);
-+ statJob = KIO::stat(dst);
-+ KJobWidgets::setWindow(statJob, authWindow);
-+
- ++count;
- }
-
-diff --git a/importer/importdialog.cpp b/importer/importdialog.cpp
-index ee6f7cd..5e9e847 100644
---- a/importer/importdialog.cpp
-+++ b/importer/importdialog.cpp
-@@ -121,7 +121,7 @@ public:
- QList<QUrl> urls = importedUrls + skippedUrls;
- while (true) {
- KIO::Job* job = KIO::del(urls);
-- if (!job->exec()) {
-+ if (job->exec()) {
- break;
- }
- // Deleting failed
-diff --git a/importer/importer.cpp b/importer/importer.cpp
-index 51c4b96..a7e1d4e 100644
---- a/importer/importer.cpp
-+++ b/importer/importer.cpp
-@@ -98,7 +98,7 @@ struct ImporterPrivate
- }
- mCurrentUrl = mUrlList.takeFirst();
- QUrl dst = mTempImportDirUrl;
-- dst.setPath(dst.path() + '/' + mCurrentUrl.fileName());
-+ dst.setPath(dst.path() + mCurrentUrl.fileName());
- KIO::Job* job = KIO::copy(mCurrentUrl, dst, KIO::HideProgressInfo);
- KJobWidgets::setWindow(job, mAuthWindow);
- QObject::connect(job, SIGNAL(result(KJob*)),
-@@ -122,7 +122,7 @@ struct ImporterPrivate
- } else {
- fileName = src.fileName();
- }
-- dst.setPath(dst.path() + '/' + fileName);
-+ dst.setPath(dst.path() + fileName);
-
- FileUtils::RenameResult result = FileUtils::rename(src, dst, mAuthWindow);
- switch (result) {
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/kaccounts-integration.patch b/kde/patch/kaccounts-integration.patch
deleted file mode 100644
index 26b87d4..0000000
--- a/kde/patch/kaccounts-integration.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# A bug with 15.08.2/.3 breaks KDE Telepathy accounts connection .
-# Will be fixed in 15.12.0:
-#cat $CWD/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch b/kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch
deleted file mode 100644
index e41d58b..0000000
--- a/kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/src/jobs/createaccount.cpp
-+++ b/src/jobs/createaccount.cpp
-@@ -141,8 +141,8 @@
-
- m_done = true;
-
-+ connect(m_identity, &SignOn::Identity::credentialsStored, m_identity, &SignOn::Identity::queryInfo);
- m_identity->storeCredentials();
-- connect(m_identity, &SignOn::Identity::credentialsStored, m_identity, &SignOn::Identity::queryInfo);
- }
-
- void CreateAccount::pluginError(const QString &error)
-@@ -177,12 +177,12 @@
- return;
- }
-
-+ m_account->selectService();
-+
- if (m_account->displayName().isEmpty()) {
- m_account->setDisplayName(info.userName());
- }
- m_account->setValue("username", info.userName());
--
-- m_account->selectService();
- m_account->setCredentialsId(info.id());
-
- Accounts::AuthData authData = m_accInfo->authData();
-
diff --git a/kde/patch/kalgebra.patch b/kde/patch/kalgebra.patch
index 8365ff3..d17f482 100644
--- a/kde/patch/kalgebra.patch
+++ b/kde/patch/kalgebra.patch
@@ -2,4 +2,3 @@
# on other, it's not, requiring you to link both Curses and Readline libraries
# manually.
cat $CWD/patch/kalgebra/kalgebra_ncurses_linking.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kalzium.patch b/kde/patch/kalzium.patch
deleted file mode 100644
index 6593e9d..0000000
--- a/kde/patch/kalzium.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix build against KF 5.31.0 (repaired in 16.12.3):
-#cat $CWD/patch/kalzium/kalzium_kf_5.31.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kalzium/kalzium_kf_5.31.patch b/kde/patch/kalzium/kalzium_kf_5.31.patch
deleted file mode 100644
index a3d4e00..0000000
--- a/kde/patch/kalzium/kalzium_kf_5.31.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-Patch taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/plain/kde-apps/kalzium/files/kalzium-16.12.2-kf-5.31.patch
-
-From f233d458959548ab371e3faeca7313f746625afc Mon Sep 17 00:00:00 2001
-From: Heiko Becker <heirecka@exherbo.org>
-Date: Sun, 22 Jan 2017 14:46:24 +0100
-Subject: Fix build with extra-cmake-modules > 5.30
-
-Since a5f3a76e14799c68b5e8f74e375baa5f6f6ab4dc in
-extra-cmake-modules.git -fno-operator-names is passed to the build
-(when supported), causing a build error for kalzium.
-
-REVIEW: 129873
----
- src/calculator/titrationCalculator.cpp | 39 +++++++++++++++-------------------
- 1 file changed, 17 insertions(+), 22 deletions(-)
-
-diff --git a/src/calculator/titrationCalculator.cpp b/src/calculator/titrationCalculator.cpp
-index 44ea152..6ea9ac9 100644
---- a/src/calculator/titrationCalculator.cpp
-+++ b/src/calculator/titrationCalculator.cpp
-@@ -41,11 +41,6 @@
-
- using namespace std;
-
--#ifdef _MSC_VER
--#define and &&
--#define or ||
--#endif
--
- titrationCalculator::titrationCalculator(QWidget * parent) : QWidget(parent)
- {
- xmin = 0;
-@@ -112,7 +107,7 @@ void titrationCalculator::plot()
- }
- QString mreporto;
- int iter = 0;
-- if (uid.xaxis->text() == "" or uid.xaxis->text() == " ") {
-+ if (uid.xaxis->text() == "" || uid.xaxis->text() == " ") {
- uid.xaxis->setText(i18n("nothing"));
- }
- if (tmpy == 0) {
-@@ -121,11 +116,11 @@ void titrationCalculator::plot()
- //now we have to solve the system of equations NOTE:yvalue contains the equation of Y-axis variable
- //we iterates the process until you have an equation in one only unknown variable or a numeric expression
- mreporto = solve(yvalue);
-- while (end == 0 or lettere == 1) {
-+ while (end == 0 || lettere == 1) {
- QByteArray ba = mreporto.toLatin1();
- char *tmreport = ba.data();
- ++iter;
-- if (end == 1 or lettere == 0) {
-+ if (end == 1 || lettere == 0) {
- break;
- }
- if (iter > 100) {
-@@ -273,13 +268,13 @@ QString titrationCalculator::solve(char *yvalue)
- QString tempyval;
- QString ptem;
- for (int i = 0; strlen(yvalue) + 1; ++i) {
-- if (!(yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',')) {
-+ if (!(yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',')) {
- break; //if current value is not a permitted value, this means that something is wrong
- }
-- if (yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='.' || yvalue[i]==',') {
- lettere = 1; //if lettere == 0 then the equation contains only mnumbers
- }
-- if (yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',') {
- tempyval = tempyval + QString(yvalue[i]);
- } else {
- tempy = tempy + QString(yvalue[i]);
-@@ -302,7 +297,7 @@ QString titrationCalculator::solve(char *yvalue)
- end = 1;
- }
- if (tempy!=uid.xaxis->text()) {
-- if (yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',') {
- //actually nothing
- } else {
- end = 0;
-@@ -335,13 +330,13 @@ QString titrationCalculator::solvex(char *yvalue, QString dnum) {
- QString tempyval;
- tempy = "";
- for (int i = 0; strlen(yvalue) + 1; ++i) {
-- if (!(yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',')) {
-+ if (!(yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',')) {
- break; //if current value is not a permitted value, this means that something is wrong
- }
-- if (yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='.' || yvalue[i]==',') {
- tempy = tempy + yvalue[i]; //if lettere == 0 then the equation contains only mnumbers
- }
-- if (yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',') {
- if (!tempyolda.isEmpty()) {
- tempy = tempy + yvalue[i];
- if (tempyolda == uid.xaxis->text()) {
-@@ -359,7 +354,7 @@ QString titrationCalculator::solvex(char *yvalue, QString dnum) {
- tempyolda = tempyold;
- } else {
- tempyold = "";
-- if (((olda != 1) and (yvalue[i + 1] != '^')) or (yvalue[i] == '+' or yvalue[i] == '-' or yvalue[i] == '^' or yvalue[i] == '*' or yvalue[i] == '/' or yvalue[i] == '(' or yvalue[i] == ')')) {
-+ if (((olda != 1) && (yvalue[i + 1] != '^')) || (yvalue[i] == '+' || yvalue[i] == '-' || yvalue[i] == '^' || yvalue[i] == '*' || yvalue[i] == '/' || yvalue[i] == '(' || yvalue[i] == ')')) {
- tempyval = tempyval + QString(yvalue[i]);
- }
- }
-@@ -374,7 +369,7 @@ QString titrationCalculator::solvex(char *yvalue, QString dnum) {
- tempyold = "";
- olda = 1;
- }
-- if ((tempy==uid.xaxis->text()) and (!tempyolda.isEmpty())) {
-+ if ((tempy==uid.xaxis->text()) && (!tempyolda.isEmpty())) {
- if (yvalue[i + 1] != '^') {
- tempyval = tempyval + dnum;
- }
-@@ -611,7 +606,7 @@ void titrationCalculator::on_actionOpen_triggered()
- if (tmpchr != '|') {
- tempyval = tempyval + tmpchr;
- } else {
-- if ((tablea == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((tablea == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- if ((i % 2) != 0) {
- QTableWidgetItem *titemo = uid.tableWidget->item((i - 1) / 2, 1);
- if (titemo) {
-@@ -626,7 +621,7 @@ void titrationCalculator::on_actionOpen_triggered()
- ++i;
- }
-
-- if ((tableb == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((tableb == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- if ((i % 2) != 0) {
- QTableWidgetItem *titemo = uid.tableWidget_2->item((i - 1) / 2, 1);
- if (titemo) {
-@@ -641,13 +636,13 @@ void titrationCalculator::on_actionOpen_triggered()
- }
- ++i;
- }
-- if ((xax == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((xax == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- uid.xaxis->setText(tempyval);
- }
-- if ((yax == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((yax == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- uid.yaxis->setText(tempyval);
- }
-- if ((notea == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((notea == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- uid.note->setText(tempyval);
- }
-
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/kate.patch b/kde/patch/kate.patch
index 45c2f53..59df062 100644
--- a/kde/patch/kate.patch
+++ b/kde/patch/kate.patch
@@ -1,8 +1,3 @@
-# Last-minute fixes for opening and closing files:
-# Should be fixed after 15.12.0.
-#cat $CWD/patch/kate/kate-15.12.0.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Allow Kate to be started by the root user; disallowing this is not
# a decision that a developer should make for the user, it is patronizing:
cat $CWD/patch/kate/kate_runasroot.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kate/kate-15.12.0.patch b/kde/patch/kate/kate-15.12.0.patch
deleted file mode 100644
index 25067f4..0000000
--- a/kde/patch/kate/kate-15.12.0.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Michal Humpula <michal.humpula@hudrydum.cz>
-Date: Sun, 29 Nov 2015 10:24:42 +0000
-Subject: fix opening new files trough dbus
-X-Git-Url: http://quickgit.kde.org/?p=kate.git&a=commitdiff&h=d61b121264d7b43d41c1c6417a18bbfb9078eb9d
----
-fix opening new files trough dbus
-
-REVIEW: 126197
----
-
-
---- a/urlinfo.h
-+++ b/urlinfo.h
-@@ -33,7 +33,7 @@
- : cursor(KTextEditor::Cursor::invalid())
- {
- // convert to an url
-- const QRegularExpression withProtocol(QStringLiteral("^[a-zA-Z]+:")); // TODO: remove after Qt supports this on its own
-+ const QRegularExpression withProtocol(QStringLiteral("^[a-zA-Z]+://")); // TODO: remove after Qt supports this on its own
- if (withProtocol.match(path).hasMatch()) {
- url = QUrl::fromUserInput(path);
- } else {
-@@ -50,7 +50,7 @@
- int line = match.captured(1).toInt() - 1;
- // don't use an invalid column when the line is valid
- int column = qMax(0, match.captured(2).toInt() - 1);
-- url = QUrl::fromLocalFile(path);
-+ url = QUrl::fromLocalFile(QDir::current().absoluteFilePath(path));
- cursor = {line, column};
- }
- }
diff --git a/kde/patch/kcalc.patch b/kde/patch/kcalc.patch
deleted file mode 100644
index 8cc3873..0000000
--- a/kde/patch/kcalc.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Fix issue where kcalc has a zero-sized window and appears not to start,
-# in combination with Qt 5.6.
-# Should be fixed after 16.04.0.
-#cat $CWD/patch/kcalc/kcalc-kdebug_360105.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kcalc/kcalc-kdebug_360105.patch b/kde/patch/kcalc/kcalc-kdebug_360105.patch
deleted file mode 100644
index a2ff272..0000000
--- a/kde/patch/kcalc/kcalc-kdebug_360105.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Fix issue where kcalc has a zero-sized window and appears not to start.
-
-Patch-by: Rex Dieter <rdieter@math.unl.edu>
-Gentoo-bug: 577782
-KDE-bug: 360105
-
---- a/kcalc.cpp
-+++ b/kcalc.cpp
-@@ -124,5 +124,5 @@ KCalculator::KCalculator(QWidget *parent
- updateGeometry();
-
-- setFixedSize(minimumSize());
-+ if ( ! minimumSize().isEmpty() ) setFixedSize(minimumSize());
-
- updateDisplay(UPDATE_FROM_CORE);
diff --git a/kde/patch/kcalcore.patch b/kde/patch/kcalcore.patch
deleted file mode 100644
index 051150d..0000000
--- a/kde/patch/kcalcore.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix compile error against new libical 3:
-# Fixed in Applications 17.12.0:
-#cat $CWD/patch/kcalcore/kcalcore_libical3.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kcalcore/kcalcore_libical3.patch b/kde/patch/kcalcore/kcalcore_libical3.patch
deleted file mode 100644
index 0a5155f..0000000
--- a/kde/patch/kcalcore/kcalcore_libical3.patch
+++ /dev/null
@@ -1,109 +0,0 @@
-From 27eaa211b23a6bb0bcba5a91cf7cadfc1e888e21 Mon Sep 17 00:00:00 2001
-From: Allen Winter <winter@kde.org>
-Date: Fri, 6 Oct 2017 10:39:20 -0400
-Subject: icalformat_p.cpp, icaltimezones.cpp - follow API changes in libical3
-
----
- src/icalformat_p.cpp | 11 ++++++-----
- src/icaltimezones.cpp | 10 ++++------
- 2 files changed, 10 insertions(+), 11 deletions(-)
-
-diff --git a/src/icalformat_p.cpp b/src/icalformat_p.cpp
-index bd1d8a3..c2e4548 100644
---- a/src/icalformat_p.cpp
-+++ b/src/icalformat_p.cpp
-@@ -2355,7 +2355,6 @@ icaltimetype ICalFormatImpl::writeICalDate(const QDate &date)
- t.second = 0;
-
- t.is_date = 1;
-- t.is_utc = 0;
- t.zone = nullptr;
-
- return t;
-@@ -2377,7 +2376,9 @@ icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &datetime, bool d
- t.second = datetime.time().second();
- }
- t.zone = nullptr; // zone is NOT set
-- t.is_utc = datetime.isUtc() ? 1 : 0;
-+ if ( datetime.isUtc() ) {
-+ t = icaltime_convert_to_zone(t, icaltimezone_get_utc_timezone());
-+ }
-
- // _dumpIcaltime( t );
-
-@@ -2450,7 +2452,7 @@ icalproperty *ICalFormatImpl::writeICalDateTimeProperty(const icalproperty_kind
- }
-
- KTimeZone ktz;
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc(t)) {
- ktz = dt.timeZone();
- }
-
-@@ -2483,7 +2484,7 @@ QDateTime ICalFormatImpl::readICalDateTime(icalproperty *p, const icaltimetype &
- // _dumpIcaltime( t );
-
- KDateTime::Spec timeSpec;
-- if (t.is_utc || t.zone == icaltimezone_get_utc_timezone()) {
-+ if (icaltime_is_utc(t) || t.zone == icaltimezone_get_utc_timezone()) {
- timeSpec = KDateTime::UTC; // the time zone is UTC
- utc = false; // no need to convert to UTC
- } else {
-diff --git a/src/icaltimezones.cpp b/src/icaltimezones.cpp
-index 2f6d42f..f8f8d5d 100644
---- a/src/icaltimezones.cpp
-+++ b/src/icaltimezones.cpp
-@@ -54,7 +54,7 @@ static QDateTime toQDateTime(const icaltimetype &t)
- {
- return QDateTime(QDate(t.year, t.month, t.day),
- QTime(t.hour, t.minute, t.second),
-- (t.is_utc ? Qt::UTC : Qt::LocalTime));
-+ (icaltime_is_utc(t) ? Qt::UTC : Qt::LocalTime));
- }
-
- // Maximum date for time zone data.
-@@ -81,7 +81,6 @@ static icaltimetype writeLocalICalDateTime(const QDateTime &utc, int offset)
- t.second = local.time().second();
- t.is_date = 0;
- t.zone = nullptr;
-- t.is_utc = 0;
- return t;
- }
-
-@@ -888,7 +887,7 @@
- }
- case ICAL_LASTMODIFIED_PROPERTY: {
- const icaltimetype t = icalproperty_get_lastmodified(p);
-- if (t.is_utc) {
-+ if (icaltime_is_utc(t)) {
- data->d->lastModified = toQDateTime(t);
- } else {
- qCDebug(KCALCORE_LOG) << "LAST-MODIFIED not UTC";
-@@ -1261,7 +1260,7 @@ bool ICalTimeZoneParser::parsePhase(icalcomponent *c, ICalTimeZonePhase &phase)
- // Convert DTSTART to QDateTime, and from local time to UTC
- const QDateTime localStart = toQDateTime(dtstart); // local time
- dtstart.second -= prevOffset;
-- dtstart.is_utc = 1;
-+ dtstart = icaltime_convert_to_zone(dtstart, icaltimezone_get_utc_timezone());
- const QDateTime utcStart = toQDateTime(icaltime_normalize(dtstart)); // UTC
-
- transitions += utcStart;
-@@ -1286,13 +1285,12 @@ bool ICalTimeZoneParser::parsePhase(icalcomponent *c, ICalTimeZonePhase &phase)
- t.minute = dtstart.minute;
- t.second = dtstart.second;
- t.is_date = 0;
-- t.is_utc = 0; // dtstart is in local time
- }
- // RFC2445 states that RDATE must be in local time,
- // but we support UTC as well to be safe.
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc(t)) {
- t.second -= prevOffset; // convert to UTC
-- t.is_utc = 1;
-+ t = icaltime_convert_to_zone(t, icaltimezone_get_utc_timezone());
- t = icaltime_normalize(t);
- }
- transitions += toQDateTime(t);
---
-cgit v0.11.2
-
diff --git a/kde/patch/kcoreaddons.patch b/kde/patch/kcoreaddons.patch
deleted file mode 100644
index 5cd190c..0000000
--- a/kde/patch/kcoreaddons.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# KDEBUG #362161 (fixed in Frameworks 5.22.0):
-# Fixes regression introduced in 9ae6d765b37135bbfe3a8b936e5a88b8a435e424
-# Since the rand() was not seeded, the numbers generated were predictable.
-#cat $CWD/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch b/kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch
deleted file mode 100644
index 31bbcf7..0000000
--- a/kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Albert Astals Cid <aacid@kde.org>
-Date: Tue, 26 Apr 2016 21:41:27 +0000
-Subject: Missing rand() -> qrand
-X-Git-Url: http://quickgit.kde.org/?p=kcoreaddons.git&a=commitdiff&h=78212436643af95779facd9593c82fb149c2213d
----
-Missing rand() -> qrand
-
-Fixes regression introduced in 9ae6d765b37135bbfe3a8b936e5a88b8a435e424
-
-Reviewed by Aleix
-
-BUGS: 362161
----
-
-
---- a/src/lib/randomness/krandom.cpp
-+++ b/src/lib/randomness/krandom.cpp
-@@ -51,7 +51,7 @@
- }
- qsrand(seed);
- }
-- return rand();
-+ return qrand();
- }
-
- QString KRandom::randomString(int length)
-
diff --git a/kde/patch/kde-baseapps.patch b/kde/patch/kde-baseapps.patch
deleted file mode 100644
index 988504d..0000000
--- a/kde/patch/kde-baseapps.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Fix for bug https://bugs.kde.org/show_bug.cgi?id=327224
-# "Regression: Dolphin doesn't accept URLs containing a kio-slave as parameter"
-# Fixed in KDE 4.11.4.
-#cat $CWD/patch/kde-baseapps/dolphin_kdebug_327224.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-baseapps/dolphin_kdebug_327224.patch b/kde/patch/kde-baseapps/dolphin_kdebug_327224.patch
deleted file mode 100644
index 8210d87..0000000
--- a/kde/patch/kde-baseapps/dolphin_kdebug_327224.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-Revert "Files passed as arguments: Ignore unsupported files"
-
-This reverts commit cd9e50ae4f3ded5a78d0cfb09a67684a9c15d726.
-
-See bug#327224 for details.
-
---- a/dolphin/src/dolphinmainwindow.cpp
-+++ b/dolphin/src/dolphinmainwindow.cpp
-@@ -31,7 +31,6 @@
- #include "panels/information/informationpanel.h"
- #include "settings/dolphinsettingsdialog.h"
- #include "statusbar/dolphinstatusbar.h"
--#include "views/dolphinview.h"
- #include "views/dolphinviewactionhandler.h"
- #include "views/dolphinremoteencoding.h"
- #include "views/draganddrophelper.h"
-@@ -244,20 +243,8 @@
- return;
- }
-
-- // dirs could contain URLs that actually point to archives or other files.
-- // Replace them by URLs we can open where possible and filter the rest out.
-- QList<KUrl> urlsToOpen;
-- foreach (const KUrl& rawUrl, dirs) {
-- const KFileItem& item = KFileItem(KFileItem::Unknown, KFileItem::Unknown, rawUrl);
-- item.determineMimeType();
-- const KUrl& url = DolphinView::openItemAsFolderUrl(item);
-- if (!url.isEmpty()) {
-- urlsToOpen.append(url);
-- }
-- }
--
-- if (urlsToOpen.count() == 1) {
-- m_activeViewContainer->setUrl(urlsToOpen.first());
-+ if (dirs.count() == 1) {
-+ m_activeViewContainer->setUrl(dirs.first());
- return;
- }
-
-@@ -267,12 +254,12 @@
-
- // Open each directory inside a new tab. If the "split view" option has been enabled,
- // always show two directories within one tab.
-- QList<KUrl>::const_iterator it = urlsToOpen.begin();
-- while (it != urlsToOpen.end()) {
-+ QList<KUrl>::const_iterator it = dirs.begin();
-+ while (it != dirs.end()) {
- openNewTab(*it);
- ++it;
-
-- if (hasSplitView && (it != urlsToOpen.end())) {
-+ if (hasSplitView && (it != dirs.end())) {
- const int tabIndex = m_viewTab.count() - 1;
- m_viewTab[tabIndex].secondaryView->setUrl(*it);
- ++it;
-
-
diff --git a/kde/patch/kde-cli-tools.patch b/kde/patch/kde-cli-tools.patch
deleted file mode 100644
index a76227d..0000000
--- a/kde/patch/kde-cli-tools.patch
+++ /dev/null
@@ -1,6 +0,0 @@
-# Remove CONFIG argument from find_package(KF5);
-# This is no longer wanted, since ECM has a FindKF5 module.
-#cat $CWD/patch/kde-cli-tools/kde-cli-tools_ecm.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Adjust for the change in KAboutData:
-#cat $CWD/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch b/kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch
deleted file mode 100644
index 1ff1f84..0000000
--- a/kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- kde-cli-tools-20140602git/CMakeLists.txt.orig 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/CMakeLists.txt 2014-06-02 23:45:22.337682384 +0200
-@@ -21,7 +21,7 @@
- Test
- )
-
--find_package(KF5 CONFIG REQUIRED COMPONENTS
-+find_package(KF5 REQUIRED COMPONENTS
- Config
- Init
- KCMUtils
diff --git a/kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff b/kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff
deleted file mode 100644
index e88a512..0000000
--- a/kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff
+++ /dev/null
@@ -1,59 +0,0 @@
-diff -uar kde-cli-tools-20140602git.orig/kdesu/kdesu.cpp kde-cli-tools-20140602git/kdesu/kdesu.cpp
---- kde-cli-tools-20140602git.orig/kdesu/kdesu.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kdesu/kdesu.cpp 2014-06-03 00:41:16.998697492 +0200
-@@ -81,9 +81,9 @@
- if (duser.isEmpty())
- duser = "root";
-
-- KAboutData aboutData("kdesu", 0, i18n("KDE su"),
-+ KAboutData aboutData("kdesu", i18n("KDE su"),
- Version, i18n("Runs a program with elevated privileges."),
-- KAboutData::License_Artistic,
-+ KAboutLicense::Artistic,
- i18n("Copyright (c) 1998-2000 Geert Jansen, Pietro Iglio"));
- aboutData.addAuthor(i18n("Geert Jansen"), i18n("Maintainer"),
- "jansen@kde.org", "http://www.stack.nl/~geertj/");
-diff -uar kde-cli-tools-20140602git.orig/kioclient/kioclient.cpp kde-cli-tools-20140602git/kioclient/kioclient.cpp
---- kde-cli-tools-20140602git.orig/kioclient/kioclient.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kioclient/kioclient.cpp 2014-06-03 00:41:50.446696159 +0200
-@@ -133,7 +133,7 @@
- QString programName = i18n("KIO Client");
- QString description = i18n("Command-line tool for network-transparent operations");
- QString version = "2.0";
-- KAboutData data(appName, appName, programName, version, description, KAboutData::License_LGPL_V2);
-+ KAboutData data(appName, programName, version, description, KAboutLicense::LGPL_V2);
-
- QCommandLineParser parser;
- parser.addOption(QCommandLineOption("noninteractive", i18n("Non-interactive use: no message boxes. If you don't want a"
-diff -uar kde-cli-tools-20140602git.orig/kreadconfig/kreadconfig.cpp kde-cli-tools-20140602git/kreadconfig/kreadconfig.cpp
---- kde-cli-tools-20140602git.orig/kreadconfig/kreadconfig.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kreadconfig/kreadconfig.cpp 2014-06-03 00:40:33.820702023 +0200
-@@ -53,10 +53,10 @@
- int main(int argc, char **argv)
- {
- QCoreApplication app(argc, argv);
-- KAboutData aboutData("kreadconfig", 0, i18n("KReadConfig"),
-+ KAboutData aboutData("kreadconfig", i18n("KReadConfig"),
- "1.0.1",
- i18n("Read KConfig entries - for use in shell scripts"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2001 Red Hat, Inc."));
- aboutData.addAuthor(i18n("Bernhard Rosenkraenzer"), QString(), "bero@redhat.com");
-
-diff -uar kde-cli-tools-20140602git.orig/kreadconfig/kwriteconfig.cpp kde-cli-tools-20140602git/kreadconfig/kwriteconfig.cpp
---- kde-cli-tools-20140602git.orig/kreadconfig/kwriteconfig.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kreadconfig/kwriteconfig.cpp 2014-06-03 00:39:54.811701204 +0200
-@@ -31,10 +31,10 @@
- int main(int argc, char **argv)
- {
- QCoreApplication app(argc, argv);
-- KAboutData aboutData("kwriteconfig", 0, i18n("KWriteConfig"),
-+ KAboutData aboutData("kwriteconfig", i18n("KWriteConfig"),
- "1.0.0",
- i18n("Write KConfig entries - for use in shell scripts"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2001 Red Hat, Inc. & Luís Pedro Coelho"));
- aboutData.addAuthor("Luís Pedro Coelho", QString(), "luis_pedro@netcabo.pt");
- aboutData.addAuthor("Bernhard Rosenkraenzer", i18n("Wrote kreadconfig on which this is based"), "bero@redhat.com");
diff --git a/kde/patch/kde-dev-utils.patch b/kde/patch/kde-dev-utils.patch
deleted file mode 100644
index c5cbc92..0000000
--- a/kde/patch/kde-dev-utils.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix build against KF 5.48.0 (only relevant for 18.04.3):
-#cat $CWD/patch/kde-dev-utils/build_with_kf548.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-dev-utils/build_with_kf548.patch b/kde/patch/kde-dev-utils/build_with_kf548.patch
deleted file mode 100644
index e75838d..0000000
--- a/kde/patch/kde-dev-utils/build_with_kf548.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 369699a..00e1413 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -1,15 +1,18 @@
- cmake_minimum_required(VERSION 2.8.12)
-
- find_package(ECM 5.14 REQUIRED NO_MODULE)
- set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
-
- include(FeatureSummary)
- include(ECMInstallIcons)
- include(KDEInstallDirs)
- include(KDECMakeSettings)
- include(KDECompilerSettings NO_POLICY_SCOPE)
- include(ECMQtDeclareLoggingCategory)
-
-+# Required for ki18n_install(po) added on tarball generation
-+find_package(KF5 REQUIRED COMPONENTS I18n)
-+
- add_subdirectory(kpartloader)
- add_subdirectory(kuiviewer)
- ki18n_install(po)
-diff --git a/kpartloader/CMakeLists.txt b/kpartloader/CMakeLists.txt
-index 4e54d94..1fe4136 100644
---- a/kpartloader/CMakeLists.txt
-+++ b/kpartloader/CMakeLists.txt
-@@ -1,27 +1,26 @@
- project(kpartloader)
- ########### kpartloader ###############
-
- set(QT_MIN_VERSION "5.5.0")
-
- find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE
- COMPONENTS
- Core
- )
-
- find_package(KF5 REQUIRED
- COMPONENTS
- CoreAddons
-- I18n
- Parts
- WidgetsAddons
- )
-
- set(kpartloader_SRCS
- kpartloader.cpp
- )
-
- add_executable(kpartloader ${kpartloader_SRCS})
- target_link_libraries(kpartloader KF5::Parts)
- install(TARGETS kpartloader ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
- install(FILES kpartloaderui.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/kpartloader)
-
-diff --git a/kuiviewer/CMakeLists.txt b/kuiviewer/CMakeLists.txt
-index fa72c59..3fe987e 100644
---- a/kuiviewer/CMakeLists.txt
-+++ b/kuiviewer/CMakeLists.txt
-@@ -1,96 +1,95 @@
- project(kuiviewer)
-
- set(QT_MIN_VERSION "5.5.0")
-
- include(ECMAddAppIcon)
-
- find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE
- COMPONENTS
- Core
- Designer
- UiTools
- )
-
- find_package(KF5 REQUIRED
- COMPONENTS
- CoreAddons
- KIO
-- I18n
- Parts
- )
-
- add_definitions(
- -DQT_DEPRECATED_WARNINGS
- -DQT_DISABLE_DEPRECATED_BEFORE=0x050500
- -DQT_NO_SIGNALS_SLOTS_KEYWORDS
- -DQT_STRICT_ITERATORS
- -DQT_USE_QSTRINGBUILDER
- -DQT_NO_CAST_TO_ASCII
- -DQT_NO_CAST_FROM_ASCII
- -DQT_NO_CAST_FROM_BYTEARRAY
- -DQT_NO_URL_CAST_FROM_STRING
- )
-
- ########### next target ###############
-
- set(kuiviewer_SRCS main.cpp kuiviewer.cpp )
-
- file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/*-apps-kuiviewer.png")
- ecm_add_app_icon(kuiviewer_SRCS ICONS ${ICONS_SRCS})
-
- add_executable(kuiviewer ${kuiviewer_SRCS})
-
- target_link_libraries(kuiviewer KF5::Parts )
-
- install(TARGETS kuiviewer ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} )
-
-
- ########### next target ###############
-
- set(kuiviewerpart_PART_SRCS kuiviewer_part.cpp )
-
- ecm_qt_declare_logging_category(kuiviewerpart_PART_SRCS
- HEADER kuiviewer_part_debug.h
- IDENTIFIER KUIVIEWERPART
- CATEGORY_NAME "kuiviewerpart"
- )
-
- add_library(kuiviewerpart MODULE ${kuiviewerpart_PART_SRCS})
-
- target_link_libraries(kuiviewerpart KF5::Parts Qt5::Designer Qt5::UiTools)
-
- install(TARGETS kuiviewerpart DESTINATION ${KDE_INSTALL_PLUGINDIR} )
-
-
- ########### next target ###############
-
- set(quithumbnail_PART_SRCS quicreator.cpp )
-
- add_library(quithumbnail MODULE ${quithumbnail_PART_SRCS})
-
- target_link_libraries(quithumbnail
- KF5::KIOWidgets
- Qt5::Designer
- Qt5::UiTools
- )
-
- install(TARGETS quithumbnail DESTINATION ${KDE_INSTALL_PLUGINDIR} )
-
-
- ########### install files ###############
-
- install( PROGRAMS org.kde.kuiviewer.desktop DESTINATION ${KDE_INSTALL_APPDIR} )
- install( FILES designerthumbnail.desktop kuiviewer_part.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} )
- install( FILES kuiviewer_part.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/kuiviewerpart )
- install( FILES kuiviewerui.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/kuiviewer )
-
- ecm_install_icons(ICONS
- 16-apps-kuiviewer.png
- 32-apps-kuiviewer.png
- 48-apps-kuiviewer.png
- 64-apps-kuiviewer.png
- 128-apps-kuiviewer.png
- sc-apps-kuiviewer.svg
- DESTINATION ${KDE_INSTALL_ICONDIR}
- THEME hicolor
- )
diff --git a/kde/patch/kde-gtk-config.patch b/kde/patch/kde-gtk-config.patch
deleted file mode 100644
index a62e649..0000000
--- a/kde/patch/kde-gtk-config.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Make the kde-gtk-config load the current config first:
-# Fixed in 5.11.2
-#cat $CWD/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch b/kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch
deleted file mode 100644
index b5b074d..0000000
--- a/kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch
+++ /dev/null
@@ -1,622 +0,0 @@
-From 0d0f812a1704c62c014bc87162b1280224b64f93 Mon Sep 17 00:00:00 2001
-From: Fabian Vogt <fabian@ritter-vogt.de>
-Date: Tue, 24 Oct 2017 13:25:32 +0200
-Subject: Revert "Make the kde-gtk-config kcm better at checking global gtk
- settings"
-
-Summary:
-This reverts commit 34357f74ee2d98128ff423b0ec6ddcbf4232c475.
-
-Reverting this fixes loading of the actually used GTK settings.
-
-BUG: 382291
-
-Test Plan:
-Opened kcmshell5 kde-gtk-config with and without this revert.
-Without, it shows Adwaita as theme, with it shows breeze.
-GTK uses breeze, so the behaviour with the revert is correct.
-
-Reviewers: #plasma, apol
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D8443
----
- CMakeLists.txt | 2 +-
- src/abstractappearance.h | 5 +-
- src/appearancegtk2.cpp | 103 +++++++++++++---------------------
- src/appearancegtk2.h | 11 +---
- src/appearancegtk3.cpp | 143 +++++++++++++++++++++--------------------------
- src/appearancegtk3.h | 10 +---
- src/appearencegtk.cpp | 4 +-
- tests/CMakeLists.txt | 2 +-
- tests/configsavetest.cpp | 75 ++++++++++---------------
- tests/configsavetest.h | 8 +--
- 10 files changed, 144 insertions(+), 219 deletions(-)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 181cfc9..bf1ba29 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -51,7 +51,7 @@ ki18n_wrap_ui(kcm_SRCS
- )
- add_library(kcm_kdegtkconfig MODULE ${kcm_SRCS})
- target_compile_definitions(kcm_kdegtkconfig PRIVATE -DPROJECT_VERSION="${PROJECT_VERSION}")
--target_link_libraries(kcm_kdegtkconfig ${X11_Xcursor_LIB} KF5::ConfigCore KF5::I18n KF5::KIOWidgets KF5::NewStuff KF5::Archive KF5::NewStuff KF5::ConfigWidgets KF5::IconThemes)
-+target_link_libraries(kcm_kdegtkconfig ${X11_Xcursor_LIB} KF5::I18n KF5::KIOWidgets KF5::NewStuff KF5::Archive KF5::NewStuff KF5::ConfigWidgets KF5::IconThemes)
-
- kcoreaddons_desktop_to_json(kcm_kdegtkconfig kde-gtk-config.desktop)
-
-diff --git a/src/abstractappearance.h b/src/abstractappearance.h
-index 208342e..2961a09 100644
---- a/src/abstractappearance.h
-+++ b/src/abstractappearance.h
-@@ -30,11 +30,10 @@ class AbstractAppearance
- {
- public:
- virtual ~AbstractAppearance() {}
-- virtual bool loadSettings() = 0;
-- virtual bool saveSettings() const = 0;
-+ virtual QString defaultConfigFile() const = 0;
- virtual bool loadSettings(const QString& path) = 0;
- virtual bool saveSettings(const QString& path) const = 0;
--
-+
- /** @returns the installed themes' paths*/
- virtual QStringList installedThemes() const = 0;
-
-diff --git a/src/appearancegtk2.cpp b/src/appearancegtk2.cpp
-index 92cbee3..44a2239 100644
---- a/src/appearancegtk2.cpp
-+++ b/src/appearancegtk2.cpp
-@@ -30,38 +30,48 @@
- #include <QStandardPaths>
- #include <config.h>
-
--bool AppearanceGTK2::loadSettingsPrivate(const QString& path)
-+bool AppearanceGTK2::loadSettings(const QString& path)
- {
- QFile configFile(path);
-
-- if (!configFile.open(QIODevice::ReadOnly | QIODevice::Text))
-- return false;
-+ bool canRead = configFile.open(QIODevice::ReadOnly | QIODevice::Text);
-
-- const QMap<QString, QString> foundSettings = readSettingsTuples(&configFile);
--
-- for(auto it = foundSettings.constBegin(), itEnd = foundSettings.constEnd(); it!=itEnd; ++it) {
-- if (it.key() == "gtk-theme-name")
-- m_settings["theme"] = *it;
-- else if (it.key() == "gtk-icon-theme-name")
-- m_settings["icon"] = *it;
-- else if (it.key() == "gtk-fallback-icon-theme")
-- m_settings["icon_fallback"] = *it;
-- else if (it.key() == "gtk-cursor-theme-name")
-- m_settings["cursor"] = *it;
-- else if (it.key() == "gtk-font-name")
-- m_settings["font"] = *it;
-- else if (it.key() == "gtk-toolbar-style")
-- m_settings["toolbar_style"] = *it;
-- else if (it.key() == "gtk-button-images")
-- m_settings["show_icons_buttons"] = *it;
-- else if(it.key() == "gtk-menu-images")
-- m_settings["show_icons_menus"] = *it;
-- else if (it.key() == "gtk-primary-button-warps-slider")
-- m_settings["primary_button_warps_slider"] = *it;
-- else
-- qWarning() << "unknown field" << it.key();
-+ if(canRead) {
-+// qDebug() << "The gtk2 config file exists...";
-+ const QMap<QString, QString> foundSettings = readSettingsTuples(&configFile);
-+ m_settings = QMap<QString, QString> {
-+ {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-+ {"show_icons_buttons", "0"},
-+ {"show_icons_menus", "0"},
-+ {"primary_button_warps_slider", "false"}
-+ };
-+
-+ for(auto it = foundSettings.constBegin(), itEnd = foundSettings.constEnd(); it!=itEnd; ++it) {
-+ if (it.key() == "gtk-theme-name")
-+ m_settings["theme"] = *it;
-+ else if (it.key() == "gtk-icon-theme-name")
-+ m_settings["icon"] = *it;
-+ else if (it.key() == "gtk-fallback-icon-theme")
-+ m_settings["icon_fallback"] = *it;
-+ else if (it.key() == "gtk-cursor-theme-name")
-+ m_settings["cursor"] = *it;
-+ else if (it.key() == "gtk-font-name")
-+ m_settings["font"] = *it;
-+ else if (it.key() == "gtk-toolbar-style")
-+ m_settings["toolbar_style"] = *it;
-+ else if (it.key() == "gtk-button-images")
-+ m_settings["show_icons_buttons"] = *it;
-+ else if(it.key() == "gtk-menu-images")
-+ m_settings["show_icons_menus"] = *it;
-+ else if (it.key() == "gtk-primary-button-warps-slider")
-+ m_settings["primary_button_warps_slider"] = *it;
-+ else
-+ qWarning() << "unknown field" << it.key();
-+ }
-+
- }
-- return true;
-+
-+ return canRead;
- }
-
- QString AppearanceGTK2::themesGtkrcFile(const QString& themeName) const
-@@ -82,7 +92,7 @@ QString AppearanceGTK2::themesGtkrcFile(const QString& themeName) const
- return QString();
- }
-
--bool AppearanceGTK2::saveSettingsPrivate(const QString& gtkrcFile) const
-+bool AppearanceGTK2::saveSettings(const QString& gtkrcFile) const
- {
- QFile gtkrc(gtkrcFile);
- gtkrc.remove();
-@@ -107,14 +117,14 @@ bool AppearanceGTK2::saveSettingsPrivate(const QString& gtkrcFile) const
- flow << "include \"/etc/gtk-2.0/gtkrc\"\n"; //We include the /etc's config file
-
- int nameEnd = m_settings["font"].lastIndexOf(QRegExp(" ([0-9]+|bold|italic)"));
-- const auto fontFamily = m_settings["font"].leftRef(nameEnd);
-+ QString fontFamily = m_settings["font"].left(nameEnd);
-
- //TODO: is this really needed?
- flow << "style \"user-font\" \n"
- << "{\n"
- << "\tfont_name=\""<< fontFamily << "\"\n"
- << "}\n";
--
-+
- flow << "widget_class \"*\" style \"user-font\"\n";
- flow << "gtk-font-name=\"" << m_settings["font"] << "\"\n";
- flow << "gtk-theme-name=\"" << m_settings["theme"] << "\"\n";
-@@ -144,16 +154,6 @@ bool AppearanceGTK2::saveSettingsPrivate(const QString& gtkrcFile) const
- return true;
- }
-
--void AppearanceGTK2::reset()
--{
-- m_settings = QMap<QString, QString> {
-- {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-- {"show_icons_buttons", "0"},
-- {"show_icons_menus", "0"},
-- {"primary_button_warps_slider", "false"}
-- };
--}
--
- QString AppearanceGTK2::defaultConfigFile() const
- {
- return QDir::homePath()+"/.gtkrc-2.0";
-@@ -183,26 +183,3 @@ QStringList AppearanceGTK2::installedThemes() const
-
- return paths;
- }
--
--bool AppearanceGTK2::loadSettings()
--{
-- reset();
--
-- return loadSettingsPrivate("/etc/gtk-2.0/gtkrc") && loadSettingsPrivate(defaultConfigFile());
--}
--
--bool AppearanceGTK2::saveSettings() const
--{
-- return saveSettings(defaultConfigFile());
--}
--
--bool AppearanceGTK2::loadSettings(const QString& gtkrcFile)
--{
-- reset();
-- return loadSettingsPrivate(gtkrcFile);
--}
--
--bool AppearanceGTK2::saveSettings(const QString& gtkrcFile) const
--{
-- return saveSettingsPrivate(gtkrcFile);
--}
-diff --git a/src/appearancegtk2.h b/src/appearancegtk2.h
-index 7df49bf..8bc28ee 100644
---- a/src/appearancegtk2.h
-+++ b/src/appearancegtk2.h
-@@ -29,17 +29,10 @@ class AppearanceGTK2 : public AbstractAppearance
- {
- bool loadSettings(const QString& path) override;
- bool saveSettings(const QString& path) const override;
-- bool loadSettings() override;
-- bool saveSettings() const override;
-+ QString defaultConfigFile() const override;
- QStringList installedThemes() const override;
--
-+
- QString themesGtkrcFile(const QString& themeName) const;
--
--private:
-- void reset();
-- QString defaultConfigFile() const;
-- bool loadSettingsPrivate(const QString& path);
-- bool saveSettingsPrivate(const QString& path) const;
- };
-
- #endif // APPEARANCEGTK2_H
-diff --git a/src/appearancegtk3.cpp b/src/appearancegtk3.cpp
-index 7df48c3..fa1bde5 100644
---- a/src/appearancegtk3.cpp
-+++ b/src/appearancegtk3.cpp
-@@ -25,8 +25,6 @@
- #include <QDir>
- #include <QDebug>
- #include <QStandardPaths>
--#include <KSharedConfig>
--#include <KConfigGroup>
-
- QStringList AppearanceGTK3::installedThemes() const
- {
-@@ -53,65 +51,76 @@ QStringList AppearanceGTK3::installedThemes() const
- return themes;
- }
-
--bool AppearanceGTK3::saveSettings(const KSharedConfig::Ptr& file) const
--{
-- KConfigGroup group(file, "Settings");
--
-- group.writeEntry("gtk-font-name", m_settings["font"]);
-- group.writeEntry("gtk-theme-name", m_settings["theme"]);
-- group.writeEntry("gtk-icon-theme-name", m_settings["icon"]);
-- group.writeEntry("gtk-fallback-icon-theme", m_settings["icon_fallback"]);
-- group.writeEntry("gtk-cursor-theme-name", m_settings["cursor"]);
-- group.writeEntry("gtk-toolbar-style", m_settings["toolbar_style"]);
-- group.writeEntry("gtk-menu-images", m_settings["show_icons_menus"]);
-- group.writeEntry("gtk-button-images", m_settings["show_icons_buttons"]);
-- group.writeEntry("gtk-primary-button-warps-slider", m_settings["primary_button_warps_slider"]);
-- group.writeEntry("gtk-application-prefer-dark-theme", m_settings["application_prefer_dark_theme"]);
--
-- const bool sync = group.sync();
-- Q_ASSERT(sync);
-- return true;
--}
--
--bool AppearanceGTK3::loadSettings(const KSharedConfig::Ptr& file)
-+bool AppearanceGTK3::saveSettings(const QString& file) const
- {
-- KConfigGroup group(file, "Settings");
--
-- if (!file || !group.isValid()) {
-- qWarning() << "Cannot open the GTK3 config file" << file;
-+ //Opening GTK3 config file $ENV{XDG_CONFIG_HOME}/gtk-3.0/m_settings.ini
-+ QDir::home().mkpath(file.left(file.lastIndexOf('/'))); //we make sure the path exists
-+ QFile file_gtk3(file);
-+
-+ if(!file_gtk3.open(QIODevice::WriteOnly | QIODevice::Text)) {
-+ qWarning() << "Couldn't open GTK3 config file for writing at:" << file_gtk3.fileName();
- return false;
- }
-+ QTextStream flow3(&file_gtk3);
-+ flow3 << "[Settings]\n";
-+ flow3 << "gtk-font-name=" << m_settings["font"] << "\n";
-+ flow3 << "gtk-theme-name=" << m_settings["theme"] << "\n";
-+ flow3 << "gtk-icon-theme-name="<< m_settings["icon"] << "\n";
-+ flow3 << "gtk-fallback-icon-theme=" << m_settings["icon_fallback"] << "\n";
-+ flow3 << "gtk-cursor-theme-name=" << m_settings["cursor"] << "\n";
-+ flow3 << "gtk-toolbar-style=" << m_settings["toolbar_style"] << "\n";
-+ flow3 << "gtk-menu-images=" << m_settings["show_icons_menus"] << "\n";
-+ flow3 << "gtk-button-images=" << m_settings["show_icons_buttons"] << "\n";
-+ flow3 << "gtk-primary-button-warps-slider=" << m_settings["primary_button_warps_slider"] << "\n";
-+ flow3 << "gtk-application-prefer-dark-theme=" << m_settings["application_prefer_dark_theme"] << "\n";
-
-- m_settings = QMap<QString, QString> {
-- {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-- {"show_icons_buttons", "0"},
-- {"show_icons_menus", "0"},
-- {"primary_button_warps_slider", "false"},
-- {"application_prefer_dark_theme", "false"}
-- };
--
-- m_settings["theme"] = group.readEntry("gtk-theme-name");
-- m_settings["icon"] = group.readEntry("gtk-icon-theme-name");
-- m_settings["icon_fallback"] = group.readEntry("gtk-fallback-icon-theme");
-- m_settings["cursor"] = group.readEntry("gtk-cursor-theme-name");
-- m_settings["font"] = group.readEntry("gtk-font-name");
-- m_settings["toolbar_style"] = group.readEntry("gtk-toolbar-style");
-- m_settings["show_icons_buttons"] = group.readEntry("gtk-button-images");
-- m_settings["show_icons_menus"] = group.readEntry("gtk-menu-images");
-- m_settings["primary_button_warps_slider"] = group.readEntry("gtk-primary-button-warps-slider");
-- m_settings["application_prefer_dark_theme"] = group.readEntry("gtk-application-prefer-dark-theme");
-- for(auto it = m_settings.begin(); it != m_settings.end(); ) {
-- if (it.value().isEmpty())
-- it = m_settings.erase(it);
-- else
-- ++it;
-- }
- return true;
- }
-
--QString AppearanceGTK3::configFileName() const
-+bool AppearanceGTK3::loadSettings(const QString& path)
- {
-- return QStringLiteral("gtk-3.0/settings.ini");
-+ QFile fileGtk3(path);
-+ bool canRead=fileGtk3.open(QIODevice::ReadOnly | QIODevice::Text);
-+
-+ if(canRead) {
-+ const QMap<QString, QString> foundSettings = readSettingsTuples(&fileGtk3);
-+
-+ m_settings = QMap<QString, QString> {
-+ {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-+ {"show_icons_buttons", "0"},
-+ {"show_icons_menus", "0"},
-+ {"primary_button_warps_slider", "false"},
-+ {"application_prefer_dark_theme", "false"}
-+ };
-+
-+ for(auto it = foundSettings.constBegin(), itEnd = foundSettings.constEnd(); it!=itEnd; ++it) {
-+ if (it.key() == "gtk-theme-name")
-+ m_settings["theme"] = *it;
-+ else if (it.key() == "gtk-icon-theme-name")
-+ m_settings["icon"] = *it;
-+ else if (it.key() == "gtk-fallback-icon-theme")
-+ m_settings["icon_fallback"] = *it;
-+ else if (it.key() == "gtk-cursor-theme-name")
-+ m_settings["cursor"] = *it;
-+ else if (it.key() == "gtk-font-name")
-+ m_settings["font"] = *it;
-+ else if (it.key() == "gtk-toolbar-style")
-+ m_settings["toolbar_style"] = *it;
-+ else if (it.key() == "gtk-button-images")
-+ m_settings["show_icons_buttons"] = *it;
-+ else if (it.key() == "gtk-menu-images")
-+ m_settings["show_icons_menus"] = *it;
-+ else if (it.key() == "gtk-primary-button-warps-slider")
-+ m_settings["primary_button_warps_slider"] = *it;
-+ else if (it.key() == "gtk-application-prefer-dark-theme")
-+ m_settings["application_prefer_dark_theme"] = *it;
-+ else
-+ qWarning() << "unknown field" << it.key();
-+ }
-+ } else
-+ qWarning() << "Cannot open the GTK3 config file" << path;
-+
-+ return canRead;
- }
-
- QString AppearanceGTK3::defaultConfigFile() const
-@@ -120,7 +129,7 @@ QString AppearanceGTK3::defaultConfigFile() const
- if(root.isEmpty())
- root = QFileInfo(QDir::home(), ".config").absoluteFilePath();
-
-- return root + '/' + configFileName();
-+ return root+"/gtk-3.0/settings.ini";
- }
-
- bool AppearanceGTK3::getApplicationPreferDarkTheme() const
-@@ -132,29 +141,3 @@ void AppearanceGTK3::setApplicationPreferDarkTheme(const bool& enable)
- {
- m_settings["application_prefer_dark_theme"] = enable ? "true" : "false";
- }
--
--bool AppearanceGTK3::saveSettings(const QString& file) const
--{
-- auto cfg = KSharedConfig::openConfig(file);
-- return saveSettings(cfg);
--}
--
--bool AppearanceGTK3::loadSettings(const QString& path)
--{
-- auto cfg = KSharedConfig::openConfig(path);
-- return loadSettings(cfg);
--}
--
--bool AppearanceGTK3::loadSettings()
--{
-- auto cfg = KSharedConfig::openConfig(configFileName());
-- cfg->setReadDefaults(true);
-- return loadSettings(cfg);
--}
--
--bool AppearanceGTK3::saveSettings() const
--{
-- auto cfg = KSharedConfig::openConfig(configFileName());
-- cfg->setReadDefaults(true);
-- return saveSettings(cfg);
--}
-diff --git a/src/appearancegtk3.h b/src/appearancegtk3.h
-index 3ce5a05..d4562b1 100644
---- a/src/appearancegtk3.h
-+++ b/src/appearancegtk3.h
-@@ -23,7 +23,6 @@
- #ifndef APPEARANCEGTK3_H
- #define APPEARANCEGTK3_H
-
--#include <KSharedConfig>
- #include "abstractappearance.h"
-
- class AppearanceGTK3 : public AbstractAppearance
-@@ -31,18 +30,11 @@ class AppearanceGTK3 : public AbstractAppearance
-
- public:
- QStringList installedThemes() const override;
-- bool saveSettings() const override;
-- bool loadSettings() override;
- bool saveSettings(const QString& file) const override;
- bool loadSettings(const QString& path) override;
-+ QString defaultConfigFile() const override;
- bool getApplicationPreferDarkTheme() const;
- void setApplicationPreferDarkTheme(const bool& enable);
--
--private:
-- QString defaultConfigFile() const;
-- QString configFileName() const;
-- bool saveSettings(const KSharedConfig::Ptr& file) const;
-- bool loadSettings(const KSharedConfig::Ptr& file);
- };
-
- #endif // APPEARANCEGTK3_H
-diff --git a/src/appearencegtk.cpp b/src/appearencegtk.cpp
-index 95a6604..2e26a5a 100644
---- a/src/appearencegtk.cpp
-+++ b/src/appearencegtk.cpp
-@@ -64,7 +64,7 @@ bool AppearenceGTK::loadFileConfig()
- {
- bool correct = false;
- foreach(AbstractAppearance* app, m_app) {
-- bool c = app->loadSettings();
-+ bool c = app->loadSettings(app->defaultConfigFile());
- correct = correct || c;
- }
- // qDebug() << "loading..." << correct;
-@@ -75,7 +75,7 @@ bool AppearenceGTK::saveFileConfig()
- {
- bool correct = true;
- foreach(AbstractAppearance* app, m_app) {
-- bool c = app->saveSettings();
-+ bool c = app->saveSettings(app->defaultConfigFile());
- correct = correct && c;
- }
- // qDebug() << "saving..." << correct;
-diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
-index 151725d..05bf8f1 100644
---- a/tests/CMakeLists.txt
-+++ b/tests/CMakeLists.txt
-@@ -2,7 +2,7 @@ macro(add_kgc_test name)
- add_executable(${name} ${name}.cpp ${ARGV})
- add_test(${name} ${name})
- ecm_mark_as_test(${name})
-- target_link_libraries(${name} Qt5::Core Qt5::Gui Qt5::Test KF5::ConfigCore)
-+ target_link_libraries(${name} Qt5::Core Qt5::Gui Qt5::Test)
- target_include_directories(${name} PRIVATE ${CMAKE_BINARY_DIR})
- endmacro(add_kgc_test)
-
-diff --git a/tests/configsavetest.cpp b/tests/configsavetest.cpp
-index 1fe8f4f..d5d8460 100644
---- a/tests/configsavetest.cpp
-+++ b/tests/configsavetest.cpp
-@@ -9,40 +9,33 @@
-
- QTEST_GUILESS_MAIN(ConfigSaveTest);
-
--ConfigSaveTest::ConfigSaveTest()
--{
-- QStandardPaths::setTestModeEnabled(true);
--}
--
--static void fillValues(QScopedPointer<AbstractAppearance>& a)
-+void ConfigSaveTest::fillValues(AbstractAppearance* a)
- {
- a->setFont("a");
- a->setIcon("a");
- a->setTheme("a");
- a->setToolbarStyle("a");
- a->setIconFallback("a");
-- a->setCursor("a");
- a->setShowIconsInButtons(true);
- a->setShowIconsInMenus(true);
- a->setPrimaryButtonWarpsSlider(true);
-
-- auto a3 = dynamic_cast<AppearanceGTK3*>(a.data());
-+ auto a3 = dynamic_cast<AppearanceGTK3*>(a);
- if (a3) {
- a3->setApplicationPreferDarkTheme(false);
- }
- }
-
--void compareAppearances(QScopedPointer<AbstractAppearance>& reloaded, QScopedPointer<AbstractAppearance>& instance)
-+bool compareAppearances(AbstractAppearance* a, AbstractAppearance* b)
- {
-- QCOMPARE(reloaded->getFont(), instance->getFont());
-- QCOMPARE(reloaded->getIcon(), instance->getIcon());
-- QCOMPARE(reloaded->getTheme(), instance->getTheme());
-- QCOMPARE(reloaded->getCursor(), instance->getCursor());
-- QCOMPARE(reloaded->getToolbarStyle(), instance->getToolbarStyle());
-- QCOMPARE(reloaded->getIconFallback(), instance->getIconFallback());
-- QCOMPARE(reloaded->getShowIconsInButtons(), instance->getShowIconsInButtons());
-- QCOMPARE(reloaded->getShowIconsInMenus(), instance->getShowIconsInMenus());
-- QCOMPARE(reloaded->getPrimaryButtonWarpsSlider(), instance->getPrimaryButtonWarpsSlider());
-+ return a->getFont() == b->getFont()
-+ && a->getIcon() == b->getIcon()
-+ && a->getTheme() == b->getTheme()
-+ && a->getToolbarStyle() == b->getToolbarStyle()
-+ && a->getIconFallback() == b->getIconFallback()
-+ && a->getShowIconsInButtons() == b->getShowIconsInButtons()
-+ && a->getShowIconsInMenus() == b->getShowIconsInMenus()
-+ && a->getPrimaryButtonWarpsSlider() == b->getPrimaryButtonWarpsSlider();
- }
-
- QByteArray readFile(const QString& path)
-@@ -53,35 +46,23 @@ QByteArray readFile(const QString& path)
- return f.readAll();
- }
-
--void ConfigSaveTest::testGtk2()
-+void ConfigSaveTest::testOpen()
- {
-- const QString pathA = QDir::current().absoluteFilePath("test-gtk2")
-- , pathB = QDir::current().absoluteFilePath("testB-gtk2");
--
-- QScopedPointer<AbstractAppearance> instance(new AppearanceGTK2);
-- fillValues(instance);
-- QVERIFY(instance->saveSettings(pathA));
--
-- QScopedPointer<AbstractAppearance> reloaded(new AppearanceGTK2);
-- QVERIFY(reloaded->loadSettings(pathA));
-- compareAppearances(reloaded, instance);
-- QVERIFY(reloaded->saveSettings(pathB));
-- QCOMPARE(readFile(pathA), readFile(pathB));
--}
--
--void ConfigSaveTest::testGtk3()
--{
-- QScopedPointer<AbstractAppearance> instance(new AppearanceGTK3);
-- fillValues(instance);
-- const QString pathA = QDir::current().absoluteFilePath("test-gtk3")
-- , pathB = QDir::current().absoluteFilePath("testB-gtk3");
-- QVERIFY(instance->saveSettings(pathA));
--
-- QScopedPointer<AbstractAppearance> reloaded(new AppearanceGTK3);
-- QVERIFY(QFile::exists(pathA));
-- QVERIFY(reloaded->loadSettings(pathA));
-- compareAppearances(reloaded, instance);
-- QVERIFY(reloaded->saveSettings(pathB));
-+ QVector<AbstractAppearance*> instances;
-+ instances << new AppearanceGTK2 << new AppearanceGTK3;
-+ fillValues(instances[0]);
-+ fillValues(instances[1]);
-+ QVERIFY(instances[0]->saveSettings("test-gtk2"));
-+ QVERIFY(instances[1]->saveSettings("test-gtk3"));
-
-- QCOMPARE(readFile(pathA), readFile(pathB));
-+ QVector<AbstractAppearance*> reloaded;
-+ reloaded << new AppearanceGTK2 << new AppearanceGTK3;
-+ QVERIFY(reloaded[0]->loadSettings("test-gtk2"));
-+ QVERIFY(reloaded[1]->loadSettings("test-gtk3"));
-+ QVERIFY(compareAppearances(reloaded[0], instances[0]));
-+ QVERIFY(compareAppearances(reloaded[1], instances[1]));
-+ QVERIFY(reloaded[0]->saveSettings("testB-gtk2"));
-+ QVERIFY(reloaded[1]->saveSettings("testB-gtk3"));
-+ QCOMPARE(readFile("test-gtk2"), readFile("testB-gtk2"));
-+ QCOMPARE(readFile("test-gtk3"), readFile("testB-gtk3"));
- }
-diff --git a/tests/configsavetest.h b/tests/configsavetest.h
-index 342b408..39fb4c2 100644
---- a/tests/configsavetest.h
-+++ b/tests/configsavetest.h
-@@ -11,11 +11,11 @@ class AbstractAppearance;
- class ConfigSaveTest : public QObject
- {
- Q_OBJECT
--public:
-- ConfigSaveTest();
- private slots:
-- void testGtk2();
-- void testGtk3();
-+ void testOpen();
-+
-+private:
-+ void fillValues(AbstractAppearance* a);
- };
-
- #endif // CONFIGSAVETEST_H
---
-cgit v0.11.2
-
diff --git a/kde/patch/kde-runtime.patch b/kde/patch/kde-runtime.patch
index c3b6101..3201d76 100644
--- a/kde/patch/kde-runtime.patch
+++ b/kde/patch/kde-runtime.patch
@@ -1,10 +1,2 @@
-# Fix KDE bug 324470 - solved in KDE 4.11.2.
-# - Minimize/maximize by clicking taskbar entries requires double click.
-#cat $CWD/patch/kde-runtime/kde-runtime.kdebug324470.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Fix compilation against NetworkManager 1.0.6:
cat $CWD/patch/kde-runtime/kde-runtime_networkmanager.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-## Fix compilation against gpgme 1.7+:
-#cat $CWD/patch/kde-runtime/kde-runtime_gpgme.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-runtime/kde-runtime.kdebug324470.diff b/kde/patch/kde-runtime/kde-runtime.kdebug324470.diff
deleted file mode 100644
index 4269df8..0000000
--- a/kde/patch/kde-runtime/kde-runtime.kdebug324470.diff
+++ /dev/null
@@ -1,49 +0,0 @@
-commit be1a5d484c70f4f6a383150810afbfbb367db2ac
-Author: Eike Hein <hein@kde.org>
-Date: Tue Sep 3 20:29:23 2013 +0200
-
- Discard the recorded events in the item-local handlers.
-
- Solves problems with identical events being ignored due to
- QGraphicsView's reuse of QGraphicsSceneMouseEvent instances.
-
- CCMAIL:rdieter@fedoraproject.org
- BUG:324470
- BUG:324471
-
-diff --git a/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp b/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp
-index b534845..36530e0 100644
---- a/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp
-+++ b/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp
-@@ -90,6 +90,7 @@ bool MouseEventListener::containsMouse() const
- void MouseEventListener::mousePressEvent(QGraphicsSceneMouseEvent *me)
- {
- if (m_lastEvent == me) {
-+ m_lastEvent = 0;
- return;
- }
-
-@@ -112,6 +113,7 @@ void MouseEventListener::mousePressEvent(QGraphicsSceneMouseEvent *me)
- void MouseEventListener::mouseMoveEvent(QGraphicsSceneMouseEvent *me)
- {
- if (m_lastEvent == me) {
-+ m_lastEvent = 0;
- return;
- }
-
-@@ -122,6 +124,7 @@ void MouseEventListener::mouseMoveEvent(QGraphicsSceneMouseEvent *me)
- void MouseEventListener::mouseReleaseEvent(QGraphicsSceneMouseEvent *me)
- {
- if (m_lastEvent == me) {
-+ m_lastEvent = 0;
- return;
- }
-
-@@ -138,6 +141,7 @@ void MouseEventListener::mouseReleaseEvent(QGraphicsSceneMouseEvent *me)
- void MouseEventListener::wheelEvent(QGraphicsSceneWheelEvent *we)
- {
- if (m_lastEvent == we) {
-+ m_lastEvent = 0;
- return;
- }
-
diff --git a/kde/patch/kde-runtime/kde-runtime_gpgme.patch b/kde/patch/kde-runtime/kde-runtime_gpgme.patch
deleted file mode 100644
index b1703ed..0000000
--- a/kde/patch/kde-runtime/kde-runtime_gpgme.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-commit 1b80d1d0b961f8e28186928ede2b87af292c3de4
-Author: Antonio Rojas <arojas@archlinux.org>
-Date: Thu Nov 10 16:58:10 2016 +0100
-
- Allow building kwalletd against gpgme++ from gpgme 1.7
-
- REVIEW: 129339
-
-diff --git a/kwalletd/CMakeLists.txt b/kwalletd/CMakeLists.txt
-index 73aec82..ae8c745 100644
---- a/kwalletd/CMakeLists.txt
-+++ b/kwalletd/CMakeLists.txt
-@@ -5,11 +5,18 @@ find_package(Gpgme) # Called by FindQGpgme, but since we call some gpgme
- # functions ourselves we need to link against it directly.
- find_package(QGpgme) # provided by kdepimlibs
-
--if (GPGME_FOUND AND QGPGME_FOUND)
-+if (NOT QGPGME_FOUND)
-+find_package(Gpgmepp) # provided by gpgme 1.7
-+endif (NOT QGPGME_FOUND)
-+
-+if ((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
- add_definitions(-DHAVE_QGPGME)
-- include_directories(${GPGME_INCLUDES} ${QGPGME_INCLUDE_DIR})
-+ include_directories(${GPGME_INCLUDES})
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS}")
--endif(GPGME_FOUND AND QGPGME_FOUND)
-+endif((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
-+if (GPGME_FOUND AND QGPGME_FOUND)
-+ include_directories(${QGPGME_INCLUDE_DIR})
-+endif (GPGME_FOUND AND QGPGME_FOUND)
-
- ########### build backends #########
- add_subdirectory(backend)
-@@ -37,7 +44,7 @@ kde4_add_ui_files(kwalletd_KDEINIT_SRCS
- kwalletwizardpagepassword.ui
- )
-
--if (GPGME_FOUND AND QGPGME_FOUND)
-+if ((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
- set(kwalletd_KDEINIT_SRCS
- ${kwalletd_KDEINIT_SRCS}
- knewwalletdialog.cpp
-@@ -48,7 +55,7 @@ if (GPGME_FOUND AND QGPGME_FOUND)
- knewwalletdialogintro.ui
- knewwalletdialoggpg.ui
- )
--endif(GPGME_FOUND AND QGPGME_FOUND)
-+endif((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
-
- find_file(kwallet_xml org.kde.KWallet.xml HINTS ${KDE4_DBUS_INTERFACES_DIR} )
-
-@@ -57,8 +64,12 @@ qt4_add_dbus_adaptor( kwalletd_KDEINIT_SRCS ${kwallet_xml} kwalletd.h KWalletD )
- kde4_add_kdeinit_executable( kwalletd NOGUI ${kwalletd_KDEINIT_SRCS} )
-
- target_link_libraries(kdeinit_kwalletd ${KDE4_KDEUI_LIBS} kwalletbackend )
--if (GPGME_FOUND AND QGPGME_FOUND)
-- target_link_libraries(kdeinit_kwalletd ${QGPGME_LIBRARIES} )
-+if(GPGME_FOUND AND QGPGME_FOUND)
-+target_link_libraries(kdeinit_kwalletd ${QGPGME_LIBRARIES} )
-+else(GPGME_FOUND AND QGPGME_FOUND)
-+if(Gpgmepp_FOUND)
-+target_link_libraries(kdeinit_kwalletd Gpgmepp)
-+endif(Gpgmepp_FOUND)
- endif(GPGME_FOUND AND QGPGME_FOUND)
-
- install(TARGETS kdeinit_kwalletd ${INSTALL_TARGETS_DEFAULT_ARGS})
-@@ -73,4 +84,4 @@ install( FILES kwalletd.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kwalletd )
- install( FILES kwallet-4.13.upd DESTINATION ${DATA_INSTALL_DIR}/kconf_update)
-
- add_subdirectory(tests)
--add_subdirectory(autotests)
-\ No newline at end of file
-+add_subdirectory(autotests)
-diff --git a/kwalletd/backend/CMakeLists.txt b/kwalletd/backend/CMakeLists.txt
-index 4db348f..7347b12 100644
---- a/kwalletd/backend/CMakeLists.txt
-+++ b/kwalletd/backend/CMakeLists.txt
-@@ -22,6 +22,10 @@ kde4_add_library(kwalletbackend SHARED ${kwalletbackend_LIB_SRCS})
- target_link_libraries(kwalletbackend ${KDE4_KDEUI_LIBS} ${LIBGCRYPT_LIBRARIES})
- if(QGPGME_FOUND)
- target_link_libraries(kwalletbackend ${QGPGME_LIBRARIES} )
-+else(QGPGME_FOUND)
-+if(Gpgmepp_FOUND)
-+target_link_libraries(kwalletbackend Gpgmepp)
-+endif(Gpgmepp_FOUND)
- endif(QGPGME_FOUND)
-
- # link with advapi32 on windows
-diff --git a/kwalletd/backend/backendpersisthandler.cpp b/kwalletd/backend/backendpersisthandler.cpp
-index b7f63f8..9608af0 100644
---- a/kwalletd/backend/backendpersisthandler.cpp
-+++ b/kwalletd/backend/backendpersisthandler.cpp
-@@ -33,6 +33,7 @@
- #include <gpgme++/data.h>
- #include <gpgme++/encryptionresult.h>
- #include <gpgme++/decryptionresult.h>
-+#include <boost/shared_ptr.hpp>
- #endif
- #include "backendpersisthandler.h"
- #include "kwalletbackend.h"
-diff --git a/kwalletd/kwalletwizard.cpp b/kwalletd/kwalletwizard.cpp
-index 78de78d..821b666 100644
---- a/kwalletd/kwalletwizard.cpp
-+++ b/kwalletd/kwalletwizard.cpp
-@@ -40,6 +40,7 @@
- #include <kdebug.h>
- #include <kmessagebox.h>
- #include <gpgme.h>
-+#include <boost/shared_ptr.hpp>
- #endif
-
- class PageIntro : public QWizardPage
-commit cf28801cd34730da07a2c01704ca3114630f4fe7
-Author: Antonio Rojas <arojas@archlinux.org>
-Date: Thu Nov 10 18:54:41 2016 +0100
-
- Compiling against gmgpe 1.7 requires c++11
-
-diff --git a/kwalletd/CMakeLists.txt b/kwalletd/CMakeLists.txt
-index ae8c745..88d944e 100644
---- a/kwalletd/CMakeLists.txt
-+++ b/kwalletd/CMakeLists.txt
-@@ -17,6 +17,9 @@ endif((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
- if (GPGME_FOUND AND QGPGME_FOUND)
- include_directories(${QGPGME_INCLUDE_DIR})
- endif (GPGME_FOUND AND QGPGME_FOUND)
-+if (Gpgmepp_FOUND)
-+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
-+endif (Gpgmepp_FOUND)
-
- ########### build backends #########
- add_subdirectory(backend)
diff --git a/kde/patch/kde-workspace.patch b/kde/patch/kde-workspace.patch
index 4a355d1..bebecfe 100644
--- a/kde/patch/kde-workspace.patch
+++ b/kde/patch/kde-workspace.patch
@@ -4,9 +4,5 @@ cat $CWD/patch/kde-workspace/kde-workspace.kdm.server.timeout.diff | patch -p1 -
# Always show 'remaining time' in the popup of the battery plasmoid:
cat $CWD/patch/kde-workspace/kde-workspace.batteryapplet.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-# Fix crash when DesktopNames isn't set (fixed in 4.11.10):
-#cat $CWD/patch/kde-workspace/kde-workspace.desktopnames.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# In Plasma 5 we do not need the Plasma 4 core apps, they conflict.
cat $CWD/patch/kde-workspace/kde-workspace.no.plasma4.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-workspace/kde-workspace.desktopnames.diff b/kde/patch/kde-workspace/kde-workspace.desktopnames.diff
deleted file mode 100644
index 59aef1c..0000000
--- a/kde/patch/kde-workspace/kde-workspace.desktopnames.diff
+++ /dev/null
@@ -1,34 +0,0 @@
-commit e1724800ecf3c6a7035dfa7bcaa50b2a8f48688f
-Author: David Faure <faure@kde.org>
-Date: Fri May 2 10:26:38 2014 +0200
-
- Fix crash when DesktopNames isn't set
-
- BUG: 334159
- FIXED-IN: 4.11.10
-
-diff --git a/kdm/backend/client.c b/kdm/backend/client.c
-index 335cc3e..a2d06c2 100644
---- a/kdm/backend/client.c
-+++ b/kdm/backend/client.c
-@@ -1810,12 +1810,14 @@ startClient(volatile int *pid)
- !(sessargs = iniEntry(str, "Desktop Entry", "Exec", 0)))
- sessargs = "";
- buf = iniEntry(str, "Desktop Entry", "DesktopNames", 0);
-- for (buf2 = buf; *buf2; ++buf2) {
-- if (*buf2 == ';')
-- *buf2 = ':';
-+ if (buf) {
-+ for (buf2 = buf; *buf2; ++buf2) {
-+ if (*buf2 == ';')
-+ *buf2 = ':';
-+ }
-+ userEnviron = setEnv(userEnviron, "XDG_CURRENT_DESKTOP", buf);
-+ free(buf);
- }
-- userEnviron = setEnv(userEnviron, "XDG_CURRENT_DESKTOP", buf);
-- free(buf);
- free(str);
- free(fname);
- goto gotit;
-
diff --git a/kde/patch/kdeconnect-kde.patch b/kde/patch/kdeconnect-kde.patch
index 47f98f5..122440d 100644
--- a/kde/patch/kdeconnect-kde.patch
+++ b/kde/patch/kdeconnect-kde.patch
@@ -1,3 +1,2 @@
# Fix remote device browsing with openssh 8.2:
cat $CWD/patch/kdeconnect-kde/kdeconnect-kde_openssh-8.2.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdelibs.patch b/kde/patch/kdelibs.patch
index 44e201e..4f1fc45 100644
--- a/kde/patch/kdelibs.patch
+++ b/kde/patch/kdelibs.patch
@@ -25,3 +25,6 @@ cat $CWD/patch/kdelibs/kdelibs.2c3762feddf7e66cf6b64d9058f625a715694a00.patch |
# Support TLS v1.1 and TLS v1.2:
cat $CWD/patch/kdelibs/kde4libs-4.14.26.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+
+# Fix for the relocated grantlee-qt4 includes:
+cat $CWD/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/kdelibs/fixbic-4.14.6.patch b/kde/patch/kdelibs/fixbic-4.14.6.patch
deleted file mode 100644
index 585ce51..0000000
--- a/kde/patch/kdelibs/fixbic-4.14.6.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-diff --git a/khtml/dom/dom_string.h b/khtml/dom/dom_string.h
-index 087f697..b269213 100644
---- a/khtml/dom/dom_string.h
-+++ b/khtml/dom/dom_string.h
-@@ -124,10 +124,23 @@ public:
- bool endsWith(const DOMString& str) const;
- bool startsWith(const DOMString& str) const;
-
-- // http://www.w3.org/TR/html/infrastructure.html#urls
-+ /**
-+ * Return a parsed url.
-+ * Used to parse SRC url attribute,
-+ * see http://www.w3.org/TR/html/infrastructure.html#urls
-+ *
-+ * @since 4.14.6
-+ */
- DOMString parsedUrl() const;
-
- /**
-+ * @deprecated, use parsedUrl()
-+ */
-+#ifndef KDE_NO_DEPRECATED
-+ KDE_DEPRECATED DOMString trimSpaces() const;
-+#endif
-+
-+ /**
- * @internal get a handle to the imlementation of the DOMString
- * Use at own risk!!!
- */
-diff --git a/khtml/dom/dom_string.cpp b/khtml/dom/dom_string.cpp
-index a3c4abd..4da676b 100644
---- a/khtml/dom/dom_string.cpp
-+++ b/khtml/dom/dom_string.cpp
-@@ -336,6 +336,13 @@ DOMString DOMString::parsedUrl() const
- return out;
- }
-
-+#ifndef KDE_NO_DEPRECATED
-+DOMString DOMString::trimSpaces() const
-+{
-+ return parsedUrl();
-+}
-+#endif
-+
- // ------------------------------------------------------------------------
-
- bool DOM::strcasecmp( const DOMString &as, const DOMString &bs )
diff --git a/kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch b/kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch
new file mode 100644
index 0000000..fd7375f
--- /dev/null
+++ b/kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch
@@ -0,0 +1,11 @@
+--- ./kdeui/tests/proxymodeltestsuite/modeleventlogger.cpp.orig 2017-11-04 20:51:22.000000000 -0500
++++ ./kdeui/tests/proxymodeltestsuite/modeleventlogger.cpp 2020-07-12 14:19:32.175099684 -0500
+@@ -30,7 +30,7 @@
+ #include <QDebug>
+
+ #ifdef Grantlee_FOUND
+-#include <grantlee_core.h>
++#include <grantlee-qt4/grantlee_core.h>
+ #include "grantlee_paths.h"
+
+ /**
diff --git a/kde/patch/kdelibs4support.patch b/kde/patch/kdelibs4support.patch
index 8e9fe7b..7d6626e 100644
--- a/kde/patch/kdelibs4support.patch
+++ b/kde/patch/kdelibs4support.patch
@@ -1,6 +1,2 @@
-# Make FindGettext compatible with the one provided by CMake:
-# Fixed in 5.1.0.
-#cat $CWD/patch/kdelibs4support/update-FindGettext.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Allow cmake to find our doctools:
cat $CWD/patch/kdelibs4support/FindDocBookXML4.cmake.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/kdelibs4support/update-FindGettext.patch b/kde/patch/kdelibs4support/update-FindGettext.patch
deleted file mode 100644
index 1b75cd8..0000000
--- a/kde/patch/kdelibs4support/update-FindGettext.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From: Alex Merry <alex.merry@kde.org>
-Date: Fri, 04 Jul 2014 10:10:27 +0000
-Subject: Make FindGettext compatible with the one provided by CMake
-X-Git-Url: http://quickgit.kde.org/?p=kdelibs4support.git&a=commitdiff&h=581ee6b370d8b5627196c8d6d8760d3655f6daea
----
-Make FindGettext compatible with the one provided by CMake
-
-This version will accept the old GETTEXT_PROCESS_PO_FILES() syntax (no
-PO_FILES argument), but will also accept the new syntax required by
-CMake's version of this file. It will also warn when PO_FILES is not
-given.
-
-REVIEW: 119111
----
-
-
---- a/cmake/modules/FindGettext.cmake
-+++ b/cmake/modules/FindGettext.cmake
-@@ -212,7 +212,16 @@
- LIST(REMOVE_AT _args 0 1)
- ENDIF("${_tmp}" STREQUAL "INSTALL_DESTINATION")
-
--# message(STATUS "2 all ${_addToAll} dest ${_installDest} args: ${_args}")
-+ LIST(GET _args 0 _tmp)
-+ IF("${_tmp}" STREQUAL "PO_FILES")
-+ LIST(REMOVE_AT _args 0)
-+ ELSE()
-+ SET(_deprecation_arg DEPRECATION)
-+ IF(CMAKE_VERSION VERSION_LESS 3.0.0)
-+ SET(_deprecation_arg AUTHOR_WARNING)
-+ ENDIF()
-+ MESSAGE(${_deprecation_arg} "GETTEXT_PROCESS_PO_FILES without a PO_FILES argument is deprecated")
-+ ENDIF()
-
- FOREACH(_current_PO_FILE ${_args})
- GET_FILENAME_COMPONENT(_name ${_current_PO_FILE} NAME)
diff --git a/kde/patch/kdenlive.patch b/kde/patch/kdenlive.patch
deleted file mode 100644
index 9065c4d..0000000
--- a/kde/patch/kdenlive.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix compilation with gcc7.
-# Should have been fixed in 17.04.2...
-#cat $CWD/patch/kdenlive/kdenlive_gcc7.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdenlive/kdenlive_gcc7.patch b/kde/patch/kdenlive/kdenlive_gcc7.patch
deleted file mode 100644
index a7ddb90..0000000
--- a/kde/patch/kdenlive/kdenlive_gcc7.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-# Make kdenlive compile with gcc7
-
---- kdenlive-17.04.1/src/profiles/tree/profiletreemodel.cpp.orig 2017-05-08 19:52:35.000000000 +0200
-+++ kdenlive-17.04.1/src/profiles/tree/profiletreemodel.cpp 2017-05-19 08:09:04.986909338 +0200
-@@ -27,6 +27,7 @@
- #include <QVector>
- #include <array>
- #include <KLocalizedString>
-+#include <functional>
-
-
- class ProfileItem
---- kdenlive-17.04.1/src/scopes/audioscopes/spectrogram.cpp.orig 2017-05-08 19:52:35.000000000 +0200
-+++ kdenlive-17.04.1/src/scopes/audioscopes/spectrogram.cpp 2017-05-19 08:09:04.993910503 +0200
-@@ -241,7 +241,7 @@
- x = leftDist + (m_innerScopeRect.width() - 1) * ((float)hz) / m_freqMax;
-
- // Hide text if it would overlap with the text drawn at the mouse position
-- hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - (leftDist + mouseX + 20)) < (int) minDistX + 16
-+ hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - ((int)leftDist + mouseX + 20)) < (int) minDistX + 16
- && mouseX < m_innerScopeRect.width() && mouseX >= 0;
-
- if (x <= rightBorder) {
-@@ -268,7 +268,7 @@
- }
- // Draw the line at the very right (maximum frequency)
- x = leftDist + m_innerScopeRect.width() - 1;
-- hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - (leftDist + mouseX + 30)) < (int) minDistX
-+ hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - ((int)leftDist + mouseX + 30)) < (int) minDistX
- && mouseX < m_innerScopeRect.width() && mouseX >= 0;
- davinci.drawLine(x, topDist, x, topDist + m_innerScopeRect.height() + 6);
- if (!hideText) {
diff --git a/kde/patch/kdepim.patch b/kde/patch/kdepim.patch
deleted file mode 100644
index c5aeb9c..0000000
--- a/kde/patch/kdepim.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Install Kleopatra headers, needed by kopete-cryptography:
-# This used to be fixed?
-#cat $CWD/patch/kdepim/kdepim-install_kleopatra_headers.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdepim/kdepim-install_kleopatra_headers.patch b/kde/patch/kdepim/kdepim-install_kleopatra_headers.patch
deleted file mode 100644
index 18662fd..0000000
--- a/kde/patch/kdepim/kdepim-install_kleopatra_headers.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-diff -uarN kdepim-15.08.0.orig/kleopatra/libkleopatraclient/CMakeLists.txt kdepim-15.08.0/kleopatra/libkleopatraclient/CMakeLists.txt
---- kdepim-15.08.0.orig/kleopatra/libkleopatraclient/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/kleopatra/libkleopatraclient/CMakeLists.txt 2015-08-24 23:05:07.650076668 +0200
-@@ -4,6 +4,11 @@
- add_subdirectory(core)
- add_subdirectory(gui)
-
-+install(
-+ FILES kleopatraclient_export.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/libkleopatraclient
-+ )
-+
- if(BUILD_TESTING)
- add_subdirectory(tests)
- endif()
-diff -uarN kdepim-15.08.0.orig/kleopatra/libkleopatraclient/core/CMakeLists.txt kdepim-15.08.0/kleopatra/libkleopatraclient/core/CMakeLists.txt
---- kdepim-15.08.0.orig/kleopatra/libkleopatraclient/core/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/kleopatra/libkleopatraclient/core/CMakeLists.txt 2015-08-24 22:52:15.613045160 +0200
-@@ -67,3 +67,13 @@
- target_link_libraries(kleopatraclientcore Qt5::Widgets KF5::I18n)
-
- install(TARGETS kleopatraclientcore ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-+
-+install(
-+ FILES
-+ initialization.h
-+ command.h
-+ selectcertificatecommand.h
-+ signencryptfilescommand.h
-+ decryptverifyfilescommand.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/libkleopatraclient/core
-+ )
-diff -uarN kdepim-15.08.0.orig/kleopatra/libkleopatraclient/gui/CMakeLists.txt kdepim-15.08.0/kleopatra/libkleopatraclient/gui/CMakeLists.txt
---- kdepim-15.08.0.orig/kleopatra/libkleopatraclient/gui/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/kleopatra/libkleopatraclient/gui/CMakeLists.txt 2015-08-24 22:52:15.613045160 +0200
-@@ -16,3 +16,9 @@
- )
-
- install(TARGETS kleopatraclientgui ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-+
-+install(
-+ FILES
-+ certificaterequester.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/libkleopatraclient/gui
-+ )
-diff -uarN kdepim-15.08.0.orig/libkleo/CMakeLists.txt kdepim-15.08.0/libkleo/CMakeLists.txt
---- kdepim-15.08.0.orig/libkleo/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/libkleo/CMakeLists.txt 2015-08-24 22:52:15.613045160 +0200
-@@ -126,3 +126,61 @@
- else ()
- install ( FILES libkleopatrarc.desktop DESTINATION ${KDE_INSTALL_CONFDIR} RENAME libkleopatrarc )
- endif ()
-+
-+install( FILES
-+ kleo/kleo_export.h
-+ kleo/enum.h
-+ kleo/oidmap.h
-+ kleo/cryptobackend.h
-+ kleo/cryptobackendfactory.h
-+ kleo/cryptoconfig.h
-+ kleo/dn.h
-+ kleo/job.h
-+ kleo/keylistjob.h
-+ kleo/keygenerationjob.h
-+ kleo/abstractimportjob.h
-+ kleo/importjob.h
-+ kleo/importfromkeyserverjob.h
-+ kleo/exportjob.h
-+ kleo/changeexpiryjob.h
-+ kleo/changeownertrustjob.h
-+ kleo/downloadjob.h
-+ kleo/deletejob.h
-+ kleo/encryptjob.h
-+ kleo/decryptjob.h
-+ kleo/signjob.h
-+ kleo/specialjob.h
-+ kleo/verifydetachedjob.h
-+ kleo/verifyopaquejob.h
-+ kleo/decryptverifyjob.h
-+ kleo/signencryptjob.h
-+ kleo/signkeyjob.h
-+ kleo/adduseridjob.h
-+ kleo/refreshkeysjob.h
-+ kleo/multideletejob.h
-+ kleo/hierarchicalkeylistjob.h
-+ kleo/keyfilter.h
-+ kleo/keyfiltermanager.h
-+ kleo/changepasswdjob.h
-+ kleo/checksumdefinition.h
-+ kleo/exception.h
-+ kleo/kconfigbasedkeyfilter.h
-+ kleo/listallkeysjob.h
-+ kleo/stl_util.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/kleo COMPONENT Devel)
-+
-+install ( FILES
-+ ui/kdhorizontalline.h
-+ ui/messagebox.h
-+ ui/progressbar.h
-+ ui/progressdialog.h
-+ ui/keylistview.h
-+ ui/keyselectiondialog.h
-+ ui/keyrequester.h
-+ ui/keyapprovaldialog.h
-+ ui/dnattributeorderconfigwidget.h
-+ ui/cryptoconfigmodule.h
-+ ui/cryptoconfigdialog.h
-+ ui/directoryserviceswidget.h
-+ ui/filenamerequester.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/kleo/ui COMPONENT Devel)
-diff -uarN kdepim-15.08.0.orig/libkpgp/CMakeLists.txt kdepim-15.08.0/libkpgp/CMakeLists.txt
---- kdepim-15.08.0.orig/libkpgp/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/libkpgp/CMakeLists.txt 2015-08-24 23:04:02.505074051 +0200
-@@ -44,6 +44,15 @@
- set_target_properties(kpgp PROPERTIES VERSION ${KDEPIM_LIB_VERSION} SOVERSION ${KDEPIM_LIB_SOVERSION})
- install(TARGETS kpgp ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-
-+install(FILES
-+ kpgp.h
-+ kpgpbase.h
-+ kpgpblock.h
-+ kpgpkey.h
-+ kpgpui.h
-+ libkpgp_export.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/kpgp COMPONENT Devel )
-+
- if(BUILD_TESTING)
- add_subdirectory( tests )
- endif()
diff --git a/kde/patch/kdepimlibs.patch b/kde/patch/kdepimlibs.patch
deleted file mode 100644
index 05e5dfe..0000000
--- a/kde/patch/kdepimlibs.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix a crash in kmail (fixed in 15.12.1):
-#cat $CWD/patch/kdepimlibs/kdepimlibs_kmail_crash.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch b/kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch
deleted file mode 100644
index 1614e07..0000000
--- a/kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From: Weng Xuetian <wengxt@gmail.com>
-Date: Thu, 17 Dec 2015 16:19:36 +0000
-Subject: Fix possible crash upon application exits (e.g. kmail)
-X-Git-Url: http://quickgit.kde.org/?p=kdepimlibs.git&a=commitdiff&h=c6bf33a9018587e96a350bfd0b2bffde1859db27
----
-Fix possible crash upon application exits (e.g. kmail)
-
-Qt lambda connection will not automatically disconnect if no context
-qobject is provided. Since SessionPrivate is not a qobject, disconnect
-the connection in the destructor to prevent accessing deleted object.
-
-REVIEW: 126395
----
-
-
---- a/akonadi/src/core/session.cpp
-+++ b/akonadi/src/core/session.cpp
-@@ -301,15 +301,16 @@
- // Shutdown the thread before QApplication event loop quits - the
- // thread()->wait() mechanism in ConnectionThread dtor crashes sometimes
- // when called from QApplication destructor
-- QObject::connect(qApp, &QCoreApplication::aboutToQuit,
-- [this]() {
-- delete connThread;
-- connThread = Q_NULLPTR;
-- });
-+ connThreadCleanUp = QObject::connect(qApp, &QCoreApplication::aboutToQuit,
-+ [this]() {
-+ delete connThread;
-+ connThread = Q_NULLPTR;
-+ });
- }
-
- SessionPrivate::~SessionPrivate()
- {
-+ QObject::disconnect(connThreadCleanUp);
- delete connThread;
- }
-
-
---- a/akonadi/src/core/session_p.h
-+++ b/akonadi/src/core/session_p.h
-@@ -29,6 +29,7 @@
-
- #include <QtCore/QQueue>
- #include <QtCore/QThreadStorage>
-+#include <QtCore/QMetaObject>
- #include <QFile>
-
- class QIODevice;
-@@ -125,6 +126,7 @@
- Session *mParent;
- QThread *thread;
- ConnectionThread *connThread;
-+ QMetaObject::Connection connThreadCleanUp;
- QByteArray sessionId;
- bool connected;
- qint64 theNextTag;
-
diff --git a/kde/patch/kdepimlibs4.patch b/kde/patch/kdepimlibs4.patch
deleted file mode 100644
index 91a7d15..0000000
--- a/kde/patch/kdepimlibs4.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix a compilation issue with new libical:
-cat $CWD/patch/kdepimlibs4/kdepimlibs.libical3.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdepimlibs4/kdepimlibs.libical3.diff b/kde/patch/kdepimlibs4/kdepimlibs.libical3.diff
deleted file mode 100644
index c3b8caf..0000000
--- a/kde/patch/kdepimlibs4/kdepimlibs.libical3.diff
+++ /dev/null
@@ -1,184 +0,0 @@
---- ./kcalcore/icalformat_p.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcalcore/icalformat_p.cpp 2017-12-05 23:03:44.742261940 -0600
-@@ -2301,7 +2301,6 @@
- t.second = 0;
-
- t.is_date = 1;
-- t.is_utc = 0;
- t.zone = 0;
-
- return t;
-@@ -2322,8 +2321,7 @@
- t.minute = datetime.time().minute();
- t.second = datetime.time().second();
- }
-- t.zone = 0; // zone is NOT set
-- t.is_utc = datetime.isUtc() ? 1 : 0;
-+ t.zone = datetime.isUtc() ? icaltimezone_get_utc_timezone() : 0; // zone is NOT set
-
- // _dumpIcaltime( t );
-
-@@ -2398,7 +2396,7 @@
- }
-
- KTimeZone ktz;
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc( t )) {
- ktz = dt.timeZone();
- }
-
-@@ -2431,7 +2429,7 @@
- // _dumpIcaltime( t );
-
- KDateTime::Spec timeSpec;
-- if (t.is_utc || t.zone == icaltimezone_get_utc_timezone()) {
-+ if (icaltime_is_utc( t ) || t.zone == icaltimezone_get_utc_timezone()) {
- timeSpec = KDateTime::UTC; // the time zone is UTC
- utc = false; // no need to convert to UTC
- } else {
---- ./kcalcore/icaltimezones.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcalcore/icaltimezones.cpp 2017-12-05 23:03:55.482262829 -0600
-@@ -54,7 +54,7 @@
- {
- return QDateTime(QDate(t.year, t.month, t.day),
- QTime(t.hour, t.minute, t.second),
-- (t.is_utc ? Qt::UTC : Qt::LocalTime));
-+ (icaltime_is_utc( t ) ? Qt::UTC : Qt::LocalTime));
- }
-
- // Maximum date for time zone data.
-@@ -81,7 +81,6 @@
- t.second = local.time().second();
- t.is_date = 0;
- t.zone = 0;
-- t.is_utc = 0;
- return t;
- }
-
-@@ -886,7 +885,7 @@
- case ICAL_LASTMODIFIED_PROPERTY:
- {
- const icaltimetype t = icalproperty_get_lastmodified(p);
-- if (t.is_utc) {
-+ if (icaltime_is_utc( t )) {
- data->d->lastModified = toQDateTime(t);
- } else {
- kDebug() << "LAST-MODIFIED not UTC";
-@@ -1259,7 +1258,7 @@
- // Convert DTSTART to QDateTime, and from local time to UTC
- const QDateTime localStart = toQDateTime(dtstart); // local time
- dtstart.second -= prevOffset;
-- dtstart.is_utc = 1;
-+ dtstart.zone = icaltimezone_get_utc_timezone();
- const QDateTime utcStart = toQDateTime(icaltime_normalize(dtstart)); // UTC
-
- transitions += utcStart;
-@@ -1286,13 +1285,13 @@
- t.minute = dtstart.minute;
- t.second = dtstart.second;
- t.is_date = 0;
-- t.is_utc = 0; // dtstart is in local time
-+ t.zone = 0; // dtstart is in local time
- }
- // RFC2445 states that RDATE must be in local time,
- // but we support UTC as well to be safe.
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc( t )) {
- t.second -= prevOffset; // convert to UTC
-- t.is_utc = 1;
-+ t.zone = icaltimezone_get_utc_timezone();
- t = icaltime_normalize(t);
- }
- transitions += toQDateTime(t);
---- ./kcal/icalformat_p.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcal/icalformat_p.cpp 2017-12-05 23:04:01.670263342 -0600
-@@ -2087,7 +2087,6 @@
- t.second = 0;
-
- t.is_date = 1;
-- t.is_utc = 0;
- t.zone = 0;
-
- return t;
-@@ -2106,8 +2105,7 @@
- t.second = datetime.time().second();
-
- t.is_date = 0;
-- t.zone = 0; // zone is NOT set
-- t.is_utc = datetime.isUtc() ? 1 : 0;
-+ t.zone = datetime.isUtc() ? icaltimezone_get_utc_timezone() : 0;
-
- // _dumpIcaltime( t );
-
-@@ -2174,7 +2172,7 @@
- }
-
- KTimeZone ktz;
-- if ( !t.is_utc ) {
-+ if ( !icaltime_is_utc( t ) ) {
- ktz = dt.timeZone();
- }
-
-@@ -2207,7 +2205,7 @@
- // _dumpIcaltime( t );
-
- KDateTime::Spec timeSpec;
-- if ( t.is_utc || t.zone == icaltimezone_get_utc_timezone() ) {
-+ if ( icaltime_is_utc( t ) || t.zone == icaltimezone_get_utc_timezone() ) {
- timeSpec = KDateTime::UTC; // the time zone is UTC
- utc = false; // no need to convert to UTC
- } else {
---- ./kcal/icaltimezones.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcal/icaltimezones.cpp 2017-12-05 23:04:07.385263815 -0600
-@@ -50,7 +50,7 @@
- {
- return QDateTime( QDate( t.year, t.month, t.day ),
- QTime( t.hour, t.minute, t.second ),
-- ( t.is_utc ? Qt::UTC : Qt::LocalTime ) );
-+ ( icaltime_is_utc( t ) ? Qt::UTC : Qt::LocalTime ) );
- }
-
- // Maximum date for time zone data.
-@@ -77,7 +77,6 @@
- t.second = local.time().second();
- t.is_date = 0;
- t.zone = 0;
-- t.is_utc = 0;
- return t;
- }
-
-@@ -787,7 +786,7 @@
- case ICAL_LASTMODIFIED_PROPERTY:
- {
- icaltimetype t = icalproperty_get_lastmodified(p);
-- if ( t.is_utc ) {
-+ if ( icaltime_is_utc( t ) ) {
- data->d->lastModified = toQDateTime( t );
- } else {
- kDebug() << "LAST-MODIFIED not UTC";
-@@ -972,7 +971,7 @@
- // Convert DTSTART to QDateTime, and from local time to UTC
- QDateTime localStart = toQDateTime( dtstart ); // local time
- dtstart.second -= prevOffset;
-- dtstart.is_utc = 1;
-+ dtstart.zone = icaltimezone_get_utc_timezone();
- QDateTime utcStart = toQDateTime( icaltime_normalize( dtstart ) ); // UTC
-
- transitions += utcStart;
-@@ -999,13 +998,13 @@
- t.minute = dtstart.minute;
- t.second = dtstart.second;
- t.is_date = 0;
-- t.is_utc = 0; // dtstart is in local time
-+ t.zone = 0; // dtstart is in local time
- }
- // RFC2445 states that RDATE must be in local time,
- // but we support UTC as well to be safe.
-- if ( !t.is_utc ) {
-+ if ( !icaltime_is_utc( t ) ) {
- t.second -= prevOffset; // convert to UTC
-- t.is_utc = 1;
-+ t.zone = icaltimezone_get_utc_timezone();
- t = icaltime_normalize( t );
- }
- transitions += toQDateTime( t );
diff --git a/kde/patch/kdeplasma-addons.patch b/kde/patch/kdeplasma-addons.patch
deleted file mode 100644
index 8c997b2..0000000
--- a/kde/patch/kdeplasma-addons.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# CVE 2013-2120: paste widget "password" generator uses insecure randomness:
-# Fixed in KDE 4.11.
-#cat $CWD/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch b/kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch
deleted file mode 100644
index 7a394a5..0000000
--- a/kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Aaron Seigo <aseigo@kde.org>
-Date: Mon, 03 Jun 2013 17:16:32 +0000
-Subject: use KRandom, avoid modulo bias
-X-Git-Url: http://quickgit.kde.org/?p=kdeplasma-addons.git&a=commitdiff&h=36a1fe49cb70f717c4a6e9eeee2c9186503a8dce
----
-use KRandom, avoid modulo bias
----
-
-
---- a/applets/paste/pastemacroexpander.cpp
-+++ b/applets/paste/pastemacroexpander.cpp
-@@ -27,6 +27,7 @@
- #include <KDebug>
- #include <KLocale>
- #include <KMessageBox>
-+#include <KRandom>
-
- class PasteMacroExpanderSingleton
- {
-@@ -142,35 +143,49 @@
- << "01234567890"
- << "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
-
-- int charCount;
-+ int charCount = 8;
- QString chars;
- QString result;
-
- if (a.count() > 0) {
-- charCount = qMax(a[0].trimmed().toInt(), 1);
-- } else {
-- charCount = 8;
-+ charCount = qMax(a[0].trimmed().toInt(), 8);
- }
-+
- if (a.count() < 2) {
- chars = characterSets.join("");
- }
-+
- if (a.count() > 1) {
- chars += (a[1].trimmed() == "true") ? characterSets[0] : "";
- }
-+
- if (a.count() > 2) {
- chars += (a[2].trimmed() == "true") ? characterSets[1] : "";
- }
-+
- if (a.count() > 3) {
- chars += (a[3].trimmed() == "true") ? characterSets[2] : "";
- }
-+
- if (a.count() > 4) {
- chars += (a[4].trimmed() == "true") ? characterSets[3] : "";
- }
-
-- QDateTime now = QDateTime::currentDateTime();
-- qsrand(now.toTime_t() / now.time().msec());
-+ const int setSize = chars.count();
-+ const int top = (RAND_MAX / setSize) * setSize;
-+ kDebug() << "topping out at " << setSize << RAND_MAX << top;
- for (int i = 0; i < charCount; ++i) {
-- result += chars[qrand() % chars.count()];
-+ // to prevent modulo bias, discard random numbers at the
-+ // 'top end' of INT_MAX
-+ int rand = -1;
-+ do {
-+ if (rand > 0) {
-+ kDebug() << "Ha!" << rand;
-+ }
-+ rand = KRandom::random();
-+ } while (rand >= top);
-+
-+ result += chars[rand % setSize];
- }
- //kDebug() << result;
- return result;
diff --git a/kde/patch/kdesdk-kioslaves.patch b/kde/patch/kdesdk-kioslaves.patch
deleted file mode 100644
index da2f885..0000000
--- a/kde/patch/kdesdk-kioslaves.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix compilation against svn > 1.8.
-#cat $CWD/patch/kdesdk-kioslaves/svn19.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdesdk-kioslaves/svn19.patch b/kde/patch/kdesdk-kioslaves/svn19.patch
deleted file mode 100644
index dbd057d..0000000
--- a/kde/patch/kdesdk-kioslaves/svn19.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-Subversion 1.9 and more recent versions have removed some interfaces, which
-the Subversion developers consider to serve only svn-internal purposes, from
-the header files installed by the package.
-
-The following patch (orignally from pkgsrc) provides an own sort mechanism
-to replace the no longer available svn_sort__hash functionality.
-
---- kdesdk-kioslaves-15.08.3/svn/svn.cpp.orig 2015-09-20 17:51:35.000000000 +0000
-+++ kdesdk-kioslaves-15.08.3/svn/svn.cpp
-@@ -54,6 +54,8 @@
- #include "svn.h"
- #include <apr_portable.h>
-
-+#include <algorithm>
-+
- using namespace KIO;
-
- typedef struct
-@@ -107,11 +109,6 @@ static svn_error_t *write_to_string(void
- return SVN_NO_ERROR;
- }
-
--static int
--compare_items_as_paths (const svn_sort__item_t*a, const svn_sort__item_t*b) {
-- return svn_path_compare_paths ((const char *)a->key, (const char *)b->key);
--}
--
- kio_svnProtocol::kio_svnProtocol(const QByteArray &pool_socket, const QByteArray &app_socket)
- : SlaveBase("kio_svn", pool_socket, app_socket) {
- kDebug(7128) << "kio_svnProtocol::kio_svnProtocol()";
-@@ -515,6 +512,11 @@ void kio_svnProtocol::stat(const KUrl &
- svn_pool_destroy( subpool );
- }
-
-+static bool
-+sort_by_path(const std::pair<const char *, svn_dirent_t *> &a, const std::pair<const char *, svn_dirent_t *> &b) {
-+ return svn_path_compare_paths(a.first, b.first) < 0;
-+}
-+
- void kio_svnProtocol::listDir(const KUrl& url) {
- kDebug(7128) << "kio_svn::listDir(const KUrl& url) : " << url.url();
-
-@@ -547,23 +549,23 @@ void kio_svnProtocol::listDir(const KUrl
- return;
- }
-
-- apr_array_header_t *array;
-- int i;
--
-- array = svn_sort__hash (dirents, compare_items_as_paths, subpool);
-+ std::vector<std::pair<const char *, svn_dirent_t *> > array;
-+ for (apr_hash_index_t *hi = apr_hash_first(subpool, dirents); hi; hi = apr_hash_next(hi)) {
-+ const void *key;
-+ void *data;
-+ apr_hash_this(hi, &key, NULL, &data);
-+ array.push_back(std::make_pair(reinterpret_cast<const char *>(key), reinterpret_cast<svn_dirent_t *>(data)));
-+ }
-+ std::sort(array.begin(), array.end(), sort_by_path);
-
-- UDSEntry entry;
-- for (i = 0; i < array->nelts; ++i) {
-+ UDSEntry entry;
-+ for (size_t i = 0; i < array.size(); ++i) {
- entry.clear();
- const char *utf8_entryname, *native_entryname;
- svn_dirent_t *dirent;
-- svn_sort__item_t *item;
-
-- item = &APR_ARRAY_IDX (array, i, svn_sort__item_t);
--
-- utf8_entryname = (const char*)item->key;
--
-- dirent = (svn_dirent_t*)apr_hash_get (dirents, utf8_entryname, item->klen);
-+ utf8_entryname = array[i].first;
-+ dirent = array[i].second;
-
- svn_utf_cstring_from_utf8 (&native_entryname, utf8_entryname, subpool);
- const char *native_author = NULL;
-@@ -577,7 +579,7 @@ void kio_svnProtocol::listDir(const KUrl
- if ( createUDSEntry(QString( native_entryname ), QString( native_author ), dirent->size,
- dirent->kind==svn_node_dir ? true : false, mtime, entry) )
- listEntry( entry, false );
-- }
-+ }
- listEntry( entry, true );
-
- finished();
diff --git a/kde/patch/kdev-python.patch b/kde/patch/kdev-python.patch
deleted file mode 100644
index a86d07a..0000000
--- a/kde/patch/kdev-python.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix compilation against Python 3.8.
-# Fixed in 5.5.0.
-#cat $CWD/patch/kdev-python/kdev-python-5.4.4_python38.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdev-python/kdev-python-5.4.4_python38.patch b/kde/patch/kdev-python/kdev-python-5.4.4_python38.patch
deleted file mode 100644
index 572c9da..0000000
--- a/kde/patch/kdev-python/kdev-python-5.4.4_python38.patch
+++ /dev/null
@@ -1,560 +0,0 @@
-From e23fa8f15af89a8bd4bd84dd96b5fd7017457516 Mon Sep 17 00:00:00 2001
-From: Francis Herne <mail@flherne.uk>
-Date: Fri, 20 Sep 2019 00:41:29 +0100
-Subject: [PATCH] Initial Python 3.8 support.
-
-This allows kdev-python to be built and run against CPython 3.8,
- and if so to parse files containing 3.8 syntax.
-
-BUG: 411956
-FIXED-IN: 5.5.0
----
- CMakeLists.txt | 4 +-
- duchain/declarationbuilder.cpp | 10 ++++-
- duchain/declarationbuilder.h | 1 +
- duchain/expressionvisitor.cpp | 4 ++
- duchain/expressionvisitor.h | 1 +
- duchain/tests/pyduchaintest.cpp | 19 +++++++++
- parser/ast.cpp | 7 +++-
- parser/ast.h | 9 ++++
- parser/astbuilder.cpp | 6 +++
- parser/astdefaultvisitor.cpp | 6 +++
- parser/astdefaultvisitor.h | 2 +
- parser/astvisitor.cpp | 1 +
- parser/astvisitor.h | 1 +
- parser/conversionGenerator.py | 11 +++--
- parser/generated.h | 36 ++++++++++++++++
- parser/{python36.sdef => python38.sdef} | 55 ++++++++++++++++++++++---
- parser/tests/pyasttest.cpp | 5 +++
- 17 files changed, 164 insertions(+), 14 deletions(-)
- rename parser/{python36.sdef => python38.sdef} (82%)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 6f9e465b..09b089dd 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -31,7 +31,7 @@ add_definitions( -DTRANSLATION_DOMAIN=\"kdevpython\" )
-
- # CMake looks for exactly the specified version first and ignores newer versions.
- # To avoid that, start looking for the newest supported version and work down.
--set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4)
-+set(Python_ADDITIONAL_VERSIONS 3.8 3.7 3.6 3.5 3.4)
- foreach(_PYTHON_V ${Python_ADDITIONAL_VERSIONS})
- find_package(PythonInterp ${_PYTHON_V})
- if ( PYTHONINTERP_FOUND )
-@@ -49,7 +49,7 @@ if ( PYTHONINTERP_FOUND AND PYTHON_VERSION_STRING VERSION_GREATER "3.4" )
- endif()
-
- if ( NOT PYTHONLIBS_FOUND OR PYTHONLIBS_VERSION_STRING VERSION_LESS "3.4.3" )
-- message(FATAL_ERROR "Python >= 3.4.3 but < 3.8 with --enable-shared is required to build kdev-python")
-+ message(FATAL_ERROR "Python >= 3.4.3 but < 3.9 with --enable-shared is required to build kdev-python")
- endif()
-
- configure_file(kdevpythonversion.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/kdevpythonversion.h" @ONLY)
-diff --git a/duchain/declarationbuilder.cpp b/duchain/declarationbuilder.cpp
-index e3cb2b9c..61e144c5 100644
---- a/duchain/declarationbuilder.cpp
-+++ b/duchain/declarationbuilder.cpp
-@@ -1354,6 +1354,14 @@ void DeclarationBuilder::visitAnnotationAssignment(AnnotationAssignmentAst* node
- assignToUnknown(node->target, assignType);
- }
-
-+void DeclarationBuilder::visitAssignmentExpression(AssignmentExpressionAst* node) {
-+ AstDefaultVisitor::visitAssignmentExpression(node);
-+
-+ ExpressionVisitor v(currentContext());
-+ v.visitNode(node->value);
-+ assignToUnknown(node->target, v.lastType());
-+}
-+
- void DeclarationBuilder::visitClassDefinition( ClassDefinitionAst* node )
- {
- visitNodeList(node->decorators);
-@@ -1745,7 +1753,7 @@ void DeclarationBuilder::visitArguments( ArgumentsAst* node )
- int parametersCount = node->arguments.length();
- int firstDefaultParameterOffset = parametersCount - defaultParametersCount;
- int currentIndex = 0;
-- foreach ( ArgAst* arg, node->arguments + node->kwonlyargs ) {
-+ foreach ( ArgAst* arg, node->posonlyargs + node->arguments + node->kwonlyargs ) {
- // Iterate over all the function's arguments, create declarations, and add the arguments
- // to the functions FunctionType.
- currentIndex += 1;
-diff --git a/duchain/declarationbuilder.h b/duchain/declarationbuilder.h
-index adee6d6d..1992b781 100644
---- a/duchain/declarationbuilder.h
-+++ b/duchain/declarationbuilder.h
-@@ -90,6 +90,7 @@ class KDEVPYTHONDUCHAIN_EXPORT DeclarationBuilder: public DeclarationBuilderBase
- void visitFunctionDefinition(FunctionDefinitionAst* node) override;
- void visitAssignment(AssignmentAst* node) override;
- void visitAnnotationAssignment(AnnotationAssignmentAst* node) override;
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override;
- void visitFor(ForAst* node) override;
- void visitImport(ImportAst* node) override;
- void visitImportFrom(ImportFromAst* node) override;
-diff --git a/duchain/expressionvisitor.cpp b/duchain/expressionvisitor.cpp
-index 5c5286ae..055c5b49 100644
---- a/duchain/expressionvisitor.cpp
-+++ b/duchain/expressionvisitor.cpp
-@@ -757,5 +757,9 @@ void ExpressionVisitor::visitBooleanOperation(Python::BooleanOperationAst* node)
- encounter(result);
- }
-
-+void ExpressionVisitor::visitAssignmentExpression(Python::AssignmentExpressionAst* node) {
-+ visitNode(node->value);
-+}
-+
- }
-
-diff --git a/duchain/expressionvisitor.h b/duchain/expressionvisitor.h
-index 25ca2319..a56481ad 100644
---- a/duchain/expressionvisitor.h
-+++ b/duchain/expressionvisitor.h
-@@ -81,6 +81,7 @@ class KDEVPYTHONDUCHAIN_EXPORT ExpressionVisitor : public AstDefaultVisitor, pub
- void visitSetComprehension(SetComprehensionAst* node) override;
- void visitIfExpression(IfExpressionAst* node) override;
- void visitNameConstant(NameConstantAst* node) override;
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override;
-
- /**
- * @brief Checks for magic docstrings that override a call's return type.
-diff --git a/duchain/tests/pyduchaintest.cpp b/duchain/tests/pyduchaintest.cpp
-index 7142ed2b..17ba34e5 100644
---- a/duchain/tests/pyduchaintest.cpp
-+++ b/duchain/tests/pyduchaintest.cpp
-@@ -838,6 +838,7 @@ void PyDUChainTest::testTypes()
- QEXPECT_FAIL("init_class_no_decl", "aliasing info lost", Continue);
- QEXPECT_FAIL("property_wrong", "visitCall uses declaration if no type", Continue);
- QEXPECT_FAIL("property_setter", "very basic property support", Continue);
-+ QEXPECT_FAIL("assignment_expr_context", "not implemented", Continue);
- QCOMPARE(visitor->found, true);
- }
-
-@@ -1302,6 +1303,21 @@ void PyDUChainTest::testTypes_data()
- " def foo(self, ccc=aaa, ddd=bbb):\n" // self.bbb is visible here, Foo().aaa isn't.
- " return ccc, ddd\n"
- "checkme = Foo().Bar().foo()\n" << "tuple of (str, int)";
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ QTest::newRow("assignment_expr_while") <<
-+ "file = open('foo.txt')\n"
-+ "while q := file.readline():\n"
-+ " checkme = q\n" << "str";
-+ QTest::newRow("assignment_expr_comprehension") <<
-+ "checkme = [z for q in (1, 2, 3) if (z := q % 2)]" << "list of int";
-+ QTest::newRow("assignment_expr_context") <<
-+ "a = [z for q in (1, 2, 3) if (z := q % 2)]\n"
-+ "checkme = z" << "int";
-+ QTest::newRow("positional_params") <<
-+ "def foo(a, b, /, c, d):\n"
-+ " return a, b, c, d\n"
-+ "checkme = foo(10, 'x', 2.3, d='y')\n" << "tuple of (int, str, float, str)";
-+#endif
- }
-
- typedef QPair<Declaration*, int> pair;
-@@ -1780,6 +1796,9 @@ void PyDUChainTest::testVariableCreation_data()
- << QStringList{"int", "int", "float"};
- QTest::newRow("for_loop_tuple") << "for a in 1, 2: pass" << QStringList{"a"} << QStringList{"int"};
- QTest::newRow("for_loop_dict") << "for a in {'foo': 1}: pass" << QStringList{"a"} << QStringList{"str"};
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ QTest::newRow("assignment_expr") << "a = (b := 10)" << QStringList{"a", "b"} << QStringList{"int", "int"};
-+#endif
- }
-
- void PyDUChainTest::testCleanupMultiplePasses()
-diff --git a/parser/ast.cpp b/parser/ast.cpp
-index 9892b184..cd570d36 100644
---- a/parser/ast.cpp
-+++ b/parser/ast.cpp
-@@ -163,6 +163,11 @@ ExpressionAst::ExpressionAst(Ast* parent, AstType type): Ast(parent, type), valu
-
- }
-
-+AssignmentExpressionAst::AssignmentExpressionAst(Ast* parent): ExpressionAst(parent, Ast::AssignmentExpressionAstType), value(nullptr)
-+{
-+
-+}
-+
- YieldFromAst::YieldFromAst(Ast* parent) : ExpressionAst(parent, Ast::YieldFromAstType)
- {
-
-@@ -248,7 +253,7 @@ NameConstantAst::NameConstantAst(Ast* parent): ExpressionAst(parent, Ast::NameCo
-
- }
-
--NumberAst::NumberAst(Ast* parent): ExpressionAst(parent, Ast::NumberAstType), value(0)
-+NumberAst::NumberAst(Ast* parent): ExpressionAst(parent, Ast::NumberAstType), value(0), isInt(false)
- {
-
- }
-diff --git a/parser/ast.h b/parser/ast.h
-index 378af0bd..65fef1cd 100644
---- a/parser/ast.h
-+++ b/parser/ast.h
-@@ -131,6 +131,7 @@ class KDEVPYTHONPARSER_EXPORT Ast
- SliceAstType,
- EllipsisAstType,
- IndexAstType,
-+ AssignmentExpressionAstType,
- LastExpressionType, // keep this at the end of the expr ast list
-
- CodeAstType,
-@@ -457,6 +458,13 @@ class KDEVPYTHONPARSER_EXPORT ExpressionAst : public Ast {
- ExpressionAst* value; // WARNING this is not set in most cases!
- };
-
-+class KDEVPYTHONPARSER_EXPORT AssignmentExpressionAst : public ExpressionAst {
-+public:
-+ AssignmentExpressionAst(Ast* parent);
-+ ExpressionAst* target;
-+ ExpressionAst* value;
-+};
-+
- class KDEVPYTHONPARSER_EXPORT AwaitAst : public ExpressionAst {
- public:
- AwaitAst(Ast* parent);
-@@ -743,6 +751,7 @@ class KDEVPYTHONPARSER_EXPORT ArgumentsAst : public Ast {
- ArgumentsAst(Ast* parent);
- QList<ArgAst*> arguments;
- QList<ArgAst*> kwonlyargs;
-+ QList<ArgAst*> posonlyargs;
- QList<ExpressionAst*> defaultValues;
- ArgAst* vararg;
- ArgAst* kwarg;
-diff --git a/parser/astbuilder.cpp b/parser/astbuilder.cpp
-index a1ccd68d..ad2e0dce 100644
---- a/parser/astbuilder.cpp
-+++ b/parser/astbuilder.cpp
-@@ -101,7 +101,13 @@ CodeAst::Ptr AstBuilder::parse(const QUrl& filename, QString &contents)
- PythonInitializer pyIniter(pyInitLock);
- PyArena* arena = pyIniter.arena;
-
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ PyCompilerFlags flags;
-+ flags.cf_flags = PyCF_SOURCE_IS_UTF8 | PyCF_IGNORE_COOKIE | PyCF_ONLY_AST;
-+ flags.cf_feature_version = 7;
-+#else
- PyCompilerFlags flags = {PyCF_SOURCE_IS_UTF8 | PyCF_IGNORE_COOKIE};
-+#endif
-
- CythonSyntaxRemover cythonSyntaxRemover;
-
-diff --git a/parser/astdefaultvisitor.cpp b/parser/astdefaultvisitor.cpp
-index 5db1f6f1..cdd31bbf 100644
---- a/parser/astdefaultvisitor.cpp
-+++ b/parser/astdefaultvisitor.cpp
-@@ -292,6 +292,12 @@ void AstDefaultVisitor::visitAnnotationAssignment(AnnotationAssignmentAst* node)
- visitNode(node->value);
- }
-
-+void AstDefaultVisitor::visitAssignmentExpression(AssignmentExpressionAst* node)
-+{
-+ visitNode(node->target);
-+ visitNode(node->value);
-+}
-+
- void AstDefaultVisitor::visitBinaryOperation(BinaryOperationAst* node)
- {
- visitNode(node->lhs);
-diff --git a/parser/astdefaultvisitor.h b/parser/astdefaultvisitor.h
-index e8e0d3de..aa1f540c 100644
---- a/parser/astdefaultvisitor.h
-+++ b/parser/astdefaultvisitor.h
-@@ -49,6 +49,7 @@ class KDEVPYTHONPARSER_EXPORT AstDefaultVisitor : public AstVisitor
- void visitAssignment(AssignmentAst* node) override;
- void visitAugmentedAssignment(AugmentedAssignmentAst* node) override;
- void visitAnnotationAssignment(AnnotationAssignmentAst* node) override;
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override;
- void visitFor(ForAst* node) override;
- void visitWhile(WhileAst* node) override;
- void visitIf(IfAst* node) override;
-@@ -122,6 +123,7 @@ class KDEVPYTHONPARSER_EXPORT AstFreeVisitor : public AstDefaultVisitor {
- void visitAssignment(AssignmentAst* node) override { AstDefaultVisitor::visitAssignment(node); delete node; }
- void visitAugmentedAssignment(AugmentedAssignmentAst* node) override { AstDefaultVisitor::visitAugmentedAssignment(node); delete node; }
- void visitAnnotationAssignment(AnnotationAssignmentAst* node) override { AstDefaultVisitor::visitAnnotationAssignment(node); delete node; }
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override { AstDefaultVisitor::visitAssignmentExpression(node); delete node; }
- void visitFor(ForAst* node) override { AstDefaultVisitor::visitFor(node); delete node; }
- void visitWhile(WhileAst* node) override { AstDefaultVisitor::visitWhile(node); delete node; }
- void visitIf(IfAst* node) override { AstDefaultVisitor::visitIf(node); delete node; }
-diff --git a/parser/astvisitor.cpp b/parser/astvisitor.cpp
-index ace7d619..51c5a1c5 100644
---- a/parser/astvisitor.cpp
-+++ b/parser/astvisitor.cpp
-@@ -47,6 +47,7 @@ void AstVisitor::visitNode(Ast* node)
- case Ast::AssignmentAstType: this->visitAssignment(static_cast<AssignmentAst*>(node)); break;
- case Ast::AugmentedAssignmentAstType: this->visitAugmentedAssignment(static_cast<AugmentedAssignmentAst*>(node)); break;
- case Ast::AnnotationAssignmentAstType: this->visitAnnotationAssignment(static_cast<AnnotationAssignmentAst*>(node)); break;
-+ case Ast::AssignmentExpressionAstType: this->visitAssignmentExpression(static_cast<AssignmentExpressionAst*>(node)); break;
- case Ast::ForAstType: this->visitFor(static_cast<ForAst*>(node)); break;
- case Ast::WhileAstType: this->visitWhile(static_cast<WhileAst*>(node)); break;
- case Ast::IfAstType: this->visitIf(static_cast<IfAst*>(node)); break;
-diff --git a/parser/astvisitor.h b/parser/astvisitor.h
-index 1908e9dd..51aa47b4 100644
---- a/parser/astvisitor.h
-+++ b/parser/astvisitor.h
-@@ -61,6 +61,7 @@ class KDEVPYTHONPARSER_EXPORT AstVisitor
- virtual void visitAssignment(AssignmentAst* node) { Q_UNUSED(node); };
- virtual void visitAugmentedAssignment(AugmentedAssignmentAst* node) { Q_UNUSED(node); };
- virtual void visitAnnotationAssignment(AnnotationAssignmentAst* node) { Q_UNUSED(node); };
-+ virtual void visitAssignmentExpression(AssignmentExpressionAst* node) { Q_UNUSED(node); };
- virtual void visitFor(ForAst* node) { Q_UNUSED(node); };
- virtual void visitWhile(WhileAst* node) { Q_UNUSED(node); };
- virtual void visitIf(IfAst* node) { Q_UNUSED(node); };
-diff --git a/parser/conversionGenerator.py b/parser/conversionGenerator.py
-index 9d65cc0d..66055953 100644
---- a/parser/conversionGenerator.py
-+++ b/parser/conversionGenerator.py
-@@ -9,7 +9,7 @@
-
- import sys
-
--contents = open('python36.sdef').read().replace("\n", "").split(';;')
-+contents = open('python38.sdef').read().replace("\n", "").split(';;')
-
- func_structure = '''
- Ast* visitNode(%{RULE_FOR}* node) {
-@@ -45,7 +45,6 @@
-
- switch_line = ''' case %{KIND}: {
- %{ACTIONS}
-- result = v;
- break;
- }'''
-
-@@ -139,6 +138,7 @@ def pluginAstToPythonAstType(plugintypestr):
- results[rule_for] = list()
-
- current_actions = list()
-+ created_v = False
- for action in actions:
- command = action.split('|')[0]
- try:
-@@ -204,14 +204,17 @@ def pluginAstToPythonAstType(plugintypestr):
- elif command == 'create':
- astType = arguments
- current_actions.append(create_ast_line.replace('%{AST_TYPE}', astType))
--
-+ created_v = True
-+
- if code:
- current_actions.append(code);
--
-+
- current_actions = "\n".join(current_actions)
- if kind == 'any':
- current_stmt = current_actions
- else:
-+ if created_v:
-+ current_actions += "\n result = v;"
- current_stmt = switch_line.replace('%{KIND}', kind).replace('%{ACTIONS}', current_actions)
- if before_version:
- version_cpp_if = ("#if PYTHON_VERSION < QT_VERSION_CHECK(%d, %d, 0)\n"
-diff --git a/parser/generated.h b/parser/generated.h
-index 9061deb0..e1136f84 100644
---- a/parser/generated.h
-+++ b/parser/generated.h
-@@ -76,12 +76,23 @@ class PythonAstTransformer {
- Ast* visitNode(_arguments* node) {
- bool ranges_copied = false; Q_UNUSED(ranges_copied);
- if ( ! node ) return nullptr;
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- ArgumentsAst* v = new ArgumentsAst(parent());
- nodeStack.push(v); v->vararg = static_cast<ArgAst*>(visitNode(node->vararg)); nodeStack.pop();
- nodeStack.push(v); v->kwarg = static_cast<ArgAst*>(visitNode(node->kwarg)); nodeStack.pop();
- nodeStack.push(v); v->arguments = visitNodeList<_arg, ArgAst>(node->args); nodeStack.pop();
- nodeStack.push(v); v->defaultValues = visitNodeList<_expr, ExpressionAst>(node->defaults); nodeStack.pop();
- nodeStack.push(v); v->kwonlyargs = visitNodeList<_arg, ArgAst>(node->kwonlyargs); nodeStack.pop();
-+#endif
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ ArgumentsAst* v = new ArgumentsAst(parent());
-+ nodeStack.push(v); v->vararg = static_cast<ArgAst*>(visitNode(node->vararg)); nodeStack.pop();
-+ nodeStack.push(v); v->kwarg = static_cast<ArgAst*>(visitNode(node->kwarg)); nodeStack.pop();
-+ nodeStack.push(v); v->arguments = visitNodeList<_arg, ArgAst>(node->args); nodeStack.pop();
-+ nodeStack.push(v); v->defaultValues = visitNodeList<_expr, ExpressionAst>(node->defaults); nodeStack.pop();
-+ nodeStack.push(v); v->kwonlyargs = visitNodeList<_arg, ArgAst>(node->kwonlyargs); nodeStack.pop();
-+ nodeStack.push(v); v->posonlyargs = visitNodeList<_arg, ArgAst>(node->posonlyargs); nodeStack.pop();
-+#endif
- return v;
- }
-
-@@ -280,18 +291,22 @@ class PythonAstTransformer {
- break;
- }
- #endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Num_kind: {
- NumberAst* v = new NumberAst(parent());
- v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);
- result = v;
- break;
- }
-+#endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Str_kind: {
- StringAst* v = new StringAst(parent());
- v->value = PyUnicodeObjectToQString(node->v.Str.s);
- result = v;
- break;
- }
-+#endif
- #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 6, 0)
- case JoinedStr_kind: {
- JoinedStringAst* v = new JoinedStringAst(parent());
-@@ -310,12 +325,14 @@ class PythonAstTransformer {
- break;
- }
- #endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Bytes_kind: {
- BytesAst* v = new BytesAst(parent());
- v->value = PyUnicodeObjectToQString(node->v.Bytes.s);
- result = v;
- break;
- }
-+#endif
- case Attribute_kind: {
- AttributeAst* v = new AttributeAst(parent());
- v->attribute = node->v.Attribute.attr ? new Python::Identifier(PyUnicodeObjectToQString(node->v.Attribute.attr)) : nullptr;
-@@ -374,23 +391,42 @@ class PythonAstTransformer {
- result = v;
- break;
- }
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Ellipsis_kind: {
- EllipsisAst* v = new EllipsisAst(parent());
- result = v;
- break;
- }
-+#endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case NameConstant_kind: {
- NameConstantAst* v = new NameConstantAst(parent());
- v->value = node->v.NameConstant.value == Py_None ? NameConstantAst::None : node->v.NameConstant.value == Py_False ? NameConstantAst::False : NameConstantAst::True;
- result = v;
- break;
- }
-+#endif
- case YieldFrom_kind: {
- YieldFromAst* v = new YieldFromAst(parent());
- nodeStack.push(v); v->value = static_cast<ExpressionAst*>(visitNode(node->v.YieldFrom.value)); nodeStack.pop();
- result = v;
- break;
- }
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ case Constant_kind: {
-+PyObject *value = node->v.Constant.value;if (value == Py_None) { NameConstantAst* v = new NameConstantAst(parent()); v->value = NameConstantAst::None; result = v;}else if (value == Py_True) { NameConstantAst* v = new NameConstantAst(parent()); v->value = NameConstantAst::True; result = v;}else if (value == Py_False) { NameConstantAst* v = new NameConstantAst(parent()); v->value = NameConstantAst::False; result = v;}else if (value->ob_type == &PyLong_Type) { NumberAst* v = new NumberAst(parent()); v->isInt = true; v->value = PyLong_AsLong(value); result = v;}else if (value->ob_type == &PyFloat_Type || value->ob_type == &PyComplex_Type) { result = new NumberAst(parent());}else if (value->ob_type == &PyUnicode_Type) { StringAst* v = new StringAst(parent()); v->value = PyUnicodeObjectToQString(value); result = v;}else if (value->ob_type == &PyBytes_Type) { result = new BytesAst(parent());}else if (value->ob_type == &PyEllipsis_Type) { result = new EllipsisAst(parent());}else { qWarning() << "Unhandled constant type: " << value->ob_type->tp_name; Q_ASSERT(false);};
-+ break;
-+ }
-+#endif
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ case NamedExpr_kind: {
-+ AssignmentExpressionAst* v = new AssignmentExpressionAst(parent());
-+ nodeStack.push(v); v->target = static_cast<ExpressionAst*>(visitNode(node->v.NamedExpr.target)); nodeStack.pop();
-+ nodeStack.push(v); v->value = static_cast<ExpressionAst*>(visitNode(node->v.NamedExpr.value)); nodeStack.pop();
-+ result = v;
-+ break;
-+ }
-+#endif
- default:
- qWarning() << "Unsupported _expr AST type: " << node->kind;
- Q_ASSERT(false);
-diff --git a/parser/python36.sdef b/parser/python38.sdef
-similarity index 82%
-rename from parser/python36.sdef
-rename to parser/python38.sdef
-index f53ff1c7..30d9f95a 100644
---- a/parser/python36.sdef
-+++ b/parser/python38.sdef
-@@ -73,20 +73,62 @@ if (node->v.Call.kwargs) {
- v->keywords.append(kwargs);
- nodeStack.pop();
- };;
--RULE_FOR _expr;KIND Num_kind;ACTIONS create|NumberAst;CODE v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);;
--RULE_FOR _expr;KIND Str_kind;ACTIONS create|StringAst set|value$>s;;
-+RULE_FOR _expr;KIND Num_kind;ACTIONS create|NumberAst;BEFORE 3.8;CODE v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);;
-+RULE_FOR _expr;KIND Str_kind;ACTIONS create|StringAst set|value$>s;BEFORE 3.8;;
- RULE_FOR _expr;KIND JoinedStr_kind;ACTIONS create|JoinedStringAst set|values=>ExpressionAst,values;SINCE 3.6;;
- RULE_FOR _expr;KIND FormattedValue_kind;ACTIONS create|FormattedValueAst set|value->ExpressionAst,value set|conversion:>conversion set|formatSpec->ExpressionAst,format_spec;SINCE 3.6;;
--RULE_FOR _expr;KIND Bytes_kind;ACTIONS create|BytesAst set|value$>s;;
-+RULE_FOR _expr;KIND Bytes_kind;ACTIONS create|BytesAst set|value$>s;BEFORE 3.8;;
- RULE_FOR _expr;KIND Attribute_kind;ACTIONS create|AttributeAst set|attribute~>attr set|value->ExpressionAst,value set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Subscript_kind;ACTIONS create|SubscriptAst set|value->ExpressionAst,value set|slice->SliceAst,slice set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Starred_kind;ACTIONS create|StarredAst set|value->ExpressionAst,value set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Name_kind;ACTIONS create|NameAst set|identifier~>id set|context*>Context,ctx;;
- RULE_FOR _expr;KIND List_kind;ACTIONS create|ListAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Tuple_kind;ACTIONS create|TupleAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
--RULE_FOR _expr;KIND Ellipsis_kind;ACTIONS create|EllipsisAst;;
--RULE_FOR _expr;KIND NameConstant_kind;ACTIONS create|NameConstantAst set|value_>value;;
-+RULE_FOR _expr;KIND Ellipsis_kind;ACTIONS create|EllipsisAst;BEFORE 3.8;;
-+RULE_FOR _expr;KIND NameConstant_kind;ACTIONS create|NameConstantAst set|value_>value;BEFORE 3.8;;
- RULE_FOR _expr;KIND YieldFrom_kind;ACTIONS create|YieldFromAst set|value->ExpressionAst,value;;
-+RULE_FOR _expr;KIND Constant_kind;ACTIONS;SINCE 3.8;CODE
-+PyObject *value = node->v.Constant.value;
-+if (value == Py_None) {
-+ NameConstantAst* v = new NameConstantAst(parent());
-+ v->value = NameConstantAst::None;
-+ result = v;
-+}
-+else if (value == Py_True) {
-+ NameConstantAst* v = new NameConstantAst(parent());
-+ v->value = NameConstantAst::True;
-+ result = v;
-+}
-+else if (value == Py_False) {
-+ NameConstantAst* v = new NameConstantAst(parent());
-+ v->value = NameConstantAst::False;
-+ result = v;
-+}
-+else if (value->ob_type == &PyLong_Type) {
-+ NumberAst* v = new NumberAst(parent());
-+ v->isInt = true;
-+ v->value = PyLong_AsLong(value);
-+ result = v;
-+}
-+else if (value->ob_type == &PyFloat_Type || value->ob_type == &PyComplex_Type) {
-+ result = new NumberAst(parent());
-+}
-+else if (value->ob_type == &PyUnicode_Type) {
-+ StringAst* v = new StringAst(parent());
-+ v->value = PyUnicodeObjectToQString(value);
-+ result = v;
-+}
-+else if (value->ob_type == &PyBytes_Type) {
-+ result = new BytesAst(parent());
-+}
-+else if (value->ob_type == &PyEllipsis_Type) {
-+ result = new EllipsisAst(parent());
-+}
-+else {
-+ qWarning() << "Unhandled constant type: " << value->ob_type->tp_name;
-+ Q_ASSERT(false);
-+};;
-+RULE_FOR _expr;KIND NamedExpr_kind;ACTIONS create|AssignmentExpressionAst set|target->ExpressionAst,target set|value->ExpressionAst,value;SINCE 3.8;;
-
- RULE_FOR _slice;KIND Slice_kind;ACTIONS create|SliceAst set|lower->ExpressionAst,lower set|upper->ExpressionAst,upper set|step->ExpressionAst,step;;
- RULE_FOR _slice;KIND ExtSlice_kind;ACTIONS create|ExtendedSliceAst set|dims=>SliceAst,dims;;
-@@ -95,7 +137,8 @@ RULE_FOR _slice;KIND Index_kind;ACTIONS create|IndexAst set|value->ExpressionAst
-
- RULE_FOR _comprehension;KIND any;ACTIONS create|ComprehensionAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|conditions=>ExpressionAst,ifs;;
- RULE_FOR _excepthandler;KIND ExceptHandler_kind;ACTIONS create|ExceptionHandlerAst set|type->ExpressionAst,type set|name~>name set|body=>Ast,body;;
--RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs;;
-+RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs;BEFORE 3.8;;
-+RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs set|posonlyargs=>ArgAst,posonlyargs;SINCE 3.8;;
- RULE_FOR _arg;KIND any;ACTIONS create|ArgAst set|argumentName~>arg set|annotation->ExpressionAst,annotation;;
- RULE_FOR _keyword;KIND any;ACTIONS create|KeywordAst set|argumentName~>arg set|value->ExpressionAst,value;;
- RULE_FOR _alias;KIND any;ACTIONS create|AliasAst set|name~>name set|asName~>asname;;
-diff --git a/parser/tests/pyasttest.cpp b/parser/tests/pyasttest.cpp
-index 4fd5f4eb..c28f6fce 100644
---- a/parser/tests/pyasttest.cpp
-+++ b/parser/tests/pyasttest.cpp
-@@ -238,6 +238,11 @@ void PyAstTest::testExpressions_data()
- " **{ext: self.res_extension for ext in self._rc_extensions + self._mc_extensions},\n"
- "}";
- #endif
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ QTest::newRow("assignment_expr_1") << "a = (b := 10)";
-+ QTest::newRow("assignment_expr_2") << "a = [q for z in (1, 2, 3) if (q := 2*z)]";
-+ QTest::newRow("positional_params") << "def foo(a, b, /, c, d, *, e): pass";
-+#endif
- }
-
- void PyAstTest::testCorrectedFuncRanges()
diff --git a/kde/patch/kdewebdev.patch b/kde/patch/kdewebdev.patch
deleted file mode 100644
index 4bbe65b..0000000
--- a/kde/patch/kdewebdev.patch
+++ /dev/null
@@ -1,6 +0,0 @@
-# Make it find tidy:
-cat $CWD/patch/kdewebdev/include-tidy.patch \
- | sed -e "s#/tmp/package-kdewebdev#${SLACK_KDE_BUILD_DIR}/$(echo ${module} |cut -f1 -d:)/package-kdewebdev#" \
- | patch -p0 --verbose \
- || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdewebdev/include-tidy.patch b/kde/patch/kdewebdev/include-tidy.patch
deleted file mode 100644
index fd4de94..0000000
--- a/kde/patch/kdewebdev/include-tidy.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- klinkstatus/src/tidy/tidyx.h.orig 2009-09-03 09:55:38.886267704 -0500
-+++ klinkstatus/src/tidy/tidyx.h 2009-09-03 09:57:29.032269520 -0500
-@@ -48,8 +48,8 @@
- Created 2002-07-11 by Charles Reitzel
- */
-
--#include <tidy.h>
--#include <buffio.h>
-+#include "/tmp/package-kdewebdev/usr/include/tidy/tidy.h"
-+#include "/tmp/package-kdewebdev/usr/include/tidy/buffio.h"
-
- #include <config-tidy.h>
-
diff --git a/kde/patch/kholidays.patch b/kde/patch/kholidays.patch
deleted file mode 100644
index ec8ad80..0000000
--- a/kde/patch/kholidays.patch
+++ /dev/null
@@ -1,8 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-# Fixed post Plasma 5.5.5.
-#cat $CWD/patch/kholidays/kholidays_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Revert depfreeze breaking merges (KF5_VERSION, cmake, PIM_VERSION).
-# Should be fixed in Applications > 16.12.3.
-#cat $CWD/patch/kholidays/kholidays_depfreeze_revert.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kholidays/kholidays_depfreeze_revert.patch b/kde/patch/kholidays/kholidays_depfreeze_revert.patch
deleted file mode 100644
index 316403a..0000000
--- a/kde/patch/kholidays/kholidays_depfreeze_revert.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 506bd08a6faf61c776beecb05f1acbe04223827a Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Fri, 10 Mar 2017 13:33:10 +0100
-Subject: Revert depfreeze breaking merges (KF5_VERSION, cmake, PIM_VERSION)
-
----
- CMakeLists.txt | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 05164db..e0b67b8 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -1,28 +1,28 @@
--cmake_minimum_required(VERSION 3.0)
--set(PIM_VERSION "5.4.40")
-+cmake_minimum_required(VERSION 2.8.12)
-
--project(KHolidays VERSION ${PIM_VERSION})
-+project(KHolidays)
-
- # ECM setup
--set(KF5_VERSION "5.31.0")
-+set(KF5_VERSION "5.28.0")
- find_package(ECM ${KF5_VERSION} CONFIG REQUIRED)
- set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
-
- include(GenerateExportHeader)
- include(ECMGenerateHeaders)
- include(ECMGeneratePriFile)
--include(CMakePackageConfigHelpers)
-+include(ECMPackageConfigHelpers)
- include(ECMSetupVersion)
- include(ECMPoQmTools)
- include(FeatureSummary)
- include(KDEInstallDirs)
- include(KDECMakeSettings)
- include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE)
--include(ECMCoverageOption)
-+
-+set(PIM_VERSION "5.4.3")
-
- set(KHOLIDAYS_LIB_VERSION ${PIM_VERSION})
-
--ecm_setup_version(PROJECT VARIABLE_PREFIX KHOLIDAYS
-+ecm_setup_version(${KHOLIDAYS_LIB_VERSION} VARIABLE_PREFIX KHOLIDAYS
- VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kholidays_version.h"
- PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5HolidaysConfigVersion.cmake"
- SOVERSION 5
-@@ -50,7 +50,7 @@ endif()
- ########### CMake Config Files ###########
- set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Holidays")
-
--configure_package_config_file(
-+ecm_configure_package_config_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/KF5HolidaysConfig.cmake.in"
- "${CMAKE_CURRENT_BINARY_DIR}/KF5HolidaysConfig.cmake"
- INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
---
-cgit v0.11.2
-
diff --git a/kde/patch/kholidays/kholidays_isnan.patch b/kde/patch/kholidays/kholidays_isnan.patch
deleted file mode 100644
index 55e79aa..0000000
--- a/kde/patch/kholidays/kholidays_isnan.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Milian Wolff <milian.wolff@kdab.com>
-Date: Mon, 07 Mar 2016 09:58:37 +0000
-Subject: Fix compile with clang: isnan is in the std namespace when including cmath.
-X-Git-Url: http://quickgit.kde.org/?p=kholidays.git&a=commitdiff&h=488aa158f7a0a99604a13a897a11388c02f8d39e
----
-Fix compile with clang: isnan is in the std namespace when including cmath.
----
-
-
---- a/src/sunriseset.cpp
-+++ b/src/sunriseset.cpp
-@@ -180,7 +180,7 @@
- double hourAngle = calcHourAngleSunrise(latitude, solarDec);
- double delta = longitude + radToDeg(hourAngle);
- QTime timeUTC(0, 0);
-- if (isnan(delta))
-+ if (std::isnan(delta))
- return timeUTC;
- timeUTC = timeUTC.addSecs((720 - (4.0 * delta) - eqTime) * 60);
- return QTime(timeUTC.hour(),
-@@ -199,7 +199,7 @@
- double hourAngle = -calcHourAngleSunrise(latitude, solarDec);
- double delta = longitude + radToDeg(hourAngle);
- QTime timeUTC(0, 0);
-- if (isnan(delta))
-+ if (std::isnan(delta))
- return timeUTC;
- timeUTC = timeUTC.addSecs((720 - (4.0 * delta) - eqTime) * 60);
- return QTime(timeUTC.hour(),
-
diff --git a/kde/patch/kinfocenter.patch b/kde/patch/kinfocenter.patch
index 5a65977..b57d434 100644
--- a/kde/patch/kinfocenter.patch
+++ b/kde/patch/kinfocenter.patch
@@ -1,3 +1,2 @@
# Fix linking error :
cat $CWD/patch/kinfocenter/kinfocenter_libpci.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kio.patch b/kde/patch/kio.patch
deleted file mode 100644
index e943096..0000000
--- a/kde/patch/kio.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-# Add search paths for kdelibs4 documentation to khelpcenter.
-# Patch taken from kubuntu:
-#cat $CWD/patch/kio/kio_kdelibs4_docpatch.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# KDEBUG #350769 (fixed in Frameworks 5.16.0):
-# Move konqpopupmenuplugin.desktop from kde-baseapps (kdelibs4 based)
-# to kio (kf5 based) to make service menus visible in dolphin (kf5 based):
-#cat $CWD/patch/kio/kio_dolphin_servicemenus.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Qt >= 5.9.3 breaks creation of folders in kio, which affects e.g.
-# Dolphin and Plasma Folder View.
-# Fixed in KIO 5.41:
-#cat $CWD/patch/kio/kio_fix_url_setpath.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix crash when accessing help://
-# Fixed in KIO 5.52:
-#cat $CWD/patch/kio/kio_KDEBUG_399709.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kio/kio_KDEBUG_399709.patch b/kde/patch/kio/kio_KDEBUG_399709.patch
deleted file mode 100644
index 0a8cfdc..0000000
--- a/kde/patch/kio/kio_KDEBUG_399709.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From cf3b0d102855a4a90db3fb65a99e0009fcdd3755 Mon Sep 17 00:00:00 2001
-From: Michael Pyne <mpyne@kde.org>
-Date: Sat, 13 Oct 2018 19:09:50 -0400
-Subject: kio_help: Fix crash in QCoreApplication when accessing help://.
-
-A recent commit d428fc8e6447ede81f1e1911d0b66b39265672f3 removed old
-custom crash handling code in favor of KCrash. But this actually adds a
-dependency on there being a valid QCoreApplication object.
-
-I took from the example of the similar kio_file to simply create the
-QCoreApplication here.
-
-BUG:399709
-
-Differential Revision: https://phabricator.kde.org/D16189
----
- src/ioslaves/help/main.cpp | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/ioslaves/help/main.cpp b/src/ioslaves/help/main.cpp
-index f09987a..f800a9d 100644
---- a/src/ioslaves/help/main.cpp
-+++ b/src/ioslaves/help/main.cpp
-@@ -10,6 +10,7 @@ extern "C" int xmlLoadExtDtdDefaultValue;
-
- #include <QDebug>
-
-+#include <QCoreApplication>
- #include <QString>
-
- #include <stdlib.h>
-@@ -40,6 +41,9 @@ extern "C"
- {
- Q_DECL_EXPORT int kdemain(int argc, char **argv)
- {
-+ QCoreApplication app(argc, argv); // needed for KCrash
-+ app.setApplicationName(QStringLiteral("kio_help"));
-+
- KDocTools::setupStandardDirs();
-
- //qDebug() << "Starting " << getpid();
---
-cgit v0.11.2
-
diff --git a/kde/patch/kio/kio_dolphin_servicemenus.patch b/kde/patch/kio/kio_dolphin_servicemenus.patch
deleted file mode 100644
index 811bfea..0000000
--- a/kde/patch/kio/kio_dolphin_servicemenus.patch
+++ /dev/null
@@ -1,126 +0,0 @@
-From: Frank Reininghaus <frank78ac@googlemail.com>
-Date: Sat, 03 Oct 2015 07:26:33 +0000
-Subject: Move konqpopupmenuplugin.desktop from kde-baseapps to kio
-X-Git-Url: http://quickgit.kde.org/?p=kio.git&a=commitdiff&h=4b24b70c93523c5bc56c90c04a5a666331e96a1b
----
-Move konqpopupmenuplugin.desktop from kde-baseapps to kio
-
-This ensures that service menu entries are shown if the unreleased
-KF5-based version of lib/konq from kde-baseapps is not installed
-
-It would be great if the translations from lib/konq in kde-baseapps
-could be merged. Thanks!
-
-BUG: 350769
-Change-Id: Id2c9a73ce95a6c8b704f3a1000c0292d1864a352
-REVIEW: 125425
-CCMAIL: luigi.toscano@tiscali.it
----
-Slightly modified by Eric Hameleers <alien@slackware.com>
----
-diff -uarN kio-5.15.0.orig/src/widgets/CMakeLists.txt kio-5.15.0/src/widgets/CMakeLists.txt
---- kio-5.15.0.orig/src/widgets/CMakeLists.txt 2015-10-05 10:11:41.000000000 +0200
-+++ kio-5.15.0/src/widgets/CMakeLists.txt 2015-10-18 14:14:15.461196097 +0200
-@@ -184,6 +184,7 @@
- kfileitemactionplugin.desktop
- kpropertiesdialogplugin.desktop
- kurifilterplugin.desktop
-+ konqpopupmenuplugin.desktop
- kiodndpopupmenuplugin.desktop
- DESTINATION ${KDE_INSTALL_KSERVICETYPES5DIR} )
-
-diff -uarN kio-5.15.0.orig/src/widgets/konqpopupmenuplugin.desktop kio-5.15.0/src/widgets/konqpopupmenuplugin.desktop
---- kio-5.15.0.orig/src/widgets/konqpopupmenuplugin.desktop 1970-01-01 01:00:00.000000000 +0100
-+++ kio-5.15.0/src/widgets/konqpopupmenuplugin.desktop 2015-10-18 14:17:09.078193339 +0200
-@@ -0,0 +1,89 @@
-+[Desktop Entry]
-+Type=ServiceType
-+X-KDE-ServiceType=KonqPopupMenu/Plugin
-+Comment=Plugin for the Konqueror Popup Menu
-+Comment[af]=Inplak vir die Konqueror Opspring Kieslys
-+Comment[ar]=ملحق لقائمة كونكيورر المنبثقة
-+Comment[as]=Konqueror প'প-আপ তালিকাৰ কাৰণে প্লাগ-ইন
-+Comment[ast]=Complementu pal menú emerxente de Konqueror
-+Comment[be]=Утулка для выплыўнага меню Konqueror
-+Comment[be@latin]=Plugin dla vypłyŭnoha menu prahramy „Konqueror”
-+Comment[bg]=Приставка за контекстното меню на браузъра
-+Comment[bn]=কনকরার পপ-আপ মেনুর জন্য প্লাগ-ইন
-+Comment[bn_IN]=Konqueror পপ-আপ মেনুর প্লাগ-ইন
-+Comment[bs]=Priključak za K‑osvajačev iskačući meni
-+Comment[ca]=Connector per al menú emergent del Konqueror
-+Comment[ca@valencia]=Connector per al menú emergent del Konqueror
-+Comment[cs]=Modul pro kontextovou nabídku Konqueroru
-+Comment[csb]=Wtëkôcz do menu (òtmëkô knąpą mëszë) Konquerora
-+Comment[cy]=Ategyn i Naidlen Konqueror
-+Comment[da]=Plugin for Konquerors popop-menu
-+Comment[de]=Erweiterung für das Aufklapp-Menü von Konqueror
-+Comment[el]=Πρόσθετο για το αναδυόμενο μενού του Konqueror
-+Comment[en_GB]=Plugin for the Konqueror Popup Menu
-+Comment[eo]=Kromprogrameto por la spruĉmenuo de Konkeranto
-+Comment[es]=Complemento para el menú emergente de Konqueror
-+Comment[et]=Konquerori hüpikmenüü plugin
-+Comment[eu]=Konquerorren laster-menuetarako plugina
-+Comment[fa]=وصله برای گزینگان بالاپر Konqueror
-+Comment[fi]=Konquerorin ponnahdusvalikkoliitännäinen
-+Comment[fr]=Module externe pour le menu contextuel de Konqueror
-+Comment[fy]=Plugin foar Konqueror's fluesmenu
-+Comment[ga]=Breiseán le haghaidh Roghchláir Aníos Konqueror
-+Comment[gl]=Complemento para o menú contextual de Konqueror
-+Comment[gu]=કોન્કરર પોપઅપ મેનુ માટે પ્લગઇન
-+Comment[he]=תוסף לתפריט המוקפץ של Konqueror
-+Comment[hi]=कॉन्करर पॉपअप मेन्यू के लिए प्लगइन
-+Comment[hne]=कान्करर पापअप मेन्यू बर प्लगइन
-+Comment[hr]=Dodatak za Konqueror pop-up izbornik
-+Comment[hsb]=zašćěpka za popup-meni w konqueroru
-+Comment[hu]=Bővítőmodul a Konqueror felbukkanó menühöz
-+Comment[ia]=Plugin pro le Menu de Popup de Konqueror
-+Comment[id]=Plugin untuk Menu Popup Konqueror
-+Comment[is]=Íforrit fyrir sprettvalmynd Konqueror Popup Menu
-+Comment[it]=Estensione per il menu a comparsa di Konqueror
-+Comment[ja]=Konqueror ポップアップメニューのプラグイン
-+Comment[ka]=Konqueror-ის ჩამოშლადი მენიუს პლაგინი
-+Comment[kk]=Konqueror баптау қалқымалы мәзір плагині
-+Comment[km]=កម្មវិធី​ជំនួយ​សម្រាប់​ម៉ឺនុយ​លេច​ឡើង​របស់​ Konqueror
-+Comment[kn]=ಕಾಂಕರ್ ಪುಟಿಕೆ (ಪಾಪಪ್) ಪರಿವಿಡಿಗೆ ಮಿಳಿತಾನ್ವಯ (ಪ್ಲಗಿನ್)
-+Comment[ko]=Konqueror 팝업 메뉴 플러그인
-+Comment[ku]=Pêveka ji bo Pêşeka Hilpekîn a Konquerorê
-+Comment[lt]=Priedas pasirodančiam Konqueror meniu
-+Comment[lv]=Konqueror izlecošās izvēlnes spraudnis
-+Comment[mai]=कान्करर पापअप मेनू क' लेल प्लगइन
-+Comment[mk]=Приклучок за контекстното мени на Konqueror
-+Comment[ml]=കോണ്‍ക്വററിന്റെ പൊങ്ങിവരുന്ന മെനുവിനുള്ള സംയോജകം
-+Comment[mr]=कॉन्करर पॉपअप मेन्यू करिता प्लगइन
-+Comment[ms]=Plugin untuk Menu Popuo Konqueror
-+Comment[nds]=Plugin för dat Konqueror-Opdukmenü
-+Comment[ne]=कन्क्वेरर पपअप मेनुका लागि प्लगइन
-+Comment[nl]=Plugin voor Konqueror's contextmenu
-+Comment[or]=Konqueror ପପଅପ ତାଲିକା ପାଇଁ ପ୍ଲଗଇନ
-+Comment[pa]=ਕੋਨਕਿਉਰੋਰ ਪਾਪਅੱਪ ਮੇਨੂ ਲਈ ਪਲੱਗਇਨ
-+Comment[pl]=Wtyczka do menu (otwieranego przyciskiem myszy) Konquerora
-+Comment[pt]='Plugin' para o Menu do Konqueror
-+Comment[pt_BR]=Plugin do Konqueror para menus de contexto
-+Comment[ro]=Extensie pentru meniul popup Konqueror
-+Comment[ru]=Расширение контекстного меню Konqueror
-+Comment[si]=Konqueror පොප් අප් මෙනුව සඳහා ප්ලගිනය
-+Comment[sk]=Modul pre kontextové menu Konquerora
-+Comment[sl]=Vstavek za Konquerorjev pojavni meni
-+Comment[sr]=Прикључак за К‑освајачев искачући мени
-+Comment[sr@ijekavian]=Прикључак за К‑освајачев искачући мени
-+Comment[sr@ijekavianlatin]=Priključak za K‑osvajačev iskačući meni
-+Comment[sr@latin]=Priključak za K‑osvajačev iskačući meni
-+Comment[sv]=Insticksprogram för Konquerors popupmeny
-+Comment[ta]=கான்கொரர் தோன்றும் பட்டிக்கான செருகல்கள்
-+Comment[te]=Konqueror పాప్అప్ మెనూకొరకు ప్లగ్ఇన్
-+Comment[tg]=Плагин барои менюи пайдошавии Konqueror
-+Comment[th]=ส่วนเสริมการทำงานสำหรับเมนูผุดของคอนเควอร์เรอร์
-+Comment[tr]=Konqueror Açılabilir Menüsü İçin Eklenti
-+Comment[ug]=Konqueror قاڭقىش تىزىملىكىنىڭ قىستۇرمىسى
-+Comment[uk]=Додаток контекстного меню Konqueror
-+Comment[vi]=Trình bổ sung cho Trình đơn Bật lên của Konqueror
-+Comment[wa]=Tchôke-divins po l' aspitant menu di Konqueror
-+Comment[xh]=Iplagi efakiweyo ye Konqueror ye Popup Menu
-+Comment[x-test]=xxPlugin for the Konqueror Popup Menuxx
-+Comment[zh_CN]=Konqueror 弹出菜单插件
-+Comment[zh_TW]=Konqueror 彈出式選單的外掛程式
-
-
diff --git a/kde/patch/kio/kio_fix_url_setpath.patch b/kde/patch/kio/kio_fix_url_setpath.patch
deleted file mode 100644
index d9cf740..0000000
--- a/kde/patch/kio/kio_fix_url_setpath.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 2353119aae8f03565bc7779ed1d597d266f5afda Mon Sep 17 00:00:00 2001
-From: Elvis Angelaccio <elvis.angelaccio@kde.org>
-Date: Thu, 16 Nov 2017 10:41:19 +0100
-Subject: Fix KIO::mkpath with qtbase 5.10 beta 4
-
-Summary:
-The latest Qt 5.10 beta includes [1] which breaks a bunch of unit tests,
-since `url.setPath("//foo")` will now result in an invalid (empty) QUrl.
-
-This patch fixes the KIO::mkpath() case.
-
-[1]: http://code.qt.io/cgit/qt/qtbase.git/commit/?id=f62768d046528636789f901ac79e2cfa1843a7b7
-
-Test Plan:
-
-* I can now create folders from dolphin and plasma.
-* fileundomanagertest and mkpathjobtest no longer fail
-
-Reviewers: #frameworks, dfaure
-
-Tags: #frameworks
-
-Differential Revision: https://phabricator.kde.org/D8836
----
- src/core/mkpathjob.cpp | 17 ++++++++++++++---
- 1 file changed, 14 insertions(+), 3 deletions(-)
-
-diff --git a/src/core/mkpathjob.cpp b/src/core/mkpathjob.cpp
-index bff46ca..a177805 100644
---- a/src/core/mkpathjob.cpp
-+++ b/src/core/mkpathjob.cpp
-@@ -43,8 +43,13 @@ public:
- m_url.setPath(QStringLiteral("/"));
- int i = 0;
- for (; i < basePathComponents.count() && i < m_pathComponents.count(); ++i) {
-- if (m_pathComponents.at(i) == basePathComponents.at(i)) {
-- m_url.setPath(m_url.path() + '/' + m_pathComponents.at(i));
-+ const QString pathComponent = m_pathComponents.at(i);
-+ if (pathComponent == basePathComponents.at(i)) {
-+ if (m_url.path() == QLatin1Char('/')) {
-+ m_url.setPath(m_url.path() + pathComponent);
-+ } else {
-+ m_url.setPath(m_url.path() + '/' + pathComponent);
-+ }
- } else {
- break;
- }
-@@ -57,7 +62,13 @@ public:
- if (m_url.isLocalFile()) {
- i = 0;
- for (; i < m_pathComponents.count(); ++i) {
-- QString testDir = m_url.toLocalFile() + '/' + m_pathComponents.at(i);
-+ const QString localFile = m_url.toLocalFile();
-+ QString testDir;
-+ if (localFile == QLatin1Char('/')) {
-+ testDir = localFile + m_pathComponents.at(i);
-+ } else {
-+ testDir = localFile + '/' + m_pathComponents.at(i);
-+ }
- if (QFileInfo(testDir).isDir()) {
- m_url.setPath(testDir);
- } else {
---
-cgit v0.11.2
-
diff --git a/kde/patch/kio/kio_kdelibs4_docpatch.patch b/kde/patch/kio/kio_kdelibs4_docpatch.patch
deleted file mode 100644
index 9549d31..0000000
--- a/kde/patch/kio/kio_kdelibs4_docpatch.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-Description: add search paths for kdelibs4 docs
-Author: Jonathan Riddell
-Origin: me
-Forwarded: no, kdelibs4 path was set in debian/kubuntu packages
-Applied-Upstream: nope
-Reviewed-by: Jonathan Riddell
-Last-Update: 2015-03-01
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
---- kio/src/ioslaves/help/kio_help.cpp 2015-03-07 15:45:21.000000000 +0100
-+++ kio/src/ioslaves/help/kio_help.cpp 2015-04-02 17:15:39.687828131 +0200
-@@ -49,7 +49,8 @@
- QStringList search;
-
- // assemble the local search paths
-- const QStringList localDoc = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "doc/HTML", QStandardPaths::LocateDirectory);
-+ QStringList localDoc = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "doc/HTML", QStandardPaths::LocateDirectory);
-+ localDoc << QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "doc/kde/HTML", QStandardPaths::LocateDirectory);
-
- QStringList langs = QLocale().uiLanguages();
- langs.append("en");
-
diff --git a/kde/patch/kirigami2.patch b/kde/patch/kirigami2.patch
deleted file mode 100644
index 9a997b3..0000000
--- a/kde/patch/kirigami2.patch
+++ /dev/null
@@ -1,8 +0,0 @@
-# Fix crashes in systemsettings5 when visiting the second icon.
-# Should be fixed post kirigami2 5.64.0):
-#cat $CWD/patch/kirigami2/kirigami_iconview_crash.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Make headerParent correctly aligned when there is a scrollbar:
-# Should be fixed post kirigami2 5.67.0):
-#cat $CWD/patch/kirigami2/kirigami_scrollbar.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kirigami2/kirigami_iconview_crash.patch b/kde/patch/kirigami2/kirigami_iconview_crash.patch
deleted file mode 100644
index 79a35ed..0000000
--- a/kde/patch/kirigami2/kirigami_iconview_crash.patch
+++ /dev/null
@@ -1,143 +0,0 @@
-diff --git a/src/columnview.cpp b/src/columnview.cpp
---- a/src/columnview.cpp
-+++ b/src/columnview.cpp
-@@ -37,23 +37,37 @@
- public:
- QmlComponentsPoolSingleton()
- {}
--
-- QmlComponentsPool self;
-+ static QmlComponentsPool *instance(QQmlEngine *engine);
-+private:
-+ QHash<QQmlEngine*, QmlComponentsPool*> m_instances;
- };
-
- Q_GLOBAL_STATIC(QmlComponentsPoolSingleton, privateQmlComponentsPoolSelf)
-
-
--QmlComponentsPool::QmlComponentsPool(QObject *parent)
-- : QObject(parent)
--{}
--
--void QmlComponentsPool::initialize(QQmlEngine *engine)
-+QmlComponentsPool *QmlComponentsPoolSingleton::instance(QQmlEngine *engine)
- {
-- if (!engine || m_instance) {
-- return;
-+ Q_ASSERT(engine);
-+ auto componentPool = privateQmlComponentsPoolSelf->m_instances.value(engine);
-+
-+ if (componentPool) {
-+ return componentPool;
- }
-
-+ componentPool = new QmlComponentsPool(engine);
-+
-+ QObject::connect(componentPool, &QObject::destroyed, [engine]() {
-+ if (privateQmlComponentsPoolSelf) {
-+ privateQmlComponentsPoolSelf->m_instances.remove(engine);
-+ }
-+ });
-+ privateQmlComponentsPoolSelf->m_instances[engine] = componentPool;
-+ return componentPool;
-+}
-+
-+QmlComponentsPool::QmlComponentsPool(QQmlEngine *engine)
-+ : QObject(engine)
-+{
- QQmlComponent *component = new QQmlComponent(engine, this);
-
- component->setData(QByteArrayLiteral("import QtQuick 2.7\n"
-@@ -572,12 +586,12 @@
- QQuickItem *separatorItem = m_separators.value(item);
-
- if (!separatorItem) {
-- separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->self.m_separatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
-+ separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->instance(qmlEngine(item))->m_separatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
- if (separatorItem) {
- separatorItem->setParentItem(item);
- separatorItem->setZ(9999);
- separatorItem->setProperty("column", QVariant::fromValue(item));
-- privateQmlComponentsPoolSelf->self.m_separatorComponent->completeCreate();
-+ QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_separatorComponent->completeCreate();
- m_separators[item] = separatorItem;
- }
- }
-@@ -590,12 +604,12 @@
- QQuickItem *separatorItem = m_rightSeparators.value(item);
-
- if (!separatorItem) {
-- separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->self.m_rightSeparatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
-+ separatorItem = qobject_cast<QQuickItem *>(QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_rightSeparatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
- if (separatorItem) {
- separatorItem->setParentItem(item);
- separatorItem->setZ(9999);
- separatorItem->setProperty("column", QVariant::fromValue(item));
-- privateQmlComponentsPoolSelf->self.m_rightSeparatorComponent->completeCreate();
-+ QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_rightSeparatorComponent->completeCreate();
- m_rightSeparators[item] = separatorItem;
- }
- }
-@@ -759,7 +773,7 @@
- void ColumnView::setColumnWidth(qreal width)
- {
- // Always forget the internal binding when the user sets anything, even the same value
-- disconnect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::gridUnitChanged, this, nullptr);
-+ disconnect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::gridUnitChanged, this, nullptr);
-
- if (m_contentItem->m_columnWidth == width) {
- return;
-@@ -902,7 +916,7 @@
-
- void ColumnView::setScrollDuration(int duration)
- {
-- disconnect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::longDurationChanged, this, nullptr);
-+ disconnect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::longDurationChanged, this, nullptr);
-
- if (m_contentItem->m_slideAnim->duration() == duration) {
- return;
-@@ -1392,22 +1406,20 @@
-
- void ColumnView::classBegin()
- {
-- privateQmlComponentsPoolSelf->self.initialize(qmlEngine(this));
--
- auto syncColumnWidth = [this]() {
-- m_contentItem->m_columnWidth = privateQmlComponentsPoolSelf->self.m_units->property("gridUnit").toInt() * 20;
-+ m_contentItem->m_columnWidth = privateQmlComponentsPoolSelf->instance(qmlEngine(this))->m_units->property("gridUnit").toInt() * 20;
- emit columnWidthChanged();
- };
-
-- connect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::gridUnitChanged, this, syncColumnWidth);
-+ connect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::gridUnitChanged, this, syncColumnWidth);
- syncColumnWidth();
-
- auto syncDuration = [this]() {
-- m_contentItem->m_slideAnim->setDuration(privateQmlComponentsPoolSelf->self.m_units->property("longDuration").toInt());
-+ m_contentItem->m_slideAnim->setDuration(QmlComponentsPoolSingleton::instance(qmlEngine(this))->m_units->property("longDuration").toInt());
- emit scrollDurationChanged();
- };
-
-- connect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::longDurationChanged, this, syncDuration);
-+ connect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::longDurationChanged, this, syncDuration);
- syncDuration();
-
- QQuickItem::classBegin();
-diff --git a/src/columnview_p.h b/src/columnview_p.h
---- a/src/columnview_p.h
-+++ b/src/columnview_p.h
-@@ -32,11 +32,9 @@
- Q_OBJECT
-
- public:
-- QmlComponentsPool(QObject *parent = nullptr);
-+ QmlComponentsPool(QQmlEngine *engine);
- ~QmlComponentsPool();
-
-- void initialize(QQmlEngine *engine);
--
- QQmlComponent *m_separatorComponent = nullptr;
- QQmlComponent *m_rightSeparatorComponent = nullptr;
- QObject *m_units = nullptr;
-
-
diff --git a/kde/patch/kirigami2/kirigami_scrollbar.patch b/kde/patch/kirigami2/kirigami_scrollbar.patch
deleted file mode 100644
index e81bf0e..0000000
--- a/kde/patch/kirigami2/kirigami_scrollbar.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From f695cde36a6829b8b92b2fd82deff16d9385fcb9 Mon Sep 17 00:00:00 2001
-From: Marco Martin <notmart@gmail.com>
-Date: Mon, 10 Feb 2020 11:48:50 +0100
-Subject: make headerParent correctly alignedwhen there is a scrollbar
-
----
- src/controls/GlobalDrawer.qml | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/controls/GlobalDrawer.qml b/src/controls/GlobalDrawer.qml
-index 0e8e512..9166ad7 100644
---- a/src/controls/GlobalDrawer.qml
-+++ b/src/controls/GlobalDrawer.qml
-@@ -301,6 +301,7 @@ OverlayDrawer {
- anchors {
- left: parent.left
- right: parent.right
-+ rightMargin: Math.min(0, -scrollView.width + mainFlickable.width)
- }
- spacing: 0
- y: bannerImage.visible ? Math.max(headerContainer.height, -mainFlickable.contentY) - height : 0
---
-cgit v1.1
-
-
diff --git a/kde/patch/kmail.patch b/kde/patch/kmail.patch
deleted file mode 100644
index 0cbf394..0000000
--- a/kde/patch/kmail.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix kontact crash on logout (KDEBUG 404881).
-# Fixed post 19.04.2.
-#cat $CWD/patch/kmail/kmail_kontact_kdebug_404881.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kmail/kmail_kontact_kdebug_404881.patch b/kde/patch/kmail/kmail_kontact_kdebug_404881.patch
deleted file mode 100644
index f2704aa..0000000
--- a/kde/patch/kmail/kmail_kontact_kdebug_404881.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 97e165dcf5a851ee10526631d24f9af7736da2e6 Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Thu, 6 Jun 2019 18:10:42 +0200
-Subject: Fix kontact crash on logout.
-
-Summary:
-KMail was creating new Akonadi jobs during mainwindow destruction,
-due to not testing the bool in GuiActivateEvent.
-
-Same bt in bug 404881, apparently quitting from the akregator tray icon
-[which quits all of kontact... separate issue...] gave the same crash.
-
-BUG: 404881
-FIXED-IN: 19.04.2
-
-Test Plan: Run kontact, logout. Hello Drkonqi.
-
-Reviewers: mlaurent, winterz
-
-Reviewed By: mlaurent, winterz
-
-Subscribers: kde-pim
-
-Tags: #kde_pim
-
-Differential Revision: https://phabricator.kde.org/D21626
----
- src/kmail_part.cpp | 23 ++++++++++++-----------
- 1 file changed, 12 insertions(+), 11 deletions(-)
-
-diff --git a/src/kmail_part.cpp b/src/kmail_part.cpp
-index 703a1ee..96c4c07 100644
---- a/src/kmail_part.cpp
-+++ b/src/kmail_part.cpp
-@@ -33,6 +33,7 @@
-
- #include <QVBoxLayout>
-
-+#include <KParts/GUIActivateEvent>
- #include <kparts/statusbarextension.h>
- #include <kparts/mainwindow.h>
- #include <kpluginfactory.h>
-@@ -129,18 +130,18 @@ bool KMailPart::openFile()
- void KMailPart::guiActivateEvent(KParts::GUIActivateEvent *e)
- {
- KParts::ReadOnlyPart::guiActivateEvent(e);
-- mainWidget->initializeFilterActions();
-- mainWidget->tagActionManager()->createActions();
-- mainWidget->folderShortcutActionManager()->createActions();
-- mainWidget->populateMessageListStatusFilterCombo();
-- mainWidget->initializePluginActions();
-- /*
-- FIXME it doesn't work when we switch component.
-- const QString title = mainWidget->fullCollectionPath();
-- if (!title.isEmpty()) {
-- Q_EMIT setWindowCaption(title);
-+ if (e->activated()) {
-+ mainWidget->initializeFilterActions();
-+ mainWidget->tagActionManager()->createActions();
-+ mainWidget->folderShortcutActionManager()->createActions();
-+ mainWidget->populateMessageListStatusFilterCombo();
-+ mainWidget->initializePluginActions();
-+
-+ const QString title = mainWidget->fullCollectionPath();
-+ if (!title.isEmpty()) {
-+ Q_EMIT setWindowCaption(title);
-+ }
- }
-- */
- }
-
- void KMailPart::exit()
---
-cgit v1.1
-
diff --git a/kde/patch/kmplot.patch b/kde/patch/kmplot.patch
deleted file mode 100644
index aee60a5..0000000
--- a/kde/patch/kmplot.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-#cat $CWD/patch/kmplot/kmplot_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kmplot/kmplot_isnan.patch b/kde/patch/kmplot/kmplot_isnan.patch
deleted file mode 100644
index 691ff89..0000000
--- a/kde/patch/kmplot/kmplot_isnan.patch
+++ /dev/null
@@ -1,42 +0,0 @@
---- kmplot-15.12.3/kmplot/view.cpp.0 2016-03-11 21:19:48.011194225 +0000
-+++ kmplot-15.12.3/kmplot/view.cpp 2016-03-11 21:20:37.341056493 +0000
-@@ -476,7 +476,7 @@
- double x = pixel.x();
- double y = pixel.y();
-
-- if ( isnan(x) )
-+ if ( std::isnan(x) )
- {
- xclipflg = true;
- x = pixelIfNaN.x();
-@@ -496,14 +496,14 @@
- }
- else
- {
-- if ( isinf(x) == -1 )
-+ if ( std::isinf(x) == -1 )
- x = 0;
-
-- else if ( isinf(x) == 1 )
-+ else if ( std::isinf(x) == 1 )
- x = m_clipRect.right();
- }
-
-- if ( isnan(y) )
-+ if ( std::isnan(y) )
- {
- yclipflg = true;
- y = pixelIfNaN.y();
-@@ -523,10 +523,10 @@
- }
- else
- {
-- if ( isinf(y) == -1 )
-+ if ( std::isinf(y) == -1 )
- y = 0;
-
-- else if ( isinf(y) == 1 )
-+ else if ( std::isinf(y) == 1 )
- y = m_clipRect.bottom();
- }
-
diff --git a/kde/patch/konsole.patch b/kde/patch/konsole.patch
deleted file mode 100644
index b296ad1..0000000
--- a/kde/patch/konsole.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-# Set TERM to 'konsole' instead of the default 'xterm-256color'
-# to prevent garbled text under certain conditions:
-# Reverted to default behaviour in 18.04.0 after Slackware did the same:
-#cat $CWD/patch/konsole/konsole.term.is.konsole.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix rendering of cursor if non-default theme is selected
-# (fixed post 18.12.3):
-#cat $CWD/patch/konsole/konsole.cursor.antialias.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix crash when closing session in KonsolePart via menu:
-# (fixed in 20.04.2)
-#cat $CWD/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix konsolepart segfault when closing after showing context menu:
-# (fixed in 20.04.2)
-#cat $CWD/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/konsole/konsole.cursor.antialias.patch b/kde/patch/konsole/konsole.cursor.antialias.patch
deleted file mode 100644
index 596ccaa..0000000
--- a/kde/patch/konsole/konsole.cursor.antialias.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From eccfb1f62bbf67ebffee11e241bd05757b826ff1 Mon Sep 17 00:00:00 2001
-From: Wolfgang Bauer <wbauer@tmo.at>
-Date: Mon, 4 Mar 2019 09:59:45 -0500
-Subject: [PATCH] Fix ibeam and underline cursor rendering
-
-Summary:
-Since anti-aliasing was enabled in the painter, coordinates need to
-be shifted half a pixel so that they align with the pixel grid,
-otherwise the result gets "blurred" due to the anti-aliasing.
-And as parts of the blurred shape leak outside the cursor rectangle,
-this also leaves artifacts when the cursor moves or blinks as these
-parts are not cleared.
-
-This is basically the same as commit
-e7085310d6d594823d0ed491fa8bdbd99dec4932 for the
-standard block cursor.
-
-BUG: 402589
-
-Test Plan:
-- Switch cursor shape to "I-Beam" or "Underline" in the "Advanced"
-profile settings
-
-The cursors are a single line again now, before they were blurred by
-anti-aliasing.
-
-Screenshots:
-Before:
-{F6656366}
-{F6656370}
-
-After:
-{F6656371}
-{F6656373}
-
-Also, there are no more artifacts when the cursor is moved or
-cursor blinking is enabled.
-
-Reviewers: #konsole, hindenburg
-
-Reviewed By: #konsole, hindenburg
-
-Subscribers: hindenburg, konsole-devel
-
-Tags: #konsole
-
-Differential Revision: https://phabricator.kde.org/D19513
----
- src/TerminalDisplay.cpp | 18 ++++++++++--------
- 1 file changed, 10 insertions(+), 8 deletions(-)
-
-diff --git a/src/TerminalDisplay.cpp b/src/TerminalDisplay.cpp
-index 543b8970..397422c4 100644
---- a/src/TerminalDisplay.cpp
-+++ b/src/TerminalDisplay.cpp
-@@ -716,16 +716,18 @@ void TerminalDisplay::drawCursor(QPainter& painter,
- }
- }
- } else if (_cursorShape == Enum::UnderlineCursor) {
-- painter.drawLine(cursorRect.left(),
-- cursorRect.bottom(),
-- cursorRect.right(),
-- cursorRect.bottom());
-+ QLineF line(cursorRect.left() + 0.5,
-+ cursorRect.bottom() - 0.5,
-+ cursorRect.right() - 0.5,
-+ cursorRect.bottom() - 0.5);
-+ painter.drawLine(line);
-
- } else if (_cursorShape == Enum::IBeamCursor) {
-- painter.drawLine(cursorRect.left(),
-- cursorRect.top(),
-- cursorRect.left(),
-- cursorRect.bottom());
-+ QLineF line(cursorRect.left() + 0.5,
-+ cursorRect.top() + 0.5,
-+ cursorRect.left() + 0.5,
-+ cursorRect.bottom() - 0.5);
-+ painter.drawLine(line);
- }
- }
-
-
diff --git a/kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch b/kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch
deleted file mode 100644
index fcdbb84..0000000
--- a/kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 1d7142ed24ef370ae984c0441d5b325b42656bd7 Mon Sep 17 00:00:00 2001
-From: Maximilian Schiller <manimax3@outlook.de>
-Date: Fri, 29 May 2020 07:36:02 -0400
-Subject: Fix konsolepart segfault when closing after showing context menu
-
-Assign the _view as the parent to the KXMLGuiFactory because the
-factory is referencing the view widget as its associated widget. Since
-the TerminalDisplay gets destructed first this is now a dangling
-pointer. If the view is set as the parent the factory gets cleaned up
-correctly. Also cleanup the created clientBuilder after destruction
-because it can't have a parent and would probably leak memory.
-
-BUG: 415762
-FIXED-IN: 20.08.0
-See also !87
----
- src/SessionController.cpp | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/src/SessionController.cpp b/src/SessionController.cpp
-index e72f342..542955d 100644
---- a/src/SessionController.cpp
-+++ b/src/SessionController.cpp
-@@ -1732,11 +1732,13 @@ void SessionController::showDisplayContextMenu(const QPoint& position)
- if (factory() == nullptr) {
- if (clientBuilder() == nullptr) {
- setClientBuilder(new KXMLGUIBuilder(_view));
-+
-+ // Client builder does not get deleted automatically
-+ connect(this, &QObject::destroyed, this, [this]{ delete clientBuilder(); });
- }
-
-- auto factory = new KXMLGUIFactory(clientBuilder(), this);
-+ auto factory = new KXMLGUIFactory(clientBuilder(), _view);
- factory->addClient(this);
-- ////qDebug() << "Created xmlgui factory" << factory;
- }
-
- QPointer<QMenu> popup = qobject_cast<QMenu*>(factory()->container(QStringLiteral("session-popup-menu"), this));
---
-cgit v1.1
-
-
diff --git a/kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch b/kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch
deleted file mode 100644
index 914031b..0000000
--- a/kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From fdfae25665731882687da8721e58c3c56a3babf8 Mon Sep 17 00:00:00 2001
-From: Nicolas Fella <nicolas.fella@gmx.de>
-Date: Thu, 28 May 2020 09:28:06 -0400
-Subject: Fix crash when closing session in KonsolePart via menu
-
-This close method is also used when closing a Konsole session
-via the X on the tabbar and tabheader.
-
-FIXED-IN: 20.08.0
-BUG: 420817
-BUG: 420695
-BUG: 415762
-
-See merge request !87
----
- src/SessionController.cpp | 23 +++++++++++++++--------
- 1 file changed, 15 insertions(+), 8 deletions(-)
-
-diff --git a/src/SessionController.cpp b/src/SessionController.cpp
-index 006ba8b..e72f342 100644
---- a/src/SessionController.cpp
-+++ b/src/SessionController.cpp
-@@ -999,16 +999,23 @@ void SessionController::closeSession()
- return;
- }
-
-- if (confirmClose()) {
-- if (_session->closeInNormalWay()) {
-+ if (!confirmClose()) {
-+ return;
-+ }
-+
-+ if (!_session->closeInNormalWay()) {
-+ if (!confirmForceClose()) {
- return;
-- } else if (confirmForceClose()) {
-- if (_session->closeInForceWay()) {
-- return;
-- } else {
-- qCDebug(KonsoleDebug) << "Konsole failed to close a session in any way.";
-- }
- }
-+
-+ if (!_session->closeInForceWay()) {
-+ qCDebug(KonsoleDebug) << "Konsole failed to close a session in any way.";
-+ return;
-+ }
-+ }
-+
-+ if (factory()) {
-+ factory()->removeClient(this);
- }
- }
-
---
-cgit v1.1
-
-
diff --git a/kde/patch/konsole/konsole.term.is.konsole.patch b/kde/patch/konsole/konsole.term.is.konsole.patch
deleted file mode 100644
index 443b9f1..0000000
--- a/kde/patch/konsole/konsole.term.is.konsole.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff -uar konsole-17.12.3.orig/src/Profile.cpp konsole-17.12.3/src/Profile.cpp
---- konsole-17.12.3.orig/src/Profile.cpp 2018-03-01 23:54:01.000000000 +0100
-+++ konsole-17.12.3/src/Profile.cpp 2018-04-03 21:17:11.897873304 +0200
-@@ -157,7 +157,7 @@
- // See Pty.cpp on why Arguments is populated
- setProperty(Arguments, QStringList() << QString::fromUtf8(qgetenv("SHELL")));
- setProperty(Icon, QStringLiteral("utilities-terminal"));
-- setProperty(Environment, QStringList() << QStringLiteral("TERM=xterm-256color") << QStringLiteral("COLORTERM=truecolor"));
-+ setProperty(Environment, QStringList() << QStringLiteral("TERM=konsole") << QStringLiteral("COLORTERM=truecolor"));
- setProperty(LocalTabTitleFormat, QStringLiteral("%d : %n"));
- setProperty(RemoteTabTitleFormat, QStringLiteral("(%u) %H"));
- setProperty(ShowTerminalSizeHint, true);
-diff -uar konsole-17.12.3.orig/src/Pty.cpp konsole-17.12.3/src/Pty.cpp
---- konsole-17.12.3.orig/src/Pty.cpp 2018-03-01 23:54:01.000000000 +0100
-+++ konsole-17.12.3/src/Pty.cpp 2018-04-03 21:18:18.898007801 +0200
-@@ -229,7 +229,7 @@
-
- // extra safeguard to make sure $TERM is always set
- if (!isTermEnvAdded) {
-- setEnv(QStringLiteral("TERM"), QStringLiteral("xterm-256color"));
-+ setEnv(QStringLiteral("TERM"), QStringLiteral("konsole"));
- }
- }
-
diff --git a/kde/patch/kopete.patch b/kde/patch/kopete.patch
deleted file mode 100644
index 64e8238..0000000
--- a/kde/patch/kopete.patch
+++ /dev/null
@@ -1,9 +0,0 @@
-# Fix for jabber protocol vulnerability in Kopete: CVE-2017-5593
-# (User Impersonation Vulnerability)
-# Fixed in 16.12.3.
-# cat $CWD/patch/kopete/kopete_kdebug376348.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Make 18.04.0 compile.
-# Fixed in 18.04.1.
-#cat $CWD/patch/kopete/kopete_kdebug393372.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kopete/kopete_kdebug376348.patch b/kde/patch/kopete/kopete_kdebug376348.patch
deleted file mode 100644
index d9bb057..0000000
--- a/kde/patch/kopete/kopete_kdebug376348.patch
+++ /dev/null
@@ -1,127 +0,0 @@
-From 6243764c4fd0985320d4a10b48051cc418d584ad Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali.rohar@gmail.com>
-Date: Sat, 11 Feb 2017 13:24:59 +0100
-Subject: Fix CVE 2017-5593 (User Impersonation Vulnerability) in jabber
- protocol
-
-BUG: 376348
-FIXED-IN: 16.12.3
----
- .../jabber/libiris/patches/01_cve_2017-5593.patch | 52 ++++++++++++++++++++++
- .../jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp | 14 +++---
- 2 files changed, 61 insertions(+), 5 deletions(-)
- create mode 100644 protocols/jabber/libiris/patches/01_cve_2017-5593.patch
-
-diff --git a/protocols/jabber/libiris/patches/01_cve_2017-5593.patch b/protocols/jabber/libiris/patches/01_cve_2017-5593.patch
-new file mode 100644
-index 0000000..573ca66
---- /dev/null
-+++ b/protocols/jabber/libiris/patches/01_cve_2017-5593.patch
-@@ -0,0 +1,52 @@
-+diff --git a/src/xmpp/xmpp-im/xmpp_tasks.cpp b/src/xmpp/xmpp-im/xmpp_tasks.cpp
-+index 0e74b71..0837548 100644
-+--- a/src/xmpp/xmpp-im/xmpp_tasks.cpp
-++++ b/src/xmpp/xmpp-im/xmpp_tasks.cpp
-+@@ -888,14 +888,18 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ QDomElement forward;
-+ Message::CarbonDir cd = Message::NoCarbon;
-+
-++ Jid fromJid = Jid(e1.attribute(QLatin1String("from")));
-+ // Check for Carbon
-+ QDomNodeList list = e1.childNodes();
-+ for (int i = 0; i < list.size(); ++i) {
-+ QDomElement el = list.at(i).toElement();
-+
-+- if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2") && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))) {
-++ if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2")
-++ && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))
-++ && fromJid.compare(Jid(e1.attribute(QLatin1String("to"))), false)) {
-+ QDomElement el1 = el.firstChildElement();
-+- if (el1.tagName() == QLatin1String("forwarded") && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-++ if (el1.tagName() == QLatin1String("forwarded")
-++ && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ QDomElement el2 = el1.firstChildElement(QLatin1String("message"));
-+ if (!el2.isNull()) {
-+ forward = el2;
-+@@ -904,7 +908,8 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ }
-+ }
-+ }
-+- else if (el.tagName() == QLatin1String("forwarded") && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-++ else if (el.tagName() == QLatin1String("forwarded")
-++ && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ forward = el.firstChildElement(QLatin1String("message")); // currently only messages are supportted
-+ // TODO <delay> element support
-+ if (!forward.isNull()) {
-+@@ -913,7 +918,6 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ }
-+ }
-+
-+- QString from = e1.attribute(QLatin1String("from"));
-+ Stanza s = client()->stream().createStanza(addCorrectNS(forward.isNull()? e1 : forward));
-+ if(s.isNull()) {
-+ //printf("take: bad stanza??\n");
-+@@ -926,7 +930,7 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ return false;
-+ }
-+ if (!forward.isNull()) {
-+- m.setForwardedFrom(Jid(from));
-++ m.setForwardedFrom(fromJid);
-+ m.setCarbonDirection(cd);
-+ }
-+
-diff --git a/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp b/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp
-index 0e74b71..0837548 100644
---- a/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp
-+++ b/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp
-@@ -888,14 +888,18 @@ bool JT_PushMessage::take(const QDomElement &e)
- QDomElement forward;
- Message::CarbonDir cd = Message::NoCarbon;
-
-+ Jid fromJid = Jid(e1.attribute(QLatin1String("from")));
- // Check for Carbon
- QDomNodeList list = e1.childNodes();
- for (int i = 0; i < list.size(); ++i) {
- QDomElement el = list.at(i).toElement();
-
-- if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2") && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))) {
-+ if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2")
-+ && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))
-+ && fromJid.compare(Jid(e1.attribute(QLatin1String("to"))), false)) {
- QDomElement el1 = el.firstChildElement();
-- if (el1.tagName() == QLatin1String("forwarded") && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ if (el1.tagName() == QLatin1String("forwarded")
-+ && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
- QDomElement el2 = el1.firstChildElement(QLatin1String("message"));
- if (!el2.isNull()) {
- forward = el2;
-@@ -904,7 +908,8 @@ bool JT_PushMessage::take(const QDomElement &e)
- }
- }
- }
-- else if (el.tagName() == QLatin1String("forwarded") && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ else if (el.tagName() == QLatin1String("forwarded")
-+ && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
- forward = el.firstChildElement(QLatin1String("message")); // currently only messages are supportted
- // TODO <delay> element support
- if (!forward.isNull()) {
-@@ -913,7 +918,6 @@ bool JT_PushMessage::take(const QDomElement &e)
- }
- }
-
-- QString from = e1.attribute(QLatin1String("from"));
- Stanza s = client()->stream().createStanza(addCorrectNS(forward.isNull()? e1 : forward));
- if(s.isNull()) {
- //printf("take: bad stanza??\n");
-@@ -926,7 +930,7 @@ bool JT_PushMessage::take(const QDomElement &e)
- return false;
- }
- if (!forward.isNull()) {
-- m.setForwardedFrom(Jid(from));
-+ m.setForwardedFrom(fromJid);
- m.setCarbonDirection(cd);
- }
-
---
-cgit v0.11.2
-
diff --git a/kde/patch/kopete/kopete_kdebug393372.patch b/kde/patch/kopete/kopete_kdebug393372.patch
deleted file mode 100644
index 2d1b1f0..0000000
--- a/kde/patch/kopete/kopete_kdebug393372.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From b1f4fa1401cba2e359e5a4b3ea2bafd119fca62b Mon Sep 17 00:00:00 2001
-From: Pino Toscano <pino@kde.org>
-Date: Tue, 24 Apr 2018 06:30:19 +0200
-Subject: oscar: include buffer.h
-
-This header uses Buffer as by-value parameter, so make sure it knows
-about it.
-
-BUG: 393372
-FIXED-IN: 18.04.1
----
- protocols/oscar/liboscar/tasks/messagereceivertask.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/protocols/oscar/liboscar/tasks/messagereceivertask.h b/protocols/oscar/liboscar/tasks/messagereceivertask.h
-index 8f52cd7..908e903 100644
---- a/protocols/oscar/liboscar/tasks/messagereceivertask.h
-+++ b/protocols/oscar/liboscar/tasks/messagereceivertask.h
-@@ -21,6 +21,7 @@
- #include <QByteArray>
- #include "oscarmessage.h"
- #include "oscartypeclasses.h"
-+#include "buffer.h"
-
- class QTextCodec;
-
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/korundum.patch b/kde/patch/korundum.patch
deleted file mode 100644
index 10deb29..0000000
--- a/kde/patch/korundum.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Build against Ruby 1.9.3.
-# See also https://bugs.kde.org/show_bug.cgi?id=287057
-# No longer needed in KDE 4.11.
-#cat $CWD/patch/korundum/korundum_ruby19.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/korundum/korundum_ruby19.patch b/kde/patch/korundum/korundum_ruby19.patch
deleted file mode 100644
index 561d8de..0000000
--- a/kde/patch/korundum/korundum_ruby19.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff -up korundum-4.8.0/src/krubypluginfactory.cpp.ruby19 korundum-4.8.0/src/krubypluginfactory.cpp
---- korundum-4.8.0/src/krubypluginfactory.cpp.ruby19 2011-07-27 13:37:29.000000000 -0500
-+++ korundum-4.8.0/src/krubypluginfactory.cpp 2012-02-17 08:30:38.785635819 -0600
-@@ -39,7 +39,7 @@
- extern "C" {
- extern VALUE rb_load_path;
- extern VALUE qt_internal_module;
--void Init_prelude(void);
-+// void Init_prelude(void);
- }
-
- //
-@@ -165,7 +165,7 @@ QObject *KRubyPluginFactory::create(cons
- #if RUBY_VERSION >= 0x10900
- VALUE gem = rb_define_module("Gem");
- rb_const_set(gem, rb_intern("Enable"), Qtrue);
-- Init_prelude();
-+// Init_prelude();
- #endif
-
- ruby_incpush(QFile::encodeName(program.path()));
-@@ -342,7 +342,7 @@ int kdemain(int argc, char **argv)
- #if RUBY_VERSION >= 0x10900
- VALUE gem = rb_define_module("Gem");
- rb_const_set(gem, rb_intern("Enable"), Qtrue);
-- Init_prelude();
-+// Init_prelude();
- #endif
-
- ruby_incpush(QFile::encodeName(program.path()));
-
diff --git a/kde/patch/kpat.patch b/kde/patch/kpat.patch
deleted file mode 100644
index 5bda77a..0000000
--- a/kde/patch/kpat.patch
+++ /dev/null
@@ -1,6 +0,0 @@
-# Commit https://cgit.kde.org/kpat.git/patch/?id=fc1d54ced6a727382599d767e55879b6843c3456
-# Introduces a hard dependency on fc-solver which in turn has new dependencies
-# So, we revert this commit to avoid dropping kpat altogether in 18.08.0.
-# For 18.12.0 we will have to add freecell-solver anyway.
-#cat $CWD/patch/kpat/kpat_no_freecell_solver_dep.patch | patch -p1 --reverse --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kpat/kpat_no_freecell_solver_dep.patch b/kde/patch/kpat/kpat_no_freecell_solver_dep.patch
deleted file mode 100644
index 06aedca..0000000
--- a/kde/patch/kpat/kpat_no_freecell_solver_dep.patch
+++ /dev/null
@@ -1,1475 +0,0 @@
-Commit https://cgit.kde.org/kpat.git/patch/?id=fc1d54ced6a727382599d767e55879b6843c3456
-Introduces a hard dependency on fc-solver which in turn has new dependencies
-So, we revert this commit to avoid dropping kpat altogether
-
-From ed0e53e0888da7123f4a0d2097f8da7fb105ca18 Mon Sep 17 00:00:00 2001
-From: Fabian Kosmale <0inkane@googlemail.com>
-Date: Sun, 13 May 2018 15:14:53 +0200
-Subject: Use Freecell Solver for FreeCell and Simple Simon
-
-Summary: This uses http://fc-solve.shlomifish.org/ and prevents the looping in the existing solvers.
-
-Test Plan: Test that the solvers are working.
-
-Reviewers: #kde_games, fabiank
-
-Subscribers: kde-games-devel, aacid, #kde_games
-
-Tags: #kde_games
-
-Differential Revision: https://phabricator.kde.org/D12415
----
- CMakeLists.txt | 6 +-
- dealer.cpp | 4 +
- freecell.cpp | 35 ++++
- freecell.h | 1 +
- patsolve/abstract_fc_solve_solver.cpp | 239 ++++++++++++++++++++++++++
- patsolve/abstract_fc_solve_solver.h | 52 ++++++
- patsolve/freecellsolver.cpp | 310 +++++++++++++++++-----------------
- patsolve/freecellsolver.h | 23 ++-
- patsolve/patsolve.h | 12 +-
- patsolve/simonsolver.cpp | 129 +++++++++++++-
- patsolve/simonsolver.h | 20 ++-
- patsolve/solverinterface.h | 2 +
- pileutils.cpp | 61 +++++++
- pileutils.h | 4 +
- simon.cpp | 56 +++++-
- simon.h | 1 +
- 16 files changed, 779 insertions(+), 176 deletions(-)
- create mode 100644 patsolve/abstract_fc_solve_solver.cpp
- create mode 100644 patsolve/abstract_fc_solve_solver.h
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 8f738bf..c043c45 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -4,6 +4,8 @@ cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
- set (QT_MIN_VERSION "5.7.0")
- set (KF5_MIN_VERSION "5.30.0")
-
-+include(FindPkgConfig)
-+pkg_check_modules(FC_SOLVE REQUIRED libfreecell-solver)
- find_package(ECM ${KF5_MIN_VERSION} REQUIRED CONFIG)
- set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
-
-@@ -45,7 +47,7 @@ add_subdirectory(sounds)
- add_subdirectory(themes)
- add_subdirectory(doc)
-
--set(kpat_SRCS
-+set(kpat_SRCS ${libfcs_SRCS}
- main.cpp
- dealer.cpp
- dealerinfo.cpp
-@@ -59,6 +61,7 @@ set(kpat_SRCS
- soundengine.cpp
- statisticsdialog.cpp
- view.cpp
-+ patsolve/abstract_fc_solve_solver.cpp
- patsolve/memory.cpp
- patsolve/patsolve.cpp
-
-@@ -101,6 +104,7 @@ target_link_libraries(kpat
- KF5::KIOCore
- KF5KDEGames
- kcardgame
-+ ${FC_SOLVE_LDFLAGS}
- )
-
- install(TARGETS kpat ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-diff --git a/dealer.cpp b/dealer.cpp
-index 7c03ebf..a2558fc 100644
---- a/dealer.cpp
-+++ b/dealer.cpp
-@@ -1724,6 +1724,10 @@ void DealerScene::startSolver()
-
- bool DealerScene::isGameLost() const
- {
-+ if (! m_winningMoves.isEmpty())
-+ {
-+ return false;
-+ }
- if ( solver() )
- {
- if ( m_solverThread && m_solverThread->isRunning() )
-diff --git a/freecell.cpp b/freecell.cpp
-index f870cdb..9a7c278 100644
---- a/freecell.cpp
-+++ b/freecell.cpp
-@@ -111,6 +111,41 @@ void Freecell::restart( const QList<KCard*> & cards )
- }
-
-
-+QString Freecell::solverFormat() const
-+{
-+ QString output;
-+ QString tmp;
-+ for (int i = 0; i < 4 ; i++) {
-+ if (target[i]->isEmpty())
-+ continue;
-+ tmp += suitToString(target[i]->topCard()->suit()) + '-' + rankToString(target[i]->topCard()->rank()) + ' ';
-+ }
-+ if (!tmp.isEmpty())
-+ output += QString::fromLatin1("Foundations: %1\n").arg(tmp);
-+
-+ tmp.truncate(0);
-+ for (int i = 0; i < 4 ; i++) {
-+ if (freecell[i]->isEmpty())
-+ tmp += "- ";
-+ else
-+ tmp += rankToString(freecell[i]->topCard()->rank()) + suitToString(freecell[i]->topCard()->suit()) + ' ';
-+ }
-+ if (!tmp.isEmpty())
-+ {
-+ QString a = QString::fromLatin1("Freecells: %1\n");
-+ output += a.arg(tmp);
-+ }
-+
-+ for (int i = 0; i < 8 ; i++)
-+ {
-+ QList<KCard*> cards = store[i]->cards();
-+ for (QList<KCard*>::ConstIterator it = cards.begin(); it != cards.end(); ++it)
-+ output += rankToString((*it)->rank()) + suitToString((*it)->suit()) + ' ';
-+ output += '\n';
-+ }
-+ return output;
-+}
-+
- void Freecell::cardsDroppedOnPile( const QList<KCard*> & cards, KCardPile * pile )
- {
- if ( cards.size() <= 1 )
-diff --git a/freecell.h b/freecell.h
-index 7b0b2cb..9f7d84b 100644
---- a/freecell.h
-+++ b/freecell.h
-@@ -62,6 +62,7 @@ protected slots:
- private:
- bool canPutStore( const KCardPile * pile, const QList<KCard*> & cards ) const;
-
-+ virtual QString solverFormat() const;
- PatPile* store[8];
- PatPile* freecell[4];
- PatPile* target[4];
-diff --git a/patsolve/abstract_fc_solve_solver.cpp b/patsolve/abstract_fc_solve_solver.cpp
-new file mode 100644
-index 0000000..11e5baa
---- /dev/null
-+++ b/patsolve/abstract_fc_solve_solver.cpp
-@@ -0,0 +1,239 @@
-+/*
-+ * Copyright (C) 2006-2009 Stephan Kulow <coolo@kde.org>
-+ *
-+ * 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, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "freecell-solver/fcs_user.h"
-+#include "freecell-solver/fcs_cl.h"
-+
-+#include "abstract_fc_solve_solver.h"
-+
-+const int CHUNKSIZE = 100;
-+const long int MAX_ITERS_LIMIT = 200000;
-+
-+#define PRINT 0
-+
-+/* These two routines make and unmake moves. */
-+
-+void FcSolveSolver::make_move(MOVE *)
-+{
-+ return;
-+}
-+
-+void FcSolveSolver::undo_move(MOVE *)
-+{
-+ return;
-+}
-+
-+/* Get the possible moves from a position, and store them in Possible[]. */
-+SolverInterface::ExitStatus FcSolveSolver::patsolve( int _max_positions )
-+{
-+ int current_iters_count;
-+ max_positions = (_max_positions < 0) ? MAX_ITERS_LIMIT : _max_positions;
-+
-+ init();
-+
-+ if (!solver_instance)
-+ {
-+ {
-+ solver_instance = freecell_solver_user_alloc();
-+
-+ solver_ret = FCS_STATE_NOT_BEGAN_YET;
-+
-+ char * error_string;
-+ int error_arg;
-+ const char * known_parameters[1] = {NULL};
-+ /* A "char *" copy instead of "const char *". */
-+
-+ int parse_args_ret_code = freecell_solver_user_cmd_line_parse_args(
-+ solver_instance,
-+ get_cmd_line_arg_count() ,
-+ get_cmd_line_args(),
-+ 0,
-+ known_parameters,
-+ NULL,
-+ NULL,
-+ &error_string,
-+ &error_arg
-+ );
-+
-+ Q_ASSERT(!parse_args_ret_code);
-+ }
-+
-+ /* Not needed for Simple Simon because it's already specified in
-+ * freecell_solver_cmd_line_args. TODO : abstract .
-+ *
-+ * Shlomi Fish
-+ * */
-+ setFcSolverGameParams();
-+
-+ current_iters_count = CHUNKSIZE;
-+ freecell_solver_user_limit_iterations(solver_instance, current_iters_count);
-+ }
-+
-+ if (solver_instance)
-+ {
-+ bool continue_loop = true;
-+ while (continue_loop &&
-+ ( (solver_ret == FCS_STATE_NOT_BEGAN_YET)
-+ || (solver_ret == FCS_STATE_SUSPEND_PROCESS))
-+ &&
-+ (current_iters_count < MAX_ITERS_LIMIT)
-+ )
-+ {
-+ current_iters_count += CHUNKSIZE;
-+ freecell_solver_user_limit_iterations(solver_instance, current_iters_count);
-+
-+ if (solver_ret == FCS_STATE_NOT_BEGAN_YET)
-+ {
-+ solver_ret =
-+ freecell_solver_user_solve_board(
-+ solver_instance,
-+ board_as_string
-+ );
-+ }
-+ else
-+ {
-+ solver_ret = freecell_solver_user_resume_solution(solver_instance);
-+ }
-+ {
-+ // QMutexLocker lock( &endMutex );
-+ if ( m_shouldEnd )
-+ {
-+ continue_loop = false;
-+ }
-+ }
-+ }
-+ }
-+
-+ switch (solver_ret)
-+ {
-+ case FCS_STATE_IS_NOT_SOLVEABLE:
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+ return Solver::NoSolutionExists;
-+
-+ case FCS_STATE_WAS_SOLVED:
-+ {
-+ if (solver_instance)
-+ {
-+ m_winMoves.clear();
-+ while (freecell_solver_user_get_moves_left(solver_instance))
-+ {
-+ fcs_move_t move;
-+ MOVE new_move;
-+ const int verdict = !freecell_solver_user_get_next_move(
-+ solver_instance, &move)
-+ ;
-+
-+ Q_ASSERT (verdict);
-+
-+ new_move.fcs = move;
-+
-+ m_winMoves.append( new_move );
-+ }
-+
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+ return Solver::SolutionExists;
-+ }
-+
-+ case FCS_STATE_SUSPEND_PROCESS:
-+ return Solver::UnableToDetermineSolvability;
-+
-+ default:
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+ return Solver::NoSolutionExists;
-+ }
-+}
-+
-+/* Get the possible moves from a position, and store them in Possible[]. */
-+
-+int FcSolveSolver::get_possible_moves(int *, int *)
-+{
-+ return 0;
-+}
-+
-+bool FcSolveSolver::isWon()
-+{
-+ return true;
-+}
-+
-+int FcSolveSolver::getOuts()
-+{
-+ return 0;
-+}
-+
-+FcSolveSolver::FcSolveSolver()
-+ : Solver()
-+ , solver_instance(NULL)
-+ , solver_ret(FCS_STATE_NOT_BEGAN_YET)
-+ , board_as_string("")
-+{
-+}
-+
-+unsigned int FcSolveSolver::getClusterNumber()
-+{
-+ return 0;
-+}
-+
-+void FcSolveSolver::print_layout()
-+{
-+#if 0
-+ int i, w, o;
-+
-+ fprintf(stderr, "print-layout-begin\n");
-+ for (w = 0; w < 10; ++w) {
-+ Q_ASSERT( Wp[w] == &W[w][Wlen[w]-1] );
-+ fprintf( stderr, "Play%d: ", w );
-+ for (i = 0; i < Wlen[w]; ++i) {
-+ printcard(W[w][i], stderr);
-+ }
-+ fputc('\n', stderr);
-+ }
-+ fprintf( stderr, "Off: " );
-+ for (o = 0; o < 4; ++o) {
-+ if ( O[o] != -1 )
-+ printcard( O[o] + PS_KING, stderr);
-+ }
-+ fprintf(stderr, "\nprint-layout-end\n");
-+#endif
-+}
-+
-+void FcSolveSolver::unpack_cluster( unsigned int)
-+{
-+ return;
-+}
-+
-+FcSolveSolver::~FcSolveSolver()
-+{
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+}
-+
-diff --git a/patsolve/abstract_fc_solve_solver.h b/patsolve/abstract_fc_solve_solver.h
-new file mode 100644
-index 0000000..d2d072d
---- /dev/null
-+++ b/patsolve/abstract_fc_solve_solver.h
-@@ -0,0 +1,52 @@
-+/*
-+ * Copyright (C) 2006-2009 Stephan Kulow <coolo@kde.org>
-+ *
-+ * 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, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#ifndef ABSTRACT_FC_SOLVE_SOLVER_H
-+#define ABSTRACT_FC_SOLVE_SOLVER_H
-+
-+#include "patsolve.h"
-+
-+struct FcSolveSolver : public Solver<10>
-+{
-+public:
-+ FcSolveSolver();
-+ virtual ~FcSolveSolver();
-+ virtual int get_possible_moves(int *a, int *numout);
-+ virtual bool isWon();
-+ virtual void make_move(MOVE *m);
-+ virtual void undo_move(MOVE *m);
-+ virtual int getOuts();
-+ virtual unsigned int getClusterNumber();
-+ virtual void translate_layout() = 0;
-+ virtual void unpack_cluster( unsigned int k );
-+ virtual MoveHint translateMove(const MOVE &m) = 0;
-+ virtual SolverInterface::ExitStatus patsolve( int _max_positions = -1);
-+ virtual void setFcSolverGameParams() = 0;
-+
-+ virtual void print_layout();
-+
-+ virtual int get_cmd_line_arg_count() = 0;
-+ virtual const char * * get_cmd_line_args() = 0;
-+/* Names of the cards. The ordering is defined in pat.h. */
-+
-+ void * solver_instance;
-+ int solver_ret;
-+ // More than enough space for two decks.
-+ char board_as_string[4 * 13 * 2 * 4 * 3];
-+};
-+
-+#endif // ABSTRACT_FC_SOLVE_SOLVER_H
-diff --git a/patsolve/freecellsolver.cpp b/patsolve/freecellsolver.cpp
-index 39eff50..e92000f 100644
---- a/patsolve/freecellsolver.cpp
-+++ b/patsolve/freecellsolver.cpp
-@@ -16,12 +16,18 @@
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "freecell-solver/fcs_user.h"
-+#include "freecell-solver/fcs_cl.h"
-+
- #include "freecellsolver.h"
-
- #include "../freecell.h"
-
--
--/* Some macros used in get_possible_moves(). */
-+const int CHUNKSIZE = 100;
-+const long int MAX_ITERS_LIMIT = 200000;
-
- /* The following function implements
- (Same_suit ? (suit(a) == suit(b)) : (color(a) != color(b)))
-@@ -32,10 +38,13 @@ namespace {
-
- /* Statistics. */
-
-+#if 0
- int FreecellSolver::Xparam[] = { 4, 1, 8, -1, 7, 11, 4, 2, 2, 1, 2 };
-+#endif
-
- /* These two routines make and unmake moves. */
-
-+#if 0
- void FreecellSolver::make_move(MOVE *m)
- {
- int from, to;
-@@ -85,7 +94,9 @@ void FreecellSolver::undo_move(MOVE *m)
- Wlen[from]++;
- hashpile(from);
- }
-+#endif
-
-+#if 0
- /* Move prioritization. Given legal, pruned moves, there are still some
- that are a waste of time, especially in the endgame where there are lots of
- possible moves, but few productive ones. Note that we also prioritize
-@@ -178,9 +189,11 @@ void FreecellSolver::prioritize(MOVE *mp0, int n)
- }
- }
- }
-+#endif
-
- /* Automove logic. Freecell games must avoid certain types of automoves. */
-
-+#if 0
- int FreecellSolver::good_automove(int o, int r)
- {
- int i;
-@@ -220,148 +233,43 @@ int FreecellSolver::good_automove(int o, int r)
-
- return true;
- }
-+#endif
-
--/* Get the possible moves from a position, and store them in Possible[]. */
-+#define CMD_LINE_ARGS_NUM 2
-
--int FreecellSolver::get_possible_moves(int *a, int *numout)
-+static const char * freecell_solver_cmd_line_args[CMD_LINE_ARGS_NUM] =
- {
-- int i, n, t, w, o, empty, emptyw;
-- card_t card;
-- MOVE *mp;
--
-- /* Check for moves from W to O. */
--
-- n = 0;
-- mp = Possible;
-- for (w = 0; w < Nwpiles + Ntpiles; ++w) {
-- if (Wlen[w] > 0) {
-- card = *Wp[w];
-- o = SUIT(card);
-- empty = (O[o] == NONE);
-- if ((empty && (RANK(card) == PS_ACE)) ||
-- (!empty && (RANK(card) == O[o] + 1))) {
-- mp->card_index = 0;
-- mp->from = w;
-- mp->to = o;
-- mp->totype = O_Type;
-- mp->turn_index = -1;
-- mp->pri = 0; /* unused */
-- n++;
-- mp++;
--
-- /* If it's an automove, just do it. */
--
-- if (good_automove(o, RANK(card))) {
-- *a = true;
-- mp[-1].pri = 127;
-- if (n != 1) {
-- Possible[0] = mp[-1];
-- return 1;
-- }
-- return n;
-- }
-- }
-- }
-- }
--
-- /* No more automoves, but remember if there were any moves out. */
--
-- *a = false;
-- *numout = n;
--
-- /* Check for moves from non-singleton W cells to one of any
-- empty W cells. */
-+ "--load-config", "video-editing"
-+};
-
-- emptyw = -1;
-- for (w = 0; w < Nwpiles; ++w) {
-- if (Wlen[w] == 0) {
-- emptyw = w;
-- break;
-- }
-- }
-- if (emptyw >= 0) {
-- for (i = 0; i < Nwpiles + Ntpiles; ++i) {
-- if (i == emptyw || Wlen[i] == 0) {
-- continue;
-- }
-- bool allowed = false;
-- if ( i < Nwpiles)
-- allowed = true;
-- if ( i >= Nwpiles )
-- allowed = true;
-- if ( allowed ) {
-- card = *Wp[i];
-- mp->card_index = 0;
-- mp->from = i;
-- mp->to = emptyw;
-- mp->totype = W_Type;
-- mp->turn_index = -1;
-- if ( i >= Nwpiles )
-- mp->pri = Xparam[6];
-- else
-- mp->pri = Xparam[3];
-- n++;
-- mp++;
-- }
-- }
-- }
--
-- /* Check for moves from W to non-empty W cells. */
--
-- for (i = 0; i < Nwpiles + Ntpiles; ++i) {
-- if (Wlen[i] > 0) {
-- card = *Wp[i];
-- for (w = 0; w < Nwpiles; ++w) {
-- if (i == w) {
-- continue;
-- }
-- if (Wlen[w] > 0 &&
-- (RANK(card) == RANK(*Wp[w]) - 1 &&
-- suitable(card, *Wp[w]))) {
-- mp->card_index = 0;
-- mp->from = i;
-- mp->to = w;
-- mp->totype = W_Type;
-- mp->turn_index = -1;
-- if ( i >= Nwpiles )
-- mp->pri = Xparam[5];
-- else
-- mp->pri = Xparam[4];
-- n++;
-- mp++;
-- }
-- }
-- }
-- }
--
-- /* Check for moves from W to one of any empty T cells. */
--
-- for (t = 0; t < Ntpiles; ++t) {
-- if (!Wlen[t+Nwpiles]) {
-- break;
-- }
-- }
-+int FreecellSolver::get_cmd_line_arg_count()
-+{
-+ return CMD_LINE_ARGS_NUM;
-+}
-
-- if (t < Ntpiles) {
-- for (w = 0; w < Nwpiles; ++w) {
-- if (Wlen[w] > 0) {
-- card = *Wp[w];
-- mp->card_index = 0;
-- mp->from = w;
-- mp->turn_index = -1;
-- mp->to = t+Nwpiles;
-- mp->totype = W_Type;
-- mp->pri = Xparam[7];
-- n++;
-- mp++;
-- }
-- }
-- }
-+const char * * FreecellSolver::get_cmd_line_args()
-+{
-+ return freecell_solver_cmd_line_args;
-+}
-
-
-- return n;
-+void FreecellSolver::setFcSolverGameParams()
-+{
-+ /*
-+ * I'm using the more standard interface instead of the depracated
-+ * user_set_game one. I'd like that each function will have its
-+ * own dedicated purpose.
-+ *
-+ * Shlomi Fish
-+ * */
-+ freecell_solver_user_set_num_freecells(solver_instance,4);
-+ freecell_solver_user_set_num_stacks(solver_instance,8);
-+ freecell_solver_user_set_num_decks(solver_instance,1);
-+ freecell_solver_user_set_sequences_are_built_by_type(solver_instance, FCS_SEQ_BUILT_BY_ALTERNATE_COLOR);
-+ freecell_solver_user_set_sequence_move(solver_instance, 0);
-+ freecell_solver_user_set_empty_stacks_filled_by(solver_instance, FCS_ES_FILLED_BY_ANY_CARD);
- }
--
-+#if 0
- void FreecellSolver::unpack_cluster( unsigned int k )
- {
- /* Get the Out cells from the cluster number. */
-@@ -373,27 +281,13 @@ void FreecellSolver::unpack_cluster( unsigned int k )
- k >>= 4;
- O[3] = k & 0xF;
- }
-+#endif
-
--bool FreecellSolver::isWon()
--{
-- // maybe won?
-- for (int o = 0; o < 4; ++o) {
-- if (O[o] != PS_KING) {
-- return false;
-- }
-- }
--
-- return true;
--}
--
--int FreecellSolver::getOuts()
--{
-- return O[0] + O[1] + O[2] + O[3];
--}
-
- FreecellSolver::FreecellSolver(const Freecell *dealer)
-- : Solver()
-+ : FcSolveSolver()
- {
-+#if 0
- Osuit[0] = PS_DIAMOND;
- Osuit[1] = PS_CLUB;
- Osuit[2] = PS_HEART;
-@@ -402,12 +296,15 @@ FreecellSolver::FreecellSolver(const Freecell *dealer)
- Nwpiles = 8;
- Ntpiles = 4;
-
-+#endif
-+
- deal = dealer;
- }
-
- /* Read a layout file. Format is one pile per line, bottom to top (visible
- card). Temp cells and Out on the last two lines, if any. */
-
-+#if 0
- void FreecellSolver::translate_layout()
- {
- /* Read the workspace. */
-@@ -447,9 +344,78 @@ void FreecellSolver::translate_layout()
- }
- }
- }
-+#endif
-
- MoveHint FreecellSolver::translateMove( const MOVE &m )
- {
-+ fcs_move_t move = m.fcs;
-+ int cards = fcs_move_get_num_cards_in_seq(move);
-+ PatPile *from = 0;
-+ PatPile *to = 0;
-+
-+ switch(fcs_move_get_type(move))
-+ {
-+ case FCS_MOVE_TYPE_STACK_TO_STACK:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ to = deal->store[fcs_move_get_dest_stack(move)];
-+ break;
-+
-+ case FCS_MOVE_TYPE_FREECELL_TO_STACK:
-+ from = deal->freecell[fcs_move_get_src_freecell(move)];
-+ to = deal->store[fcs_move_get_dest_stack(move)];
-+ cards = 1;
-+ break;
-+
-+ case FCS_MOVE_TYPE_FREECELL_TO_FREECELL:
-+ from = deal->freecell[fcs_move_get_src_freecell(move)];
-+ to = deal->freecell[fcs_move_get_dest_freecell(move)];
-+ cards = 1;
-+ break;
-+
-+ case FCS_MOVE_TYPE_STACK_TO_FREECELL:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ to = deal->freecell[fcs_move_get_dest_freecell(move)];
-+ cards = 1;
-+ break;
-+
-+ case FCS_MOVE_TYPE_STACK_TO_FOUNDATION:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ cards = 1;
-+ to = 0;
-+ break;
-+
-+ case FCS_MOVE_TYPE_FREECELL_TO_FOUNDATION:
-+ from = deal->freecell[fcs_move_get_src_freecell(move)];
-+ cards = 1;
-+ to = 0;
-+ }
-+ Q_ASSERT(from);
-+ Q_ASSERT(cards <= from->cards().count());
-+ Q_ASSERT(to || cards == 1);
-+ KCard *card = from->cards()[from->cards().count() - cards];
-+
-+ if (!to)
-+ {
-+ PatPile *target = 0;
-+ PatPile *empty = 0;
-+ for (int i = 0; i < 4; ++i) {
-+ KCard *c = deal->target[i]->topCard();
-+ if (c) {
-+ if ( c->suit() == card->suit() )
-+ {
-+ target = deal->target[i];
-+ break;
-+ }
-+ } else if ( !empty )
-+ empty = deal->target[i];
-+ }
-+ to = target ? target : empty;
-+ }
-+ Q_ASSERT(to);
-+
-+ return MoveHint(card, to, 0);
-+
-+#if 0
- // this is tricky as we need to want to build the "meta moves"
-
- PatPile *frompile = nullptr;
-@@ -486,8 +452,43 @@ MoveHint FreecellSolver::translateMove( const MOVE &m )
-
- return MoveHint( card, target, m.pri );
- }
-+#endif
- }
-
-+void FreecellSolver::translate_layout()
-+{
-+ strcpy(board_as_string, deal->solverFormat().toLatin1());
-+
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_recycle(solver_instance);
-+ solver_ret = FCS_STATE_NOT_BEGAN_YET;
-+ }
-+#if 0
-+ /* Read the workspace. */
-+ int total = 0;
-+
-+ for ( int w = 0; w < 10; ++w ) {
-+ int i = translate_pile(deal->store[w], W[w], 52);
-+ Wp[w] = &W[w][i - 1];
-+ Wlen[w] = i;
-+ total += i;
-+ }
-+
-+ for (int i = 0; i < 4; ++i) {
-+ O[i] = -1;
-+ KCard *c = deal->target[i]->top();
-+ if (c) {
-+ total += 13;
-+ O[i] = translateSuit( c->suit() );
-+ }
-+ }
-+#endif
-+}
-+
-+
-+
-+#if 0
- unsigned int FreecellSolver::getClusterNumber()
- {
- int i = O[0] + (O[1] << 4);
-@@ -496,7 +497,9 @@ unsigned int FreecellSolver::getClusterNumber()
- k |= i << 8;
- return k;
- }
-+#endif
-
-+#if 0
- void FreecellSolver::print_layout()
- {
- int i, t, w, o;
-@@ -519,3 +522,4 @@ void FreecellSolver::print_layout()
- }
- fprintf(stderr, "\nprint-layout-end\n");
- }
-+#endif
-diff --git a/patsolve/freecellsolver.h b/patsolve/freecellsolver.h
-index 45ca063..99d1dbb 100644
---- a/patsolve/freecellsolver.h
-+++ b/patsolve/freecellsolver.h
-@@ -19,16 +19,17 @@
- #ifndef FREECELLSOLVER_H
- #define FREECELLSOLVER_H
-
--class Freecell;
--#include "patsolve.h"
-+#include "abstract_fc_solve_solver.h"
-
- constexpr auto Nwpiles = 8;
- constexpr auto Ntpiles = 4;
-+class Freecell;
-
--class FreecellSolver : public Solver<Nwpiles + Ntpiles>
-+class FreecellSolver : public FcSolveSolver
- {
- public:
- explicit FreecellSolver(const Freecell *dealer);
-+#if 0
- int good_automove(int o, int r);
- int get_possible_moves(int *a, int *numout) Q_DECL_OVERRIDE;
- bool isWon() Q_DECL_OVERRIDE;
-@@ -40,8 +41,17 @@ public:
- void translate_layout() Q_DECL_OVERRIDE;
- void unpack_cluster( unsigned int k ) Q_DECL_OVERRIDE;
- MoveHint translateMove(const MOVE &m) Q_DECL_OVERRIDE;
--
-- void print_layout() Q_DECL_OVERRIDE;
-+#endif
-+ virtual void translate_layout();
-+#if 0
-+ virtual void unpack_cluster( unsigned int k );
-+#endif
-+ virtual MoveHint translateMove(const MOVE &m);
-+ virtual void setFcSolverGameParams();
-+ virtual int get_cmd_line_arg_count();
-+ virtual const char * * get_cmd_line_args();
-+#if 0
-+ virtual void print_layout();
-
- int Nwpiles; /* the numbers we're actually using */
- int Ntpiles;
-@@ -51,10 +61,11 @@ public:
- card_t O[4]; /* output piles store only the rank or NONE */
- card_t Osuit[4];
-
-- const Freecell *deal;
-
- static int Xparam[];
-+#endif
-
-+ const Freecell *deal;
- };
-
- #endif // FREECELLSOLVER_H
-diff --git a/patsolve/patsolve.h b/patsolve/patsolve.h
-index 03285d4..1c3a7c6 100644
---- a/patsolve/patsolve.h
-+++ b/patsolve/patsolve.h
-@@ -33,6 +33,10 @@
-
- #include <cstdio>
-
-+/* A card is represented as ( down << 6 ) + (suit << 4) + rank. */
-+
-+typedef quint8 card_t;
-+
- struct POSITION {
- POSITION *queue; /* next position in the queue */
- POSITION *parent; /* point back up the move stack */
-@@ -48,14 +52,15 @@ class MemoryManager;
- template<size_t NumberPiles>
- class Solver : public SolverInterface
- {
-+
- public:
-
- Solver();
- virtual ~Solver();
-- ExitStatus patsolve( int max_positions = -1) final;
-+ virtual ExitStatus patsolve( int max_positions = -1);
-+ bool recursive(POSITION *pos = nullptr);
- virtual void translate_layout() = 0;
- virtual MoveHint translateMove(const MOVE &m ) = 0;
--
- void stopExecution() final;
- QList<MOVE> firstMoves() const final;
- QList<MOVE> winMoves() const final;
-@@ -126,8 +131,7 @@ protected:
- POSITION *Stack = nullptr;
- QMap<qint32,bool> recu_pos;
- int max_positions;
--
--private:
-+protected:
- QList<MOVE> m_firstMoves;
- QList<MOVE> m_winMoves;
- std::atomic_bool m_shouldEnd;
-diff --git a/patsolve/simonsolver.cpp b/patsolve/simonsolver.cpp
-index a9d640c..e75dcaa 100644
---- a/patsolve/simonsolver.cpp
-+++ b/patsolve/simonsolver.cpp
-@@ -15,17 +15,26 @@
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "freecell-solver/fcs_user.h"
-+#include "freecell-solver/fcs_cl.h"
-+
- #include "simonsolver.h"
-
- #include "../simon.h"
-
- #include <QDebug>
-
-+const int CHUNKSIZE = 100;
-+const long int MAX_ITERS_LIMIT = 200000;
-
- #define PRINT 0
-
- /* These two routines make and unmake moves. */
-
-+#if 0
- void SimonSolver::make_move(MOVE *m)
- {
- #if PRINT
-@@ -136,13 +145,62 @@ void SimonSolver::undo_move(MOVE *m)
- print_layout();
- #endif
- }
-+#endif
-+
-+#define CMD_LINE_ARGS_NUM 4
-+static const char * freecell_solver_cmd_line_args[CMD_LINE_ARGS_NUM] =
-+{
-+ "-g", "simple_simon", "--load-config", "the-last-mohican"
-+};
-+
-+int SimonSolver::get_cmd_line_arg_count()
-+{
-+ return CMD_LINE_ARGS_NUM;
-+}
-+
-+const char * * SimonSolver::get_cmd_line_args()
-+{
-+ return freecell_solver_cmd_line_args;
-+}
-+
-+void SimonSolver::setFcSolverGameParams()
-+{
-+ freecell_solver_user_apply_preset(solver_instance, "simple_simon");
-+}
-
-+#if 0
- /* Get the possible moves from a position, and store them in Possible[]. */
-
- int SimonSolver::get_possible_moves(int *a, int *numout)
- {
- MOVE *mp;
-+ int n;
-+
-+ mp = Possible;
-+ n = 0;
-+ *a = 1;
-+
-+ while (freecell_solver_user_get_moves_left(solver_instance))
-+ {
-+ fcs_move_t move;
-+ fcs_move_t * move_ptr;
-+ if (!freecell_solver_user_get_next_move(solver_instance, &move)) {
-+ move_ptr = new fcs_move_t;
-+ *move_ptr = move;
-+ mp->ptr = (void *)move_ptr;
-+ mp++;
-+ n++;
-+ }
-+ else
-+ {
-+ Q_ASSERT(0);
-+ }
-+ }
-+
-+ *numout = n;
-+ return n;
-
-+#if 0
- /* Check for moves from W to O. */
-
- int n = 0;
-@@ -301,8 +359,11 @@ int SimonSolver::get_possible_moves(int *a, int *numout)
- }
-
- return n;
-+#endif
- }
-+#endif
-
-+#if 0
- void SimonSolver::unpack_cluster( unsigned int k )
- {
- // TODO: this only works for easy
-@@ -314,7 +375,9 @@ void SimonSolver::unpack_cluster( unsigned int k )
- O[i] = -1;
- }
- }
-+#endif
-
-+#if 0
- bool SimonSolver::isWon()
- {
- // maybe won?
-@@ -324,7 +387,9 @@ bool SimonSolver::isWon()
-
- return true;
- }
-+#endif
-
-+#if 0
- int SimonSolver::getOuts()
- {
- int k = 0;
-@@ -334,9 +399,10 @@ int SimonSolver::getOuts()
-
- return k;
- }
-+#endif
-
- SimonSolver::SimonSolver(const Simon *dealer)
-- : Solver()
-+ : FcSolveSolver()
- {
- deal = dealer;
- }
-@@ -346,6 +412,14 @@ card). Temp cells and Out on the last two lines, if any. */
-
- void SimonSolver::translate_layout()
- {
-+ strcpy(board_as_string, deal->solverFormat().toLatin1());
-+
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_recycle(solver_instance);
-+ solver_ret = FCS_STATE_NOT_BEGAN_YET;
-+ }
-+#if 0
- /* Read the workspace. */
- int total = 0;
-
-@@ -364,8 +438,10 @@ void SimonSolver::translate_layout()
- O[i] = translateSuit( c->suit() );
- }
- }
-+#endif
- }
-
-+#if 0
- unsigned int SimonSolver::getClusterNumber()
- {
- unsigned int k = 0;
-@@ -376,7 +452,9 @@ unsigned int SimonSolver::getClusterNumber()
- }
- return k;
- }
-+#endif
-
-+#if 0
- void SimonSolver::print_layout()
- {
- int i, w, o;
-@@ -397,9 +475,57 @@ void SimonSolver::print_layout()
- }
- fprintf(stderr, "\nprint-layout-end\n");
- }
-+#endif
-
- MoveHint SimonSolver::translateMove( const MOVE &m )
- {
-+ fcs_move_t move = m.fcs;
-+ int cards = fcs_move_get_num_cards_in_seq(move);
-+ PatPile *from = 0;
-+ PatPile *to = 0;
-+
-+ switch(fcs_move_get_type(move))
-+ {
-+ case FCS_MOVE_TYPE_STACK_TO_STACK:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ to = deal->store[fcs_move_get_dest_stack(move)];
-+ break;
-+
-+ case FCS_MOVE_TYPE_SEQ_TO_FOUNDATION:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ cards = 13;
-+ to = deal->target[fcs_move_get_foundation(move)];
-+ break;
-+
-+ }
-+ Q_ASSERT(from);
-+ Q_ASSERT(cards <= from->cards().count());
-+ Q_ASSERT(to || cards == 1);
-+ KCard *card = from->cards()[from->cards().count() - cards];
-+
-+ if (!to)
-+ {
-+ PatPile *target = 0;
-+ PatPile *empty = 0;
-+ for (int i = 0; i < 4; ++i) {
-+ KCard *c = deal->target[i]->topCard();
-+ if (c) {
-+ if ( c->suit() == card->suit() )
-+ {
-+ target = deal->target[i];
-+ break;
-+ }
-+ } else if ( !empty )
-+ empty = deal->target[i];
-+ }
-+ to = target ? target : empty;
-+ }
-+
-+ Q_ASSERT(to);
-+
-+ return MoveHint(card, to, 0);
-+
-+#if 0
- Q_ASSERT( m.from < 10 && m.to < 10 );
-
- PatPile *frompile = deal->store[m.from];
-@@ -414,4 +540,5 @@ MoveHint SimonSolver::translateMove( const MOVE &m )
-
- Q_ASSERT( m.to < 10 );
- return MoveHint( card, deal->store[m.to], m.pri );
-+#endif
- }
-diff --git a/patsolve/simonsolver.h b/patsolve/simonsolver.h
-index 2d57dda..4a417b1 100644
---- a/patsolve/simonsolver.h
-+++ b/patsolve/simonsolver.h
-@@ -18,29 +18,37 @@
- #ifndef SIMONSOLVER_H
- #define SIMONSOLVER_H
-
--#include "patsolve.h"
-+#include "abstract_fc_solve_solver.h"
-+#include "simon.h"
- class Simon;
-
-
--class SimonSolver : public Solver<10>
-+class SimonSolver : public FcSolveSolver
- {
- public:
- explicit SimonSolver(const Simon *dealer);
-+#if 0
- int get_possible_moves(int *a, int *numout) Q_DECL_OVERRIDE;
- bool isWon() Q_DECL_OVERRIDE;
- void make_move(MOVE *m) Q_DECL_OVERRIDE;
- void undo_move(MOVE *m) Q_DECL_OVERRIDE;
- int getOuts() Q_DECL_OVERRIDE;
- unsigned int getClusterNumber() Q_DECL_OVERRIDE;
-- void translate_layout() Q_DECL_OVERRIDE;
-+#endif
-+ virtual void translate_layout() Q_DECL_OVERRIDE;
-+ virtual MoveHint translateMove(const MOVE &m) Q_DECL_OVERRIDE;
-+#if 0
- void unpack_cluster( unsigned int k ) Q_DECL_OVERRIDE;
-- MoveHint translateMove(const MOVE &m) Q_DECL_OVERRIDE;
--
- void print_layout() Q_DECL_OVERRIDE;
-+#endif
-+ virtual void setFcSolverGameParams();
-
-+ virtual int get_cmd_line_arg_count();
-+ virtual const char * * get_cmd_line_args();
-+#if 0
- /* Names of the cards. The ordering is defined in pat.h. */
--
- int O[4];
-+#endif
- const Simon *deal;
- };
-
-diff --git a/patsolve/solverinterface.h b/patsolve/solverinterface.h
-index d99d3b8..77fd410 100644
---- a/patsolve/solverinterface.h
-+++ b/patsolve/solverinterface.h
-@@ -4,6 +4,7 @@
- #include <QList>
-
- #include "../hint.h"
-+#include "freecell-solver/fcs_user.h"
-
-
- /* A card is represented as ( down << 6 ) + (suit << 4) + rank. */
-@@ -22,6 +23,7 @@ public:
- PileType totype;
- signed char pri; /* move priority (low priority == low value) */
- int turn_index; /* turn the card index */
-+ fcs_move_t fcs; /* A Freecell Solver move. */
-
- bool operator<( const MOVE &m) const
- {
-diff --git a/pileutils.cpp b/pileutils.cpp
-index 1e3da3e..609c716 100644
---- a/pileutils.cpp
-+++ b/pileutils.cpp
-@@ -48,6 +48,33 @@ bool isSameSuitAscending( const QList<KCard*> & cards )
- return true;
- }
-
-+int countSameSuitDescendingSequences( const QList<KCard*> & cards )
-+{
-+ if ( cards.size() <= 1 )
-+ return 0;
-+
-+ int suit = cards.first()->suit();
-+ int lastRank = cards.first()->rank();
-+
-+ int count = 1;
-+
-+ for( int i = 1; i < cards.size(); ++i )
-+ {
-+ --lastRank;
-+
-+ if ( cards[i]->rank() != lastRank )
-+ return -1;
-+
-+ if ( cards[i]->suit() != suit )
-+ {
-+ count++;
-+ suit = cards[i]->suit();
-+ }
-+ }
-+ return count;
-+}
-+
-+
-
- bool isSameSuitDescending( const QList<KCard*> & cards )
- {
-@@ -121,3 +148,37 @@ bool checkAddAlternateColorDescendingFromKing( const QList<KCard*> & oldCards, c
- && newCards.first()->rank() == oldCards.last()->rank() - 1;
- }
-
-+QString suitToString(int s) {
-+ switch (s) {
-+ case KCardDeck::Clubs:
-+ return "C";
-+ case KCardDeck::Hearts:
-+ return "H";
-+ case KCardDeck::Diamonds:
-+ return "D";
-+ case KCardDeck::Spades:
-+ return "S";
-+ default:
-+ exit(-1);
-+ }
-+ return QString();
-+}
-+
-+QString rankToString(int r)
-+{
-+ switch (r) {
-+ case KCardDeck::King:
-+ return "K";
-+ case KCardDeck::Ace:
-+ return "A";
-+ case KCardDeck::Jack:
-+ return "J";
-+ case KCardDeck::Queen:
-+ return "Q";
-+ case KCardDeck::Ten:
-+ return "T";
-+ default:
-+ return QString::number(r);
-+ }
-+}
-+
-diff --git a/pileutils.h b/pileutils.h
-index 2fa1657..faa8c40 100644
---- a/pileutils.h
-+++ b/pileutils.h
-@@ -26,9 +26,13 @@ class KCard;
- bool isSameSuitAscending( const QList<KCard*> & cards );
- bool isSameSuitDescending( const QList<KCard*> & cards );
- bool isAlternateColorDescending( const QList<KCard*> & cards );
-+int countSameSuitDescendingSequences( const QList<KCard*> & cards );
-
- bool checkAddSameSuitAscendingFromAce( const QList<KCard*> & oldCards, const QList<KCard*> & newCards );
- bool checkAddAlternateColorDescending( const QList<KCard*> & oldCards, const QList<KCard*> & newCards );
- bool checkAddAlternateColorDescendingFromKing( const QList<KCard*> & oldCards, const QList<KCard*> & newCards );
-
-+extern QString suitToString(int s);
-+extern QString rankToString(int r);
-+
- #endif
-diff --git a/simon.cpp b/simon.cpp
-index 8e3ef10..834dd55 100644
---- a/simon.cpp
-+++ b/simon.cpp
-@@ -111,24 +111,70 @@ bool Simon::checkAdd(const PatPile * pile, const QList<KCard*> & oldCards, const
- {
- if (pile->pileRole() == PatPile::Tableau)
- {
-- return oldCards.isEmpty()
-- || oldCards.last()->rank() == newCards.first()->rank() + 1;
-+ if (! (oldCards.isEmpty()
-+ || oldCards.last()->rank() == newCards.first()->rank() + 1 ))
-+ {
-+ return false;
-+ }
-+
-+ int seqs_count = countSameSuitDescendingSequences(newCards);
-+
-+ if (seqs_count < 0)
-+ return false;
-+
-+ // This is similar to the supermoves of Freecell - we can use empty
-+ // columns to temporarily hold intermediate sub-sequences which are
-+ // not the same suit - only a "false" parent.
-+ // Shlomi Fish
-+
-+ int empty_piles_count = 0;
-+
-+ for (int i = 0; i < 10; ++i )
-+ if (store[i]->isEmpty() && ( store[i]->index() != pile->index() ))
-+ empty_piles_count++;
-+
-+ return (seqs_count <= (1 << empty_piles_count));
- }
- else
- {
- return oldCards.isEmpty()
- && newCards.first()->rank() == KCardDeck::King
-- && newCards.last()->rank() == KCardDeck::Ace;
-+ && newCards.last()->rank() == KCardDeck::Ace
-+ && isSameSuitDescending(newCards);
- }
- }
-
- bool Simon::checkRemove(const PatPile * pile, const QList<KCard*> & cards) const
- {
-- return pile->pileRole() == PatPile::Tableau
-- && isSameSuitDescending(cards);
-+ if (pile->pileRole() != PatPile::Tableau)
-+ return false;
-+
-+ int seqs_count = countSameSuitDescendingSequences(cards);
-+
-+ return (seqs_count >= 0);
- }
-
-+QString Simon::solverFormat() const
-+{
-+ QString output;
-+ QString tmp;
-+ for (int i = 0; i < 4 ; i++) {
-+ if (target[i]->isEmpty())
-+ continue;
-+ tmp += suitToString(target[i]->topCard()->suit()) + "-K ";
-+ }
-+ if (!tmp.isEmpty())
-+ output += QString::fromLatin1("Foundations: %1\n").arg(tmp);
-
-+ for (int i = 0; i < 10 ; i++)
-+ {
-+ QList<KCard*> cards = store[i]->cards();
-+ for (QList<KCard*>::ConstIterator it = cards.begin(); it != cards.end(); ++it)
-+ output += rankToString((*it)->rank()) + suitToString((*it)->suit()) + ' ';
-+ output += '\n';
-+ }
-+ return output;
-+}
-
- static class SimonDealerInfo : public DealerInfo
- {
-diff --git a/simon.h b/simon.h
-index 83d10ab..d816f27 100644
---- a/simon.h
-+++ b/simon.h
-@@ -57,6 +57,7 @@ private:
- PatPile* store[10];
- PatPile* target[4];
-
-+ virtual QString solverFormat() const;
- friend class SimonSolver;
- };
-
---
-cgit v0.11.2
-
diff --git a/kde/patch/krita.patch b/kde/patch/krita.patch
deleted file mode 100644
index 247bbd7..0000000
--- a/kde/patch/krita.patch
+++ /dev/null
@@ -1,7 +0,0 @@
-# Fix compilation of Krita against Qt 5.9:
-#cat $CWD/patch/krita/krita_qt59.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Hack around tablet issues with un-patched Qt 5.12:
-#cat $CWD/patch/krita/krita_qtabletevents.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-
diff --git a/kde/patch/krita/krita_qt512.patch b/kde/patch/krita/krita_qt512.patch
deleted file mode 100644
index 765d232..0000000
--- a/kde/patch/krita/krita_qt512.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-From 98aab8f2942cdc78dda8cfeba3580bd9d57e00a2 Mon Sep 17 00:00:00 2001
-From: Boudewijn Rempt <boud@valdyas.org>
-Date: Fri, 5 Oct 2018 11:16:26 +0200
-Subject: [PATCH] Add a cmake option to disable our own tablet support
-
-Off by default, this makes it easier to check whether bugs are
-caused by our fork of Qt's classes or to check whether Qt's tablet
-support has improved.
-
-CCBUG:399379
----
- CMakeLists.txt | 4 ++++
- config_use_qt_xcb.h.cmake | 6 ++++++
- krita/main.cc | 8 +++++++-
- libs/ui/CMakeLists.txt | 12 ++++++++----
- libs/ui/input/wintab/qxcbconnection.cpp | 1 -
- 5 files changed, 25 insertions(+), 6 deletions(-)
- create mode 100644 config_use_qt_xcb.h.cmake
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 17c9cd2d7..3199ae4da 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -168,6 +168,10 @@ if (WIN32)
- endif (MINGW)
- endif ()
-
-+option(USE_QT_XCB "Do not use Krita's forked XCB connection and tablet support on X11, but leave everything to Qt." OFF)
-+configure_file(config_use_qt_xcb.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_use_qt_xcb.h)
-+add_feature_info("Use Qt's XCB and Tablet support on X11" USE_QT_XCB "Do not use Krita's forked XCB connection and tablet support on X11, but leave everything to Qt.")
-+
- option(HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal." ON)
- configure_file(config-hide-safe-asserts.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hide-safe-asserts.h)
- add_feature_info("Hide Safe Asserts" HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal.")
-diff --git a/config_use_qt_xcb.h.cmake b/config_use_qt_xcb.h.cmake
-new file mode 100644
-index 000000000..9fe3360cc
---- /dev/null
-+++ b/config_use_qt_xcb.h.cmake
-@@ -0,0 +1,6 @@
-+/* config_use_qt_xcb.h. Generated from config_use_qt_xcb.h.cmake */
-+
-+#cmakedefine USE_QT_XCB 1
-+
-+
-+
-diff --git a/krita/main.cc b/krita/main.cc
-index dca2ee170..398fa3384 100644
---- a/krita/main.cc
-+++ b/krita/main.cc
-@@ -63,8 +63,11 @@
- #include <QLibrary>
-
- #elif defined HAVE_X11
-+#include "config_use_qt_xcb.h"
-+#ifndef USE_QT_XCB
- #include <kis_xi2_event_filter.h>
- #endif
-+#endif
-
- #if defined HAVE_KCRASH
- #include <kcrash.h>
-@@ -336,8 +339,11 @@ extern "C" int main(int argc, char **argv)
- }
-
- #if defined HAVE_X11
-- app.installNativeEventFilter(KisXi2EventFilter::instance());
-+ #ifndef USE_QT_XCB
-+ app.installNativeEventFilter(KisXi2EventFilter::instance());
-+ #endif
- #endif
-+
- app.installEventFilter(KisQtWidgetsTweaker::instance());
-
-
-diff --git a/libs/ui/CMakeLists.txt b/libs/ui/CMakeLists.txt
-index 2909398ab..b4673ca92 100644
---- a/libs/ui/CMakeLists.txt
-+++ b/libs/ui/CMakeLists.txt
-@@ -425,14 +425,18 @@ endif()
- input/wintab/drawpile_tablettester/tablettest.cpp
- )
-
--if(UNIX)
-+if (UNIX)
- set(kritaui_LIB_SRCS
- ${kritaui_LIB_SRCS}
-- input/kis_tablet_event.cpp
-- input/wintab/kis_tablet_support.cpp
- qtlockedfile/qtlockedfile_unix.cpp
- )
-- if(NOT APPLE)
-+ if(NOT USE_QT_XCB)
-+ set(kritaui_LIB_SRCS
-+ ${kritaui_LIB_SRCS}
-+ input/wintab/kis_tablet_support.cpp
-+ )
-+ endif()
-+ if(NOT APPLE AND NOT USE_QT_XCB)
- set(kritaui_LIB_SRCS
- ${kritaui_LIB_SRCS}
- input/wintab/qxcbconnection_xi2.cpp
-diff --git a/libs/ui/input/wintab/qxcbconnection.cpp b/libs/ui/input/wintab/qxcbconnection.cpp
-index 5991bc187..c062d05e0 100644
---- a/libs/ui/input/wintab/qxcbconnection.cpp
-+++ b/libs/ui/input/wintab/qxcbconnection.cpp
-@@ -41,7 +41,6 @@
- #include <QGuiApplication>
- #include <QApplication>
-
--
- #include <X11/extensions/XI2proto.h>
- #include <xcb/xproto.h>
-
---
-2.17.1
-
diff --git a/kde/patch/krita/krita_qt59.patch b/kde/patch/krita/krita_qt59.patch
deleted file mode 100644
index f517995..0000000
--- a/kde/patch/krita/krita_qt59.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-Source: https://github.com/KDE/krita/commit/2f59d0d1.patch
-
-From 2f59d0d1d91e3f79342c20d0df68aa9a51817e8d Mon Sep 17 00:00:00 2001
-From: Luca Beltrame <lbeltrame@kde.org>
-Date: Sat, 6 May 2017 16:00:21 +0200
-Subject: [PATCH] Drop QForeachContainer include and fix Qt 5.9 build
-
-It's not used anywhere.
-
-Acked by boud.
----
- libs/ui/KisResourceBundleManifest.cpp | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/libs/ui/KisResourceBundleManifest.cpp b/libs/ui/KisResourceBundleManifest.cpp
-index e4f94ca788..83761657d8 100644
---- a/libs/ui/KisResourceBundleManifest.cpp
-+++ b/libs/ui/KisResourceBundleManifest.cpp
-@@ -22,7 +22,6 @@
- #include <QDomElement>
- #include <QDomNode>
- #include <QDomNodeList>
--#include <QForeachContainer>
-
- #include <KoXmlNS.h>
- #include <KoXmlReader.h>
diff --git a/kde/patch/krita/krita_qtabletevents.patch b/kde/patch/krita/krita_qtabletevents.patch
deleted file mode 100644
index a1d3869..0000000
--- a/kde/patch/krita/krita_qtabletevents.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-# NOTE: original patch: https://cgit.kde.org/krita.git/commit/?id=a3193fe2
-# But first part (patch to ext_qt)) has been removed due to failure to apply.
-# -- Eric Hameleers
-
-From a3193fe273c3f2c3b5493f77724a4bc099ae5e36 Mon Sep 17 00:00:00 2001
-From: Dmitry Kazakov <dimula73@gmail.com>
-Date: Mon, 11 Mar 2019 16:49:31 +0300
-Subject: Add a hacky patch that ensures QTabletEvents to be ignored in
- distribution builds
-
-If we ensure that all the tablet events are ignored, then Qt
-will always generate synthesized mouse events, avoiding the
-problem of lost Enter/Leave events.
-
-We also mark our own build of Qt about the presence of the fix
-(therefore, it doesn't need this hack).
----
- libs/ui/input/kis_input_manager.cpp | 20 ++++++++++++++++
-
-index 30a4677..d173543 100644
---- a/libs/ui/input/kis_input_manager.cpp
-+++ b/libs/ui/input/kis_input_manager.cpp
-@@ -496,6 +496,13 @@ bool KisInputManager::eventFilterImpl(QEvent * event)
- //Reset signal compressor to prevent processing events before press late
- d->resetCompressor();
- d->eatOneMousePress();
-+
-+#if defined Q_OS_LINUX && !defined QT_HAS_ENTER_LEAVE_PATCH
-+ // remove this hack when this patch is integrated:
-+ // https://codereview.qt-project.org/#/c/255384/
-+ event->setAccepted(false);
-+#endif
-+
- break;
- }
- case QEvent::TabletMove: {
-@@ -517,6 +524,12 @@ bool KisInputManager::eventFilterImpl(QEvent * event)
- */
- d->blockMouseEvents();
-
-+#if defined Q_OS_LINUX && !defined QT_HAS_ENTER_LEAVE_PATCH
-+ // remove this hack when this patch is integrated:
-+ // https://codereview.qt-project.org/#/c/255384/
-+ event->setAccepted(false);
-+#endif
-+
- break;
- }
- case QEvent::TabletRelease: {
-@@ -529,6 +542,13 @@ bool KisInputManager::eventFilterImpl(QEvent * event)
- retval = d->matcher.buttonReleased(tabletEvent->button(), tabletEvent);
- retval = true;
- event->setAccepted(true);
-+
-+#if defined Q_OS_LINUX && !defined QT_HAS_ENTER_LEAVE_PATCH
-+ // remove this hack when this patch is integrated:
-+ // https://codereview.qt-project.org/#/c/255384/
-+ event->setAccepted(false);
-+#endif
-+
- break;
- }
-
---
-cgit v1.1
-
-
diff --git a/kde/patch/krunner.patch b/kde/patch/krunner.patch
new file mode 100644
index 0000000..2cafdc6
--- /dev/null
+++ b/kde/patch/krunner.patch
@@ -0,0 +1,4 @@
+# KDEBUG 423003: prevent crash when at least PIM Contacts plugin is enabled.
+# Fixed in Frameworks 5.73.
+cat $CWD/patch/krunner/krunner_KDEBUG_423003.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+
diff --git a/kde/patch/krunner/krunner_KDEBUG_423003.patch b/kde/patch/krunner/krunner_KDEBUG_423003.patch
new file mode 100644
index 0000000..88f6297
--- /dev/null
+++ b/kde/patch/krunner/krunner_KDEBUG_423003.patch
@@ -0,0 +1,54 @@
+From 8f7ce559b84ee0c21de0256e6591793e4b95f411 Mon Sep 17 00:00:00 2001
+From: David Redondo <kde@david-redondo.de>
+Date: Tue, 14 Jul 2020 13:02:51 +0200
+Subject: [PATCH] Do not remove virtual method from build
+
+Method was deprecated in fc5738ab7c4025a87e2bbd656914b6187df7a9eb. Removing the
+method when building without deprecated methods (for example the pim runner
+does this) changes the vtable leading to crashes.
+BUG: 423003
+---
+ src/abstractrunner.cpp | 2 --
+ src/abstractrunner.h | 2 --
+ 2 files changed, 4 deletions(-)
+
+diff --git a/src/abstractrunner.cpp b/src/abstractrunner.cpp
+index 378c73d..34c44d1 100644
+--- a/src/abstractrunner.cpp
++++ b/src/abstractrunner.cpp
+@@ -244,12 +244,10 @@ void AbstractRunner::setHasRunOptions(bool hasRunOptions)
+ }
+ #endif
+
+-#if KRUNNER_BUILD_DEPRECATED_SINCE(5, 71)
+ void AbstractRunner::createRunOptions(QWidget *parent)
+ {
+ Q_UNUSED(parent)
+ }
+-#endif
+
+ AbstractRunner::Speed AbstractRunner::speed() const
+ {
+diff --git a/src/abstractrunner.h b/src/abstractrunner.h
+index cb4e32a..ae9558d 100644
+--- a/src/abstractrunner.h
++++ b/src/abstractrunner.h
+@@ -161,7 +161,6 @@ class KRUNNER_EXPORT AbstractRunner : public QObject
+ bool hasRunOptions();
+ #endif
+
+-#if KRUNNER_ENABLE_DEPRECATED_SINCE(5, 71)
+ /**
+ * If hasRunOptions() returns true, this method may be called to get
+ * a widget displaying the options the user can interact with to modify
+@@ -172,7 +171,6 @@ class KRUNNER_EXPORT AbstractRunner : public QObject
+ */
+ KRUNNER_DEPRECATED_VERSION_BELATED(5, 71, 5, 0, "No longer use, feature removed")
+ virtual void createRunOptions(QWidget *widget);
+-#endif
+
+ /**
+ * Called whenever an exact or possible match associated with this
+--
+GitLab
+
diff --git a/kde/patch/kscreenlocker.patch b/kde/patch/kscreenlocker.patch
deleted file mode 100644
index d1b51ea..0000000
--- a/kde/patch/kscreenlocker.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-# KDEBUG #358125, also CVE-2016-2312 (fixed in Plasma 5.5.5):
-# Dont quit the Greeter when last window closes.
-#cat $CWD/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Backport two important stability fixes from 5.14 -
-# Force software rendering when greeter crashed:
-#cat $CWD/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-# Load QtQuickSettings for software rendering (KDEBUG #347772):
-# Applied in Plasma 5.13.5:
-#cat $CWD/patch/kscreenlocker/kscreenlocker_rendersettings.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-
-
diff --git a/kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch b/kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch
deleted file mode 100644
index 492ef80..0000000
--- a/kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From: Martin Gräßlin <mgraesslin@kde.org>
-Date: Fri, 05 Feb 2016 09:30:19 +0000
-Subject: [greeter] Dont quit when last window closes
-X-Git-Url: http://quickgit.kde.org/?p=kscreenlocker.git&a=commitdiff&h=fae65f1cdd6446042b31ccd0eafd7a4c0b6623e3
----
-[greeter] Dont quit when last window closes
-
-Qt allows to have no screens. If all XRandR screens are disconnected
-there are also no QScreens. This is from an X11 perspective wrong, but
-we have to deal with it. No QScreens means that all views are destroyed
-and no new ones are created. Thus all windows close and the greeter
-exited successfully which in turn unlocked the screen.
-
-This change ensures that the greeter doesn't exit when all windows close.
-
-Funnily this was not a problem with the well known issue of Qt
-crashing when all screens are disconnected. The lock screen handles
-crashes gracefully and just restarts or more likely Qt also crashes
-the application using KSld and thus taking down the complete session.
-
-BUG: 358125
-FIXED-IN: 5.5.5
----
-
-
---- a/greeter/main.cpp
-+++ b/greeter/main.cpp
-@@ -59,6 +59,7 @@
- qputenv("QT_IM_MODULE", QByteArrayLiteral("compose"));
- }
- ScreenLocker::UnlockApp app(argc, argv);
-+ app.setQuitOnLastWindowClosed(false);
- QCoreApplication::setApplicationName(QStringLiteral("kscreenlocker_greet"));
- QCoreApplication::setApplicationVersion(QStringLiteral("0.1"));
- QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
-
diff --git a/kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch b/kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch
deleted file mode 100644
index 06045d7..0000000
--- a/kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-From 875e44f56d4597ba3b65f5bf4ff2b315376c05a4 Mon Sep 17 00:00:00 2001
-From: Kai Uwe Broulik <kde@privat.broulik.de>
-Date: Wed, 11 Jul 2018 18:01:41 +0200
-Subject: Force software rendering when greeter crashed
-
-We have a fallback QML theme for when the look and feel package is broken but when the
-graphics driver is broken (e.g. proprietary graphics driver update) the lock screen would
-stop working. When the greeter crashed, better play safe and force software rendering
-
-Reviewed-By: d_ed
----
- ksldapp.cpp | 13 +++++++++++--
- ksldapp.h | 9 +++++++++
- 2 files changed, 20 insertions(+), 2 deletions(-)
-
-diff --git a/ksldapp.cpp b/ksldapp.cpp
-index 892826f..5fe28ea 100644
---- a/ksldapp.cpp
-+++ b/ksldapp.cpp
-@@ -66,6 +66,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
- namespace ScreenLocker
- {
-
-+static const QString s_qtQuickBackend = QStringLiteral("QT_QUICK_BACKEND");
-+
- static KSldApp * s_instance = nullptr;
-
- KSldApp* KSldApp::self()
-@@ -226,6 +228,8 @@ void KSldApp::initialize()
- // failure, restart lock process
- m_greeterCrashedCounter++;
- if (m_greeterCrashedCounter < 4) {
-+ // Perhaps it crashed due to a graphics driver issue, force software rendering now
-+ setForceSoftwareRendering(true);
- startLockProcess(EstablishLock::Immediate);
- } else if (m_lockWindow) {
- m_lockWindow->emergencyShow();
-@@ -385,6 +389,7 @@ void KSldApp::lock(EstablishLock establishLock)
-
- m_lockState = AcquiringLock;
-
-+ setForceSoftwareRendering(false);
- // start unlock screen process
- startLockProcess(establishLock);
- emit lockStateChanged();
-@@ -546,6 +551,8 @@ bool KSldApp::isFdoPowerInhibited() const
-
- void KSldApp::startLockProcess(EstablishLock establishLock)
- {
-+ QProcessEnvironment env = m_greeterEnv;
-+
- if (m_isWayland && m_waylandDisplay) {
- int sx[2];
- if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sx) < 0) {
-@@ -566,9 +573,7 @@ void KSldApp::startLockProcess(EstablishLock establishLock)
- emit greeterClientConnectionChanged();
- int socket = dup(sx[1]);
- if (socket >= 0) {
-- QProcessEnvironment env = m_greeterEnv;
- env.insert("WAYLAND_SOCKET", QByteArray::number(socket));
-- m_lockProcess->setProcessEnvironment(env);
- }
- }
- QStringList args;
-@@ -587,6 +592,9 @@ void KSldApp::startLockProcess(EstablishLock establishLock)
- if (m_lockGrace == -1) {
- args << QStringLiteral("--nolock");
- }
-+ if (m_forceSoftwareRendering) {
-+ env.insert(s_qtQuickBackend, QStringLiteral("software"));
-+ }
-
- // start the Wayland server
- int fd = m_waylandServer->start();
-@@ -598,6 +606,7 @@ void KSldApp::startLockProcess(EstablishLock establishLock)
- args << QStringLiteral("--ksldfd");
- args << QString::number(fd);
-
-+ m_lockProcess->setProcessEnvironment(env);
- m_lockProcess->start(QStringLiteral(KSCREENLOCKER_GREET_BIN), args);
- close(fd);
- }
-diff --git a/ksldapp.h b/ksldapp.h
-index 4849588..b6d6703 100644
---- a/ksldapp.h
-+++ b/ksldapp.h
-@@ -127,6 +127,14 @@ public:
- m_lockGrace = msec;
- }
-
-+ bool forceSoftwareRendering() const {
-+ return m_forceSoftwareRendering;
-+ }
-+
-+ void setForceSoftwareRendering(bool force) {
-+ m_forceSoftwareRendering = force;
-+ }
-+
- Q_SIGNALS:
- void locked();
- void unlocked();
-@@ -179,6 +187,7 @@ private:
- LogindIntegration *m_logind;
- GlobalAccel *m_globalAccel = nullptr;
- bool m_hasXInput2 = false;
-+ bool m_forceSoftwareRendering = false;
-
- bool m_isX11;
- bool m_isWayland;
---
-cgit v0.11.2
-
diff --git a/kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch b/kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch
deleted file mode 100644
index 2802a1a..0000000
--- a/kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 3f104cbb0a34024dc1aa45538d2ef2403a7a45f0 Mon Sep 17 00:00:00 2001
-From: David Edmundson <kde@davidedmundson.co.uk>
-Date: Fri, 10 Aug 2018 01:18:42 +0200
-Subject: Load QtQuickSettings for software rendering
-
-We had support for falling back on errors yet somehow
-the initial basic loading was missing.
-
-Summary: BUG: 347772
-
-Test Plan: Compiles
-
-Reviewers: #plasma, broulik
-
-Reviewed By: #plasma, broulik
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D14708
----
- greeter/main.cpp | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/greeter/main.cpp b/greeter/main.cpp
-index ff64a55..6db87e1 100644
---- a/greeter/main.cpp
-+++ b/greeter/main.cpp
-@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- *********************************************************************/
- #include <KLocalizedString>
-+#include <KQuickAddons/QtQuickSettings>
-
- #include <QDateTime>
- #include <QCommandLineParser>
-@@ -85,6 +86,8 @@ int main(int argc, char* argv[])
- QCoreApplication::setApplicationVersion(QStringLiteral("0.1"));
- QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
-
-+ KQuickAddons::QtQuickSettings::init();
-+
- // disable session management for the greeter
- auto disableSessionManagement = [](QSessionManager &sm) {
- sm.setRestartHint(QSessionManager::RestartNever);
---
-cgit v0.11.2
-
diff --git a/kde/patch/kstars.patch b/kde/patch/kstars.patch
deleted file mode 100644
index 8367818..0000000
--- a/kde/patch/kstars.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-#cat $CWD/patch/kstars/kstars_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kstars/kstars_isnan.patch b/kde/patch/kstars/kstars_isnan.patch
deleted file mode 100644
index 1c4aef3..0000000
--- a/kde/patch/kstars/kstars_isnan.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From: Christian Dersch <lupinix@mailbox.org>
-Date: Wed, 03 Feb 2016 10:19:55 +0000
-Subject: Fix compilation with gcc 6.x (namespace std has to be used explicitly in some cases, e.g. when ambiguous)
-X-Git-Url: http://quickgit.kde.org/?p=kstars.git&a=commitdiff&h=7d34e52f4dd6e15b871596b3c64d4c7cdba599b4
----
-Fix compilation with gcc 6.x (namespace std has to be used explicitly in some cases, e.g. when ambiguous)
-REVIEW:126976
----
-
-
---- a/kstars/fitsviewer/fitsdata.cpp
-+++ b/kstars/fitsviewer/fitsdata.cpp
-@@ -548,7 +548,7 @@
- int diff_x=s1->x - s2->x;
- int diff_y=s1->y - s2->y;
-
-- dis = abs( sqrt( diff_x*diff_x + diff_y*diff_y));
-+ dis = std::abs( sqrt( diff_x*diff_x + diff_y*diff_y));
- dis -= s1->width/2;
- dis -= s2->width/2;
-
-
---- a/kstars/tools/horizonmanager.cpp
-+++ b/kstars/tools/horizonmanager.cpp
-@@ -192,7 +192,7 @@
- az = dms::fromString(regionItem->child(i, 1)->data(Qt::DisplayRole).toString(), true);
- alt = dms::fromString(regionItem->child(i, 2)->data(Qt::DisplayRole).toString(), true);
-
-- if (isnan(az.Degrees()) || isnan(alt.Degrees()))
-+ if (std::isnan(az.Degrees()) || std::isnan(alt.Degrees()))
- return false;
-
- p.setAz(az);
-@@ -534,9 +534,9 @@
- dms azAngle = dms::fromString(parent->child(item->row(),1)->data(Qt::DisplayRole).toString(), true);
- dms altAngle = dms::fromString(parent->child(item->row(),2)->data(Qt::DisplayRole).toString(), true);
-
-- if (isnan(azAngle.Degrees()))
-+ if (std::isnan(azAngle.Degrees()))
- azOK = false;
-- if (isnan(altAngle.Degrees()))
-+ if (std::isnan(altAngle.Degrees()))
- altOK = false;
-
- if ( (item->column() == 1 && azOK == false) || (item->column() == 2 && altOK == false) )
-
diff --git a/kde/patch/ksudoku.patch b/kde/patch/ksudoku.patch
deleted file mode 100644
index d379585..0000000
--- a/kde/patch/ksudoku.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Qt5 apps accept qwindowtitle, not caption. KDEBUG 381087,
-# however ksudoku-17.04.x is still kdelibs4 based:
-#cat $CWD/patch/ksudoku/ksudoku_qwindowtitle.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ksudoku/ksudoku_qwindowtitle.patch b/kde/patch/ksudoku/ksudoku_qwindowtitle.patch
deleted file mode 100644
index 3417b34..0000000
--- a/kde/patch/ksudoku/ksudoku_qwindowtitle.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Qt5 .desktop files for apps accept qwindowtitle, not caption.
-However, the 17.04 branch of ksudoku is still kdelibs4 based, and the
-patch applied to KDE BUG 381087 broke the launch of ksudoku here:
-
---- a/src/gui/org.kde.ksudoku.desktop 2017-06-13 02:44:11.000000000 +0200
-+++ b/src/gui/org.kde.ksudoku.desktop 2017-07-15 11:58:32.027477614 +0200
-@@ -50,7 +50,7 @@
- Name[x-test]=xxKSudokuxx
- Name[zh_CN]=KSudoku
- Name[zh_TW]=KSudoku
--Exec=ksudoku %i -qwindowtitle %c
-+Exec=ksudoku %i -caption %c
- Icon=ksudoku
- Type=Application
- X-DocPath=ksudoku/index.html
diff --git a/kde/patch/ktexteditor.patch b/kde/patch/ktexteditor.patch
deleted file mode 100644
index a4f0aad..0000000
--- a/kde/patch/ktexteditor.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix indentation for some languages (e.g. Python) in Kate and KDevelop:
-#cat $CWD/patch/ktexteditor/ktexteditor_fix_indentation.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ktexteditor/ktexteditor_fix_indentation.patch b/kde/patch/ktexteditor/ktexteditor_fix_indentation.patch
deleted file mode 100644
index fc5d9d9..0000000
--- a/kde/patch/ktexteditor/ktexteditor_fix_indentation.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From aeebeadb5f5955995c17de56cf83ba7166a132dd Mon Sep 17 00:00:00 2001
-From: Sven Brauch <mail@svenbrauch.de>
-Date: Mon, 16 Oct 2017 18:35:50 +0200
-Subject: fix some indenters from indenting on random characters
-
-If triggerCharacters was not set, toString() would return "undefined",
-making indenters trigger on u, n, d, e, f, i and n.
-
-Differential Revision: https://phabricator.kde.org/D8333
----
- src/script/kateindentscript.cpp | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/src/script/kateindentscript.cpp b/src/script/kateindentscript.cpp
-index 15ce387..380bd45 100644
---- a/src/script/kateindentscript.cpp
-+++ b/src/script/kateindentscript.cpp
-@@ -46,7 +46,10 @@ const QString &KateIndentScript::triggerCharacters()
-
- m_triggerCharactersSet = true;
-
-- m_triggerCharacters = global(QStringLiteral("triggerCharacters")).toString();
-+ auto triggerCharacters = global(QStringLiteral("triggerCharacters"));
-+ if ( !triggerCharacters.isUndefined() ) {
-+ m_triggerCharacters = triggerCharacters.toString();
-+ }
-
- //qCDebug(LOG_KTE) << "trigger chars: '" << m_triggerCharacters << "'";
-
---
-cgit v0.11.2
-
diff --git a/kde/patch/ktorrent.patch b/kde/patch/ktorrent.patch
index 123f3af..0fdb4aa 100644
--- a/kde/patch/ktorrent.patch
+++ b/kde/patch/ktorrent.patch
@@ -1,3 +1,10 @@
# Embed a copy of the GeoIP database since the download link no longer works.
cat $CWD/patch/ktorrent/ktorrent.use.package.geoip.database.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+# Fix linking against taglib (ktorrent 5.2),
+# Thanks to Gentoo.
+cat $CWD/patch/ktorrent/ktorrent_taglib_linking.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+
+# Fix showing ktorrent in the system tray,
+# Thanks to Gentoo.
+cat $CWD/patch/ktorrent/ktorrent_systray.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/ktorrent/ktorrent_systray.patch b/kde/patch/ktorrent/ktorrent_systray.patch
new file mode 100644
index 0000000..50049af
--- /dev/null
+++ b/kde/patch/ktorrent/ktorrent_systray.patch
@@ -0,0 +1,24 @@
+From 9747a8f524942b57e2fd42254c3de73f9d42918c Mon Sep 17 00:00:00 2001
+From: Matt Scheirer <matt.scheirer@gmail.com>
+Date: Sun, 17 May 2020 02:36:09 -0400
+Subject: [PATCH] Fix starting in tray by removing redundant show() in main
+
+---
+ ktorrent/main.cpp | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/ktorrent/main.cpp b/ktorrent/main.cpp
+index b5866c22..8e532c9c 100644
+--- a/ktorrent/main.cpp
++++ b/ktorrent/main.cpp
+@@ -208,7 +208,6 @@ int main(int argc, char** argv)
+ bt::InitLog(kt::DataDir(kt::CreateIfNotExists) + QLatin1String("log"), true, true, logToStdout);
+
+ kt::GUI widget;
+- widget.show();
+
+ auto handleCmdLine = [&widget, &parser](const QStringList &arguments, const QString &workingDirectory)
+ {
+--
+GitLab
+
diff --git a/kde/patch/ktorrent/ktorrent_taglib_linking.patch b/kde/patch/ktorrent/ktorrent_taglib_linking.patch
new file mode 100644
index 0000000..7f612c8
--- /dev/null
+++ b/kde/patch/ktorrent/ktorrent_taglib_linking.patch
@@ -0,0 +1,248 @@
+From f4c1c91d9b091941ebb4dae6aef95bcf9bc1c388 Mon Sep 17 00:00:00 2001
+From: David Faure <faure@kde.org>
+Date: Sun, 21 Jun 2020 14:19:49 +0200
+Subject: [PATCH] Update FindTaglib from ECM.
+
+This fixes linking for me, there was just nothing in TAGLIB_LIBRARIES
+on my system (taglib in the same custom prefix as KDE code)
+---
+ cmake/modules/FindTaglib.cmake | 191 +++++++++++------------------
+ plugins/mediaplayer/CMakeLists.txt | 3 +-
+ 2 files changed, 74 insertions(+), 120 deletions(-)
+
+diff --git a/cmake/modules/FindTaglib.cmake b/cmake/modules/FindTaglib.cmake
+index 13db60b2..1e1b9075 100644
+--- a/cmake/modules/FindTaglib.cmake
++++ b/cmake/modules/FindTaglib.cmake
+@@ -1,135 +1,90 @@
+-# - Try to find the Taglib library
+-# Once done this will define
++#.rst:
++# FindTaglib
++#-----------
+ #
+-# TAGLIB_FOUND - system has the taglib library
+-# TAGLIB_CFLAGS - the taglib cflags
+-# TAGLIB_LIBRARIES - The libraries needed to use taglib
+-
+-# Copyright (c) 2006, Laurent Montel, <montel@kde.org>
++# Try to find the Taglib library.
+ #
+-# Redistribution and use is allowed according to the terms of the BSD license.
+-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+-
+-if(NOT TAGLIB_MIN_VERSION)
+- set(TAGLIB_MIN_VERSION "1.6")
+-endif()
+-
+-if(NOT WIN32)
+- find_program(TAGLIBCONFIG_EXECUTABLE NAMES taglib-config PATHS
+- ${BIN_INSTALL_DIR}
+- )
+-endif()
+-
+-#reset vars
+-set(TAGLIB_LIBRARIES)
+-set(TAGLIB_CFLAGS)
+-
+-# if taglib-config has been found
+-if(TAGLIBCONFIG_EXECUTABLE)
+-
+- exec_program(${TAGLIBCONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB_VERSION)
+-
+- if("${TAGLIB_MIN_VERSION}" VERSION_GREATER TAGLIB_VERSION)
+- message(STATUS "TagLib version too old: version searched :${TAGLIB_MIN_VERSION}, found ${TAGLIB_VERSION}")
+- set(TAGLIB_FOUND FALSE)
+- else()
+-
+- exec_program(${TAGLIBCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB_LIBRARIES)
+-
+- exec_program(${TAGLIBCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB_CFLAGS)
++# This will define the following variables:
++#
++# ``Taglib_FOUND``
++# True if the system has the taglib library of at least the minimum
++# version specified by the version parameter to find_package()
++# ``Taglib_INCLUDE_DIRS``
++# The taglib include dirs for use with target_include_directories
++# ``Taglib_LIBRARIES``
++# The taglib libraries for use with target_link_libraries()
++# ``Taglib_VERSION``
++# The version of taglib that was found
++#
++# If ``Taglib_FOUND is TRUE, it will also define the following imported
++# target:
++#
++# ``Taglib::Taglib``
++# The Taglib library
++#
++# Since 5.72.0
++#
++# SPDX-FileCopyrightText: 2006 Laurent Montel <montel@kde.org>
++# SPDX-FileCopyrightText: 2019 Heiko Becker <heirecka@exherbo.org>
++# SPDX-FileCopyrightText: 2020 Elvis Angelaccio <elvis.angelaccio@kde.org>
++# SPDX-License-Identifier: BSD-3-Clause
+
+- if(TAGLIB_LIBRARIES AND TAGLIB_CFLAGS)
+- set(TAGLIB_FOUND TRUE)
+- endif()
+- string(REGEX REPLACE " *-I" ";" TAGLIB_INCLUDES "${TAGLIB_CFLAGS}")
+- endif()
+- mark_as_advanced(TAGLIB_CFLAGS TAGLIB_LIBRARIES TAGLIB_INCLUDES)
++find_package(PkgConfig QUIET)
+
+-else()
++pkg_search_module(PC_TAGLIB QUIET taglib)
+
+- find_path(TAGLIB_INCLUDES
+- NAMES
+- tag.h
++find_path(Taglib_INCLUDE_DIRS
++ NAMES tag.h
+ PATH_SUFFIXES taglib
+- PATHS
+- ${KDE4_INCLUDE_DIR}
+- ${INCLUDE_INSTALL_DIR}
+- )
+-
+- if(NOT WIN32)
+- # on non-win32 we don't need to take care about WIN32_DEBUG_POSTFIX
++ HINTS ${PC_TAGLIB_INCLUDEDIR}
++)
+
+- find_library(TAGLIB_LIBRARIES tag PATHS ${KDE4_LIB_DIR} ${LIB_INSTALL_DIR})
++find_library(Taglib_LIBRARIES
++ NAMES tag
++ HINTS ${PC_TAGLIB_LIBDIR}
++)
+
+- else()
++set(Taglib_VERSION ${PC_TAGLIB_VERSION})
+
+- # 1. get all possible libnames
+- set(args PATHS ${KDE4_LIB_DIR} ${LIB_INSTALL_DIR})
+- set(newargs "")
+- set(libnames_release "")
+- set(libnames_debug "")
++if (Taglib_INCLUDE_DIRS AND NOT Taglib_VERSION)
++ if(EXISTS "${Taglib_INCLUDE_DIRS}/taglib.h")
++ file(READ "${Taglib_INCLUDE_DIRS}/taglib.h" TAGLIB_H)
+
+- list(LENGTH args listCount)
++ string(REGEX MATCH "#define TAGLIB_MAJOR_VERSION[ ]+[0-9]+" TAGLIB_MAJOR_VERSION_MATCH ${TAGLIB_H})
++ string(REGEX MATCH "#define TAGLIB_MINOR_VERSION[ ]+[0-9]+" TAGLIB_MINOR_VERSION_MATCH ${TAGLIB_H})
++ string(REGEX MATCH "#define TAGLIB_PATCH_VERSION[ ]+[0-9]+" TAGLIB_PATCH_VERSION_MATCH ${TAGLIB_H})
+
+- # just one name
+- list(APPEND libnames_release "tag")
+- list(APPEND libnames_debug "tagd")
+-
+- set(newargs ${args})
+-
+- # search the release lib
+- find_library(TAGLIB_LIBRARIES_RELEASE
+- NAMES ${libnames_release}
+- ${newargs}
+- )
+-
+- # search the debug lib
+- find_library(TAGLIB_LIBRARIES_DEBUG
+- NAMES ${libnames_debug}
+- ${newargs}
+- )
+-
+- if(TAGLIB_LIBRARIES_RELEASE AND TAGLIB_LIBRARIES_DEBUG)
+-
+- # both libs found
+- set(TAGLIB_LIBRARIES optimized ${TAGLIB_LIBRARIES_RELEASE}
+- debug ${TAGLIB_LIBRARIES_DEBUG})
+-
+- else()
+-
+- if(TAGLIB_LIBRARIES_RELEASE)
+-
+- # only release found
+- set(TAGLIB_LIBRARIES ${TAGLIB_LIBRARIES_RELEASE})
+-
+- else()
+-
+- # only debug (or nothing) found
+- set(TAGLIB_LIBRARIES ${TAGLIB_LIBRARIES_DEBUG})
+-
+- endif()
+-
+- endif()
+-
+- mark_as_advanced(TAGLIB_LIBRARIES_RELEASE)
+- mark_as_advanced(TAGLIB_LIBRARIES_DEBUG)
++ string(REGEX REPLACE ".*_MAJOR_VERSION[ ]+(.*)" "\\1" TAGLIB_MAJOR_VERSION "${TAGLIB_MAJOR_VERSION_MATCH}")
++ string(REGEX REPLACE ".*_MINOR_VERSION[ ]+(.*)" "\\1" TAGLIB_MINOR_VERSION "${TAGLIB_MINOR_VERSION_MATCH}")
++ string(REGEX REPLACE ".*_PATCH_VERSION[ ]+(.*)" "\\1" TAGLIB_PATCH_VERSION "${TAGLIB_PATCH_VERSION_MATCH}")
+
++ set(Taglib_VERSION "${TAGLIB_MAJOR_VERSION}.${TAGLIB_MINOR_VERSION}.${TAGLIB_PATCH_VERSION}")
+ endif()
+-
+- include(FindPackageMessage)
+- include(FindPackageHandleStandardArgs)
+- find_package_handle_standard_args(Taglib DEFAULT_MSG TAGLIB_INCLUDES TAGLIB_LIBRARIES)
+-
+ endif()
+
+-
+-if(TAGLIB_FOUND)
+- if(NOT Taglib_FIND_QUIETLY AND TAGLIBCONFIG_EXECUTABLE)
+- message(STATUS "Taglib found: ${TAGLIB_LIBRARIES}")
+- endif()
+-else()
+- if(Taglib_FIND_REQUIRED)
+- message(FATAL_ERROR "Could not find Taglib")
+- endif()
++include(FindPackageHandleStandardArgs)
++find_package_handle_standard_args(Taglib
++ FOUND_VAR
++ Taglib_FOUND
++ REQUIRED_VARS
++ Taglib_LIBRARIES
++ Taglib_INCLUDE_DIRS
++ VERSION_VAR
++ Taglib_VERSION
++)
++
++if (Taglib_FOUND AND NOT TARGET Taglib::Taglib)
++ add_library(Taglib::Taglib UNKNOWN IMPORTED)
++ set_target_properties(Taglib::Taglib PROPERTIES
++ IMPORTED_LOCATION "${Taglib_LIBRARIES}"
++ INTERFACE_INCLUDE_DIRECTORIES "${Taglib_INCLUDE_DIRS}"
++ )
+ endif()
+
++mark_as_advanced(Taglib_LIBRARIES Taglib_INCLUDE_DIRS)
++
++include(FeatureSummary)
++set_package_properties(Taglib PROPERTIES
++ URL "https://taglib.org/"
++ DESCRIPTION "A library for reading and editing the meta-data of audio formats"
++)
+diff --git a/plugins/mediaplayer/CMakeLists.txt b/plugins/mediaplayer/CMakeLists.txt
+index 8bbeeb74..5fbe056f 100644
+--- a/plugins/mediaplayer/CMakeLists.txt
++++ b/plugins/mediaplayer/CMakeLists.txt
+@@ -1,5 +1,4 @@
+ find_package(Taglib REQUIRED)
+-include_directories(${TAGLIB_INCLUDES})
+ #find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Multimedia MultimediaWidgets)
+ #include_directories(${Qt5Multimedia_INCLUDE_DIRS})
+ include_directories(${PHONON_INCLUDES})
+@@ -34,7 +33,7 @@ kcoreaddons_desktop_to_json(ktorrent_mediaplayer ktorrent_mediaplayer.desktop)
+ target_link_libraries(
+ ktorrent_mediaplayer
+ ktcore
+- ${TAGLIB_LIBRARIES}
++ Taglib::Taglib
+ Phonon::phonon4qt5
+ KF5::Torrent
+ KF5::I18n
+--
+GitLab
+
+
diff --git a/kde/patch/ktp-accounts-kcm.patch b/kde/patch/ktp-accounts-kcm.patch
deleted file mode 100644
index ea37b9e..0000000
--- a/kde/patch/ktp-accounts-kcm.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix a crash in KDE Telepathy which was supposed to be fixed in 15.08.2:
-# See also https://bugs.kde.org/show_bug.cgi?id=351785
-#cat $CWD/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch b/kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch
deleted file mode 100644
index aa77aae..0000000
--- a/kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Martin Klapetek <mklapetek@kde.org>
-Date: Thu, 17 Sep 2015 16:11:30 +0000
-Subject: [kaccounts] Emit configUiReady() when config UI is ready
-X-Git-Url: http://quickgit.kde.org/?p=ktp-accounts-kcm.git&a=commitdiff&h=07c7cc5309e11171b2e552678d58257ccfc44e42
----
-[kaccounts] Emit configUiReady() when config UI is ready
-
-Should prevent the crash when clicking the Configure button
-
-(requires kaccounts-integration 15.08.2)
-
-BUG: 351785
-FIXED-IN: 15.08.2
----
-
-
---- a/plugins/kaccounts/kaccounts-ui-provider.cpp
-+++ b/plugins/kaccounts/kaccounts-ui-provider.cpp
-@@ -106,10 +106,10 @@
-
- if (d->type == KAccountsUiPlugin::ConfigureAccountDialog) {
- if (d->accountManager->isReady()) {
-- Q_EMIT uiReady();
-+ Q_EMIT configUiReady();
- } else {
- // let's wait for AM to become ready first
-- connect(d->accountManager->becomeReady(), &Tp::PendingOperation::finished, this, &KAccountsUiProvider::uiReady);
-+ connect(d->accountManager->becomeReady(), &Tp::PendingOperation::finished, this, &KAccountsUiProvider::configUiReady);
- }
- }
- }
-
diff --git a/kde/patch/kwin.patch b/kde/patch/kwin.patch
deleted file mode 100644
index 9f05f30..0000000
--- a/kde/patch/kwin.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-# Trivial patch for testing the CK2 session controller interface
-# as a replacement for systemd-logind;
-#cat $CWD/patch/kwin/kwin_replace_logind_with_ck2.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Workaround Qt regression no longer delivering events for the root window.
-# Fixed in kwin 5.10.3.
-#cat $CWD/patch/kwin/kwin_qt59_rootwindow_events.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix compilation with cmake 3.10 (fixed in 5.12.0):
-#cat $CWD/patch/kwin/kwin_cmake310.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kwin/kwin_cmake310.patch b/kde/patch/kwin/kwin_cmake310.patch
deleted file mode 100644
index 5675ba5..0000000
--- a/kde/patch/kwin/kwin_cmake310.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-Taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/tree/kde-plasma/kwin/files/kwin-5.11.5-cmake-3.10.patch
-
-From cd544890ced4192d07467c89e23adbb62d8cea5c Mon Sep 17 00:00:00 2001
-From: Milian Wolff <mail@milianw.de>
-Date: Mon, 18 Dec 2017 11:40:35 +0100
-Subject: Fix build with CMake 3.10
-
-Looks like a classic false-positive, but this makes the compile
-pass for me without making the code harder to read:
-
-AutoMoc error
--------------
- "/ssd/milian/projects/kf5/src/kde/workspace/kwin/kcmkwin/kwinscripts/main.cpp"
-The file contains a K_PLUGIN_FACTORY macro, but does not include "main.moc"!
-Consider to
- - add #include "main.moc"
- - enable SKIP_AUTOMOC for this file
-
-So we just add the include and then get rid of the duplicate
-definition of the plugin factory and the problem is resolved.
----
- kcmkwin/kwinscripts/main.cpp | 2 ++
- kcmkwin/kwinscripts/module.cpp | 2 --
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/kcmkwin/kwinscripts/main.cpp b/kcmkwin/kwinscripts/main.cpp
-index f5ee04b..baa5175 100644
---- a/kcmkwin/kwinscripts/main.cpp
-+++ b/kcmkwin/kwinscripts/main.cpp
-@@ -22,3 +22,5 @@
-
- K_PLUGIN_FACTORY(KcmKWinScriptsFactory,
- registerPlugin<Module>("kwin-scripts");)
-+
-+#include "main.moc"
-diff --git a/kcmkwin/kwinscripts/module.cpp b/kcmkwin/kwinscripts/module.cpp
-index a0d698e..ccf7d41 100644
---- a/kcmkwin/kwinscripts/module.cpp
-+++ b/kcmkwin/kwinscripts/module.cpp
-@@ -40,8 +40,6 @@
-
- #include "version.h"
-
--K_PLUGIN_FACTORY_DECLARATION(KcmKWinScriptsFactory)
--
- Module::Module(QWidget *parent, const QVariantList &args) :
- KCModule(parent, args),
- ui(new Ui::Module),
---
-cgit v0.11.2
-
diff --git a/kde/patch/kwin/kwin_qt59_rootwindow_events.patch b/kde/patch/kwin/kwin_qt59_rootwindow_events.patch
deleted file mode 100644
index 178d081..0000000
--- a/kde/patch/kwin/kwin_qt59_rootwindow_events.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From a6dee74ee455d1da47dd5c9d55a84adbb5e1426a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Martin=20Fl=C3=B6ser?= <mgraesslin@kde.org>
-Date: Sun, 18 Jun 2017 14:23:33 +0200
-Subject: Workaround Qt regression of no longer delivering events for the root
- window
-
-Summary:
-With qtbase 2b34aefcf02f09253473b096eb4faffd3e62b5f4 we do no longer get
-events reported for the X11 root window. Our keyboard handling in effects
-like PresentWindows and DesktopGrid relied on that.
-
-This change works around the regression by calling winId() on
-qApp->desktop() as suggested in the change. This is a short term solution
-for the 5.10 branch.
-
-This needs to be addressed properly by no longer relying on Qt in this
-area. KWin already does not rely on Qt for Wayland in that area and is
-able to compose the QKeyEvents. This should also be done on X11. It just
-needs some more hook up code for xkb, but that's needed anyway to improve
-modifier only shortcuts and friends.
-
-BUG: 360841
-FIXED-IN: 5.10.3
-
-Reviewers: #kwin, #plasma
-
-Subscribers: plasma-devel, kwin
-
-Tags: #kwin
-
-Differential Revision: https://phabricator.kde.org/D6258
----
- effects.cpp | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/effects.cpp b/effects.cpp
-index d2c4768..8155de6 100644
---- a/effects.cpp
-+++ b/effects.cpp
-@@ -48,6 +48,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
- #include "kwinglutils.h"
-
- #include <QDebug>
-+#include <QDesktopWidget>
-
- #include <Plasma/Theme>
-
-@@ -599,6 +600,11 @@ bool EffectsHandlerImpl::grabKeyboard(Effect* effect)
- bool ret = grabXKeyboard();
- if (!ret)
- return false;
-+ // Workaround for Qt 5.9 regression introduced with 2b34aefcf02f09253473b096eb4faffd3e62b5f4
-+ // we no longer get any events for the root window, one needs to call winId() on the desktop window
-+ // TODO: change effects event handling to create the appropriate QKeyEvent without relying on Qt
-+ // as it's done already in the Wayland case.
-+ qApp->desktop()->winId();
- }
- keyboard_grab_effect = effect;
- return true;
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/kwin/kwin_replace_logind_with_ck2.patch b/kde/patch/kwin/kwin_replace_logind_with_ck2.patch
deleted file mode 100644
index 294a691..0000000
--- a/kde/patch/kwin/kwin_replace_logind_with_ck2.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From: Eric Koegel <eric.koegel@gmail.com>
-Date: Sun, 24 Jul 2016 14:37:26 +0300
-
-Trivial patch for testing the CK2 session controller interface
-as a replacement for systemd-logind;
-Eric Koegel's original patch was rebased to kwin-5.10.2 by Eric Hameleers
-
-diff -uar kwin-5.10.2.orig/logind.cpp kwin-5.10.2/logind.cpp
---- kwin-5.10.2.orig/logind.cpp 2017-06-13 20:19:37.000000000 +0200
-+++ kwin-5.10.2/logind.cpp 2017-06-18 20:49:56.018661568 +0200
-@@ -58,10 +58,10 @@
- namespace KWin
- {
-
--const static QString s_login1Service = QStringLiteral("org.freedesktop.login1");
--const static QString s_login1Path = QStringLiteral("/org/freedesktop/login1");
--const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.login1.Manager");
--const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.login1.Session");
-+const static QString s_login1Service = QStringLiteral("org.freedesktop.ConsoleKit");
-+const static QString s_login1Path = QStringLiteral("/org/freedesktop/ConsoleKit/Manager");
-+const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.ConsoleKit.Manager");
-+const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.ConsoleKit.Session");
- const static QString s_dbusPropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties");
-
- LogindIntegration *LogindIntegration::s_self = nullptr;
-@@ -151,7 +151,7 @@
- return;
- }
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "The session is not registered with logind" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "The session is not registered with ConsoleKit2" << reply.error().message();
- return;
- }
- m_sessionPath = reply.value().path();
-@@ -199,7 +199,7 @@
- m_sessionPath,
- s_dbusPropertiesInterface,
- QStringLiteral("Get"));
-- message.setArguments(QVariantList({s_login1SessionInterface, QStringLiteral("Active")}));
-+ message.setArguments(QVariantList({s_login1SessionInterface, QStringLiteral("active")}));
- QDBusPendingReply<QVariant> reply = m_bus.asyncCall(message);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
- connect(watcher, &QDBusPendingCallWatcher::finished, this,
-@@ -207,7 +207,7 @@
- QDBusPendingReply<QVariant> reply = *self;
- self->deleteLater();
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "Failed to get Active Property of logind session:" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "Failed to get Active Property of ConsoleKit2 session:" << reply.error().message();
- return;
- }
- const bool active = reply.value().toBool();
-@@ -236,7 +236,7 @@
- QDBusPendingReply<QVariant> reply = *self;
- self->deleteLater();
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "Failed to get VTNr Property of logind session:" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "Failed to get VTNr Property of ConsoleKit2 session:" << reply.error().message();
- return;
- }
- const int vt = reply.value().toUInt();
-@@ -365,12 +365,12 @@
- QDBusPendingReply<QVariant> reply = *self;
- self->deleteLater();
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "Failed to get Seat Property of logind session:" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "Failed to get Seat Property of ConsoleKit2 session:" << reply.error().message();
- return;
- }
- DBusLogindSeat seat = qdbus_cast<DBusLogindSeat>(reply.value().value<QDBusArgument>());
- const QString seatPath = seat.path.path();
-- qCDebug(KWIN_CORE) << "Logind seat:" << seat.name << "/" << seatPath;
-+ qCDebug(KWIN_CORE) << "ConsoleKit2 seat:" << seat.name << "/" << seatPath;
- if (m_seatPath != seatPath) {
- m_seatPath = seatPath;
- }
-@@ -385,7 +385,7 @@
- }
- QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service,
- m_seatPath,
-- QStringLiteral("org.freedesktop.login1.Seat"),
-+ QStringLiteral("org.freedesktop.ConsoleKit.Seat"),
- QStringLiteral("SwitchTo"));
- message.setArguments(QVariantList{vtNr});
- m_bus.asyncCall(message);
diff --git a/kde/patch/libkdcraw.patch b/kde/patch/libkdcraw.patch
deleted file mode 100644
index fd8cf51..0000000
--- a/kde/patch/libkdcraw.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Backport a patch from git to support our newer cmake:
-#cat $CWD/patch/libkdcraw/libkdcraw_cmake_minver.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkdcraw/libkdcraw_cmake_minver.patch b/kde/patch/libkdcraw/libkdcraw_cmake_minver.patch
deleted file mode 100644
index 3446a19..0000000
--- a/kde/patch/libkdcraw/libkdcraw_cmake_minver.patch
+++ /dev/null
@@ -1,7 +0,0 @@
---- libkdcraw-15.08.0.orig/CMakeLists.txt 2015-05-14 22:54:16.000000000 +0200
-+++ libkdcraw-15.08.0/CMakeLists.txt 2015-08-25 13:37:50.880746449 +0200
-@@ -1,3 +1,4 @@
-+cmake_minimum_required(VERSION 2.8.9)
- #
- # Copyright (c) 2010-2014, Gilles Caulier, <caulier dot gilles at gmail dot com>
- #
diff --git a/kde/patch/libkexiv2.patch b/kde/patch/libkexiv2.patch
deleted file mode 100644
index 5a61c23..0000000
--- a/kde/patch/libkexiv2.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Backport a patch from git to support our newer cmake:
-#cat $CWD/patch/libkexiv2/libkexiv2_cmake_minver.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkexiv2/libkexiv2_cmake_minver.patch b/kde/patch/libkexiv2/libkexiv2_cmake_minver.patch
deleted file mode 100644
index a83861c..0000000
--- a/kde/patch/libkexiv2/libkexiv2_cmake_minver.patch
+++ /dev/null
@@ -1,7 +0,0 @@
---- libkexiv2-15.08.0.orig/CMakeLists.txt 2015-04-30 21:04:22.000000000 +0200
-+++ libkexiv2-15.08.0/CMakeLists.txt 2015-08-25 13:14:34.093738317 +0200
-@@ -1,3 +1,4 @@
-+cmake_minimum_required(VERSION 2.8.9)
- #
- # Copyright (c) 2010-2014, Gilles Caulier, <caulier dot gilles at gmail dot com>
- #
diff --git a/kde/patch/libkface.patch b/kde/patch/libkface.patch
index 9775e82..f488cf6 100644
--- a/kde/patch/libkface.patch
+++ b/kde/patch/libkface.patch
@@ -1,3 +1,2 @@
# Compile libkface against opencv 3.2:
cat $CWD/patch/libkface/libkface_opencv3.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkleo.patch b/kde/patch/libkleo.patch
deleted file mode 100644
index 9c1cef3..0000000
--- a/kde/patch/libkleo.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Compile libkleo with gcc7:
-# Fixed in Applications 17.04.2:
-#cat $CWD/patch/libkleo/libkleo_gcc7.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkleo/libkleo_gcc7.patch b/kde/patch/libkleo/libkleo_gcc7.patch
deleted file mode 100644
index 40e0616..0000000
--- a/kde/patch/libkleo/libkleo_gcc7.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 675ce908a33d16f3b78d3fc741b0ff45790e4770 Mon Sep 17 00:00:00 2001
-From: Fabian Vogt <fabian@ritter-vogt.de>
-Date: Wed, 17 May 2017 17:05:41 +0200
-Subject: Fix compilation with GCC 7
-
-std::bind is part of functional, and GCC 7 requires an explicit include.
----
- src/kleo/enum.cpp | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/kleo/enum.cpp b/src/kleo/enum.cpp
-index 15ea1fd..829d4fd 100644
---- a/src/kleo/enum.cpp
-+++ b/src/kleo/enum.cpp
-@@ -33,6 +33,9 @@
- #include "enum.h"
- #include "libkleo_debug.h"
- #include "models/keycache.h"
-+
-+#include <functional>
-+
- #include <KLocalizedString>
-
- #include <gpgme++/key.h>
---
-cgit v0.11.2
-
diff --git a/kde/patch/libksysguard.patch b/kde/patch/libksysguard.patch
deleted file mode 100644
index d45baac..0000000
--- a/kde/patch/libksysguard.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-# Fixed post Plasma 5.5.5.
-#cat $CWD/patch/libksysguard/libksysguard_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libksysguard/libksysguard_isnan.patch b/kde/patch/libksysguard/libksysguard_isnan.patch
deleted file mode 100644
index c6ce1e9..0000000
--- a/kde/patch/libksysguard/libksysguard_isnan.patch
+++ /dev/null
@@ -1,176 +0,0 @@
-From: David Rosca <nowrep@gmail.com>
-Date: Tue, 23 Feb 2016 16:32:35 +0000
-Subject: signalplotter: Use std namespaced isnan and isinf
-X-Git-Tag: v5.5.95
-X-Git-Url: http://quickgit.kde.org/?p=libksysguard.git&a=commitdiff&h=b0578798eb3f5bdad0a25ea9b4a52c53ebcfc020
----
-signalplotter: Use std namespaced isnan and isinf
-
-Test Plan: Fixes build for me.
-
-Reviewers: #plasma, ivan
-
-Reviewed By: ivan
-
-Subscribers: ivan, plasma-devel
-
-Projects: #plasma
-
-Differential Revision: https://phabricator.kde.org/D1010
----
-
-
---- a/signalplotter/ksignalplotter.cpp
-+++ b/signalplotter/ksignalplotter.cpp
-@@ -32,8 +32,6 @@
- #include "ksignalplotter_p.h"
- #include "processcore/processcore_debug.h"
-
--#include <math.h> //For floor, ceil, log10 etc for calculating ranges
--
- #include <QPainter>
- #include <QPixmap>
- #include <QPainterPath>
-@@ -49,7 +47,7 @@
-
- #include <klocalizedstring.h>
- #include <kiconloader.h>
--#include <math.h>
-+#include <cmath>
- #include <limits>
-
- #ifdef SVG_SUPPORT
-@@ -485,20 +483,20 @@
- qreal value=0;
- for(int i = sampleBuf.count()-1; i>= 0; i--) {
- qreal newValue = sampleBuf[i];
-- if( !isinf(newValue) && !isnan(newValue) )
-+ if( !std::isinf(newValue) && !std::isnan(newValue) )
- value += newValue;
- }
-- if(isnan(mMinValue) || mMinValue > value) mMinValue = value;
-- if(isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
-+ if(std::isnan(mMinValue) || mMinValue > value) mMinValue = value;
-+ if(std::isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
- if(value > 0.7*mMaxValue)
- mRescaleTime = time;
- } else {
- qreal value;
- for(int i = sampleBuf.count()-1; i>= 0; i--) {
- value = sampleBuf[i];
-- if( !isinf(value) && !isnan(value) ) {
-- if(isnan(mMinValue) || mMinValue > value) mMinValue = value;
-- if(isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
-+ if( !std::isinf(value) && !std::isnan(value) ) {
-+ if(std::isnan(mMinValue) || mMinValue > value) mMinValue = value;
-+ if(std::isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
- if(value > 0.7*mMaxValue)
- mRescaleTime = time;
- }
-@@ -789,9 +787,9 @@
- qreal max = mUserMaxValue;
- qreal min = mUserMinValue;
- if( mUseAutoRange ) {
-- if(!isnan(mMaxValue) && mMaxValue * 0.99 > max) //Allow max value to go very slightly over the given max, for rounding reasons
-+ if(!std::isnan(mMaxValue) && mMaxValue * 0.99 > max) //Allow max value to go very slightly over the given max, for rounding reasons
- max = mMaxValue;
-- if(!isnan(mMinValue) && mMinValue * 0.99 < min) {
-+ if(!std::isnan(mMinValue) && mMinValue * 0.99 < min) {
- min = mMinValue;
- }
- }
-@@ -920,23 +918,23 @@
- bool firstLine = true;
- for (int j = 0; j < count; ++j) {
- qreal point0 = datapoints[j];
-- if( isnan(point0) )
-+ if( std::isnan(point0) )
- continue; //Just do not draw points with nans. skip them
-
- qreal point1 = prev_datapoints[j];
- qreal point2 = prev_prev_datapoints[j];
-
-- if(isnan(point1))
-+ if(std::isnan(point1))
- point1 = point0;
-- else if(mSmoothGraph && !isinf(point1)) {
-+ else if(mSmoothGraph && !std::isinf(point1)) {
- // Apply a weighted average just to smooth the graph out a bit
- // Do not try to smooth infinities or nans
- point0 = (2*point0 + point1)/3;
-- if(!isnan(point2) && !isinf(point2))
-+ if(!std::isnan(point2) && !std::isinf(point2))
- point1 = (2*point1 + point2)/3;
- // We don't bother to average out y2. This will introduce slight inaccuracies in the gradients, but they aren't really noticeable.
- }
-- if(isnan(point2))
-+ if(std::isnan(point2))
- point2 = point1;
-
- if (mStackBeams) {
-@@ -1046,12 +1044,12 @@
- }
- QString KSignalPlotter::lastValueAsString( int i, int precision) const
- {
-- if(d->mBeamData.isEmpty() || d->mBeamData.first().size() <= i || isnan(d->mBeamData.first().at(i))) return QString();
-+ if(d->mBeamData.isEmpty() || d->mBeamData.first().size() <= i || std::isnan(d->mBeamData.first().at(i))) return QString();
- return valueAsString(d->mBeamData.first().at(i), precision); //retrieve the newest value for this beam
- }
- QString KSignalPlotter::valueAsString( qreal value, int precision) const
- {
-- if(isnan(value))
-+ if(std::isnan(value))
- return QString();
- value = value / d->mScaleDownBy; // scale the value. E.g. from Bytes to KiB
- return d->scaledValueAsString(value, precision);
-
---- a/tests/signalplottertest.cpp
-+++ b/tests/signalplottertest.cpp
-@@ -56,8 +56,8 @@
- s->addBeam(Qt::blue);
- s->addBeam(Qt::red);
-
-- QVERIFY( isnan(s->lastValue(0)) ); //unset, so should default to NaN
-- QVERIFY( isnan(s->lastValue(1)) ); //unset, so should default to NaN
-+ QVERIFY( std::isnan(s->lastValue(0)) ); //unset, so should default to NaN
-+ QVERIFY( std::isnan(s->lastValue(1)) ); //unset, so should default to NaN
- QCOMPARE(s->numBeams(), 2);
- QVERIFY(s->beamColor(0) == Qt::blue);
- QVERIFY(s->beamColor(1) == Qt::red);
-@@ -92,7 +92,7 @@
- QVERIFY(s->beamColor(0) == Qt::blue);
- QVERIFY(s->beamColor(1) == Qt::red);
- QCOMPARE(s->lastValue(0), 1.0);
-- QVERIFY( isnan(s->lastValue(1)) ); //unset, so should default to NaN
-+ QVERIFY( std::isnan(s->lastValue(1)) ); //unset, so should default to NaN
- }
-
- void TestSignalPlotter::testReorderBeams()
-@@ -153,8 +153,8 @@
- s->addBeam(Qt::blue);
- s->addBeam(Qt::red);
- QCOMPARE(s->numBeams(), 2);
-- QVERIFY(isnan(s->lastValue(0))); //unset, so should default to NaN
-- QVERIFY(isnan(s->lastValue(1))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(0))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(1))); //unset, so should default to NaN
- //Add some data
- QList<qreal> data;
- data << 1.0 << 2.0;
-@@ -189,13 +189,13 @@
- QCOMPARE(s->numBeams(), 3);
- QCOMPARE(s->lastValue(0), 2.0);
- QCOMPARE(s->lastValue(1), 1.0);
-- QVERIFY(isnan(s->lastValue(2))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(2))); //unset, so should default to NaN
-
- newOrder.clear();
- newOrder << 2 << 0 << 1;
- s->reorderBeams(newOrder);
- QCOMPARE(s->numBeams(), 3);
-- QVERIFY(isnan(s->lastValue(0))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(0))); //unset, so should default to NaN
- QCOMPARE(s->lastValue(1), 2.0);
- QCOMPARE(s->lastValue(2), 1.0);
- }
-
diff --git a/kde/patch/marble.patch b/kde/patch/marble.patch
deleted file mode 100644
index eb2b7fc..0000000
--- a/kde/patch/marble.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Ensure marble bindings for Qt4 get compiled:
-# No longer needed in Applications 15.12.0, libkface was ported to KF5.
-#cat $CWD/patch/marble/marble_qt4.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/marble/marble_qt4.patch b/kde/patch/marble/marble_qt4.patch
deleted file mode 100644
index e497023..0000000
--- a/kde/patch/marble/marble_qt4.patch
+++ /dev/null
@@ -1,47 +0,0 @@
---- marble-15.08.0.orig/CMakeLists.txt 2015-08-12 13:14:02.000000000 +0200
-+++ marble-15.08.0/CMakeLists.txt 2015-08-29 00:24:00.767298683 +0200
-@@ -45,6 +45,8 @@
- ####################################################
- # Specific options for building with Qt 4 vs 5
-
-+option(QT5BUILD "Build for Qt5" ON)
-+
- if(ANDROID)
- if (NOT DEFINED ENV{Qt5_host})
- message(FATAL_ERROR "Configure the env variable Qt5_host to point to your host Qt5 installation.")
-@@ -79,6 +81,7 @@
- include_directories(SYSTEM "$ENV{ANDROID_NDK}/platforms/$ENV{ANDROID_PLATFORM}/arch-arm/usr/include")
- message(STATUS "Include directories: " "$ENV{ANDROID_NDK}/platforms/$ENV{ANDROID_PLATFORM}/arch-arm/usr/include")
- else()
-+ if(QT5BUILD)
- find_package(Qt5WebKit)
- find_package(Qt5WebKitWidgets)
- find_package(Qt5DBus)
-@@ -86,8 +89,10 @@
- if ( NOT Qt5WebKit_FOUND )
- set ( MARBLE_NO_WEBKIT TRUE )
- endif()
-+ endif()
- endif()
-
-+if(QT5BUILD)
- find_package(Qt5Core)
- find_package(Qt5Xml)
- find_package(Qt5Network)
-@@ -100,6 +105,7 @@
- find_package(Qt5Quick)
- find_package(Qt5OpenGL)
- find_package(Qt5PrintSupport)
-+endif()
-
- if(QTONLY)
- # Forward the old QTONLY=TRUE option to the new WITH_KDE=FALSE
-@@ -111,8 +117,6 @@
- unset(QTONLY)
- endif()
-
--option(QT5BUILD "Build for Qt5" ON)
--
- if(QT5BUILD AND Qt5Core_FOUND)
- cmake_minimum_required(VERSION 2.8.12)
- set(QT4BUILD FALSE)
diff --git a/kde/patch/messagelib.patch b/kde/patch/messagelib.patch
deleted file mode 100644
index a76851e..0000000
--- a/kde/patch/messagelib.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# CVE-2018-19516: HTML email can open browser window automatically.
-# Fixed in messagelib of KDE Applications 18.12.0.
-#cat $CWD/patch/messagelib/messagelib_CVE-2018-19516.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/messagelib/messagelib_CVE-2018-19516.patch b/kde/patch/messagelib/messagelib_CVE-2018-19516.patch
deleted file mode 100644
index 599dd39..0000000
--- a/kde/patch/messagelib/messagelib_CVE-2018-19516.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 34765909cdf8e55402a8567b48fb288839c61612 Mon Sep 17 00:00:00 2001
-From: Laurent Montel <montel@kde.org>
-Date: Fri, 23 Nov 2018 07:37:02 +0100
-Subject: Exclude Refresh from MetaData (Not necessary)
-
-diff -uar messagelib-18.08.3.orig/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp messagelib-18.08.3/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp
---- messagelib-18.08.3.orig/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp 2018-10-31 07:56:07.000000000 +0100
-+++ messagelib-18.08.3/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp 2018-12-09 23:38:11.009130622 +0100
-@@ -308,6 +308,11 @@
- return htmlSource;
- }
- extraHead = s.mid(startIndex + 6 , endIndex - startIndex - 6);
-+ //Don't authorize to refresh content.
-+ if (s.contains(QStringLiteral("http-equiv=\"REFRESH\""), Qt::CaseInsensitive)) {
-+ extraHead.clear();
-+ }
-+
- s = s.mid(endIndex + 7).trimmed();
- }
-
diff --git a/kde/patch/okular.patch b/kde/patch/okular.patch
deleted file mode 100644
index 0875170..0000000
--- a/kde/patch/okular.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Address CVE-2020-9359 (repaired in 20.04.0):
-#cat $CWD/patch/okular/cve-2020-9359.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/okular/cve-2020-9359.patch b/kde/patch/okular/cve-2020-9359.patch
deleted file mode 100644
index d82c91c..0000000
--- a/kde/patch/okular/cve-2020-9359.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-Okular: Local binary execution via action links
-CVE: CVE-2020-9359
-
-Okular can be tricked into executing local binaries via specially crafted
-PDF files.
-This binary execution can require almost no user interaction.
-No parameters can be passed to those local binaries.
-We have not been able to identify any binary that will cause actual damage,
-be it in the hardware or software level, when run without parameters.
-
-We remain relatively confident that for this issue to do any actual damage,
-it has to run a binary specially crafted. That binary must have been deployed
-to the user system via another method, be it the user downloading it directly
-as an email attachment, webpage download, etc. or by the system being
-already compromised.
-
-
-diff --git a/core/document.cpp b/core/document.cpp
-index 3215a1abce6292a6cc25c5f8b645232c92d75ec5..0aa5b698019a2660f2d6baabd54cef1e82002b0e 100644
---- a/core/document.cpp
-+++ b/core/document.cpp
-@@ -4388,7 +4388,8 @@ void Document::processAction( const Action * action )
- {
- const QUrl realUrl = KIO::upUrl(d->m_url).resolved(url);
- // KRun autodeletes
-- new KRun( realUrl, d->m_widget );
-+ KRun *r = new KRun( realUrl, d->m_widget );
-+ r->setRunExecutables(false);
- }
- }
- } break;
-
diff --git a/kde/patch/oxygen-gtk2.patch b/kde/patch/oxygen-gtk2.patch
index 4ca11e9..a2dd03e 100644
--- a/kde/patch/oxygen-gtk2.patch
+++ b/kde/patch/oxygen-gtk2.patch
@@ -1,3 +1,2 @@
# Add more firefox-derived browsers as supported by the theme:
cat $CWD/patch/oxygen-gtk2/oxygen-gtk2_KDEBUG_341181.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/oxygen-gtk3.patch b/kde/patch/oxygen-gtk3.patch
deleted file mode 100644
index 1f0f0aa..0000000
--- a/kde/patch/oxygen-gtk3.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Compile against Slackware's older version of gtk+3:
-cat $CWD/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch b/kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch
deleted file mode 100644
index 075cd08..0000000
--- a/kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-diff -urN oxygen-gtk3-1.3.1/src/oxygenthemingengine.cpp oxygen-gtk3-1.3.1-patched/src/oxygenthemingengine.cpp
---- oxygen-gtk3-1.3.1/src/oxygenthemingengine.cpp 2013-12-11 23:38:20.000000000 +1100
-+++ oxygen-gtk3-1.3.1-patched/src/oxygenthemingengine.cpp 2013-12-17 23:11:11.684864006 +1100
-@@ -493,13 +493,6 @@
-
- }
-
-- } else if( gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_LIST_ROW ) ) {
--
-- GtkStateFlags state( gtk_theming_engine_get_state( engine ) );
-- StyleOptions options( widget, state );
-- if( options & (Selected|Hover) )
-- { Style::instance().renderSelection( context, x, y, w, h, TileSet::Horizontal, options ); }
--
- } else if(
- gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_SPINBUTTON ) &&
- !gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_ENTRY ) )
-@@ -507,10 +500,7 @@
-
- return;
-
-- } else if(
-- gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_TOOLBAR ) ||
-- gtk_widget_path_is_type( path, GTK_TYPE_HEADER_BAR ) )
-- {
-+ } else if( gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_TOOLBAR ) ) {
-
- // render background
- if( !Gtk::gtk_widget_is_applet( widget ) )
diff --git a/kde/patch/perlqt.patch b/kde/patch/perlqt.patch
index 1cdd7db..669a723 100644
--- a/kde/patch/perlqt.patch
+++ b/kde/patch/perlqt.patch
@@ -1,3 +1,2 @@
# Fix build:
cat $CWD/patch/perlqt/perlqt.gcc6.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-browser-integration.patch b/kde/patch/plasma-browser-integration.patch
index c82fee9..38642df 100644
--- a/kde/patch/plasma-browser-integration.patch
+++ b/kde/patch/plasma-browser-integration.patch
@@ -1,3 +1,2 @@
# Fix hardcoded mozilla 'lib' libdir:
cat $CWD/patch/plasma-browser-integration/plasma-browser-integration_KDEBUG-113461.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-desktop.patch b/kde/patch/plasma-desktop.patch
deleted file mode 100644
index 8a69d4c..0000000
--- a/kde/patch/plasma-desktop.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-# Fix errors in translation strings for bs and sr:
-#cat $CWD/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Forgotten includes:
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix for Plasma 5.5.0 (KDEBUG #356398):
-#cat $CWD/patch/plasma-desktop//plasma-desktop_kickoff_kdebug_356398.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix for Plasma 5.14.4 (KDEBUG #401508):
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# KDEBUG #401508): unlock widgets.
-# Fixed in Plasma 5.18.1:
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# KDEBUG #416358): Cannot apply font changes (button remains inactive).
-# Fixed in Plasma 5.18.1:
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff b/kde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff
deleted file mode 100755
index 3b96d54..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff
+++ /dev/null
@@ -1,60 +0,0 @@
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/bs/kfontinst.po b/po/bs/kfontinst.po
---- a/po/bs/kfontinst.po 2014-05-09 17:23:01.000000000 +0200
-+++ b/po/bs/kfontinst.po 2014-05-18 18:38:26.513853094 +0200
-@@ -1169,7 +1169,7 @@ msgstr "abcčćdđefghijklmnoprsštuvzž
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr/kfontinst.po b/po/sr/kfontinst.po
---- a/po/sr/kfontinst.po 2014-05-09 17:27:16.000000000 +0200
-+++ b/po/sr/kfontinst.po 2014-05-18 18:38:40.837414520 +0200
-@@ -1221,7 +1221,7 @@ msgstr "абвгдђежзијклљмн
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr@ijekavian/kfontinst.po b/po/sr@ijekavian/kfontinst.po
---- a/po/sr@ijekavian/kfontinst.po 2014-05-09 17:27:20.000000000 +0200
-+++ b/po/sr@ijekavian/kfontinst.po 2014-05-18 18:38:54.049932456 +0200
-@@ -1221,7 +1221,7 @@ msgstr "абвгдђежзијклљмн
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr@ijekavianlatin/kfontinst.po b/po/sr@ijekavianlatin/kfontinst.po
---- a/po/sr@ijekavianlatin/kfontinst.po 2014-05-09 17:27:24.000000000 +0200
-+++ b/po/sr@ijekavianlatin/kfontinst.po 2014-05-18 18:39:09.884553255 +0200
-@@ -1224,7 +1224,7 @@ msgstr "abcčćdđefghijklmnoprsštuvzž
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr@latin/kfontinst.po b/po/sr@latin/kfontinst.po
---- a/po/sr@latin/kfontinst.po 2014-05-09 17:27:27.000000000 +0200
-+++ b/po/sr@latin/kfontinst.po 2014-05-18 18:39:21.351002849 +0200
-@@ -1223,7 +1223,7 @@ msgstr "abcčćdđefghijklmnoprsštuvzž
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name." \ No newline at end of file
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch b/kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch
deleted file mode 100644
index 2e4a099..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From ed34cc5f181e61d1fc98872866c5d7300a90af86 Mon Sep 17 00:00:00 2001
-From: Eike Hein <hein@kde.org>
-Date: Thu, 29 Nov 2018 00:22:17 +0900
-Subject: Fix group popup dialog
-
-Summary:
-Fixes regression introduced with ab26ebb18b74: That diff contained
-a change unrelated to the original submission, swapping a || out for
-&& in response to a review note. This turns out to have broken things.
-
-BUG:401508
-
-Reviewers: davidedmundson
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D17219
----
- applets/taskmanager/package/contents/ui/GroupDialog.qml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/applets/taskmanager/package/contents/ui/GroupDialog.qml b/applets/taskmanager/package/contents/ui/GroupDialog.qml
-index 6f59275..28238dc 100644
---- a/applets/taskmanager/package/contents/ui/GroupDialog.qml
-+++ b/applets/taskmanager/package/contents/ui/GroupDialog.qml
-@@ -262,7 +262,7 @@ PlasmaCore.Dialog {
- // Setting VisualDataModel.rootIndex drops groupRepeater.count to 0
- // before the actual row count. updateSize is therefore invoked twice;
- // only update size once the repeater count matches the model role.
-- } else if (!groupRepeater.aboutToPopulate && visualParent.childCount == groupRepeater.count) {
-+ } else if (!groupRepeater.aboutToPopulate || visualParent.childCount == groupRepeater.count) {
- var task;
- var maxWidth = 0;
- var maxHeight = 0;
---
-cgit v1.1
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch b/kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch
deleted file mode 100644
index 34ca670..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/kcms/fonts/fonts.cpp b/kcms/fonts/fonts.cpp
---- a/kcms/fonts/fonts.cpp
-+++ b/kcms/fonts/fonts.cpp
-@@ -572,8 +572,8 @@
- // previews
- engine()->addImageProvider("preview", new PreviewImageProvider(m_settings->font()));
-
-- // reload state after loading by emiting a settings signal
-- emit m_settings->activeFontChanged();
-+ // KCM expect save state to be false at this point (can be true because of setNearestExistingFonts
-+ setNeedsSave(false);
- }
-
- void KFonts::save()
-
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch b/kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch
deleted file mode 100644
index a840d6e..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 2bc3c5e92d4789146548e8de4d520cd191994e1c Mon Sep 17 00:00:00 2001
-From: Marco Martin <notmart@gmail.com>
-Date: Tue, 11 Feb 2020 16:41:26 +0100
-Subject: unlock widgets
-
-5.18 doesn't offer a way anymore from the gui
-so unlock them if they're locked
-BUG:417424
----
- desktoppackage/contents/updates/unlock_widgets.js | 2 ++
- 1 file changed, 2 insertions(+)
- create mode 100644 desktoppackage/contents/updates/unlock_widgets.js
-
-diff --git a/desktoppackage/contents/updates/unlock_widgets.js b/desktoppackage/contents/updates/unlock_widgets.js
-new file mode 100644
-index 0000000..c332270
---- /dev/null
-+++ b/desktoppackage/contents/updates/unlock_widgets.js
-@@ -0,0 +1,2 @@
-+
-+__AppInterface.locked = false;
---
-cgit v1.1
-
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff b/kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff
deleted file mode 100644
index 74d541c..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff
+++ /dev/null
@@ -1,88 +0,0 @@
---- plasma-desktop-20140602git/kcms/kfontinst/lib/CMakeLists.txt.orig 2014-06-03 16:08:19.294297273 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/lib/CMakeLists.txt 2014-06-03 16:09:12.420293700 +0200
-@@ -15,6 +15,6 @@
- set_target_properties(kfontinst PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION 5 )
-
- add_library(kfontinstui SHARED ${kfontinstui_LIB_SRCS})
--target_link_libraries(kfontinstui Qt5::X11Extras KF5::KIOCore KF5::KIOWidgets ${FREETYPE_LIBRARIES} ${FONTCONFIG_LIBRARIES} ${X11_X11_LIB} ${X11_Xft_LIB} kfontinst )
-+target_link_libraries(kfontinstui Qt5::X11Extras KF5::KIOCore KF5::KIOWidgets KF5::KDELibs4Support XCB::XCB XCB::IMAGE ${FREETYPE_LIBRARIES} ${FONTCONFIG_LIBRARIES} ${X11_X11_LIB} ${X11_Xft_LIB} kfontinst )
- set_target_properties(kfontinstui PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION 5 )
- install(TARGETS kfontinst kfontinstui ${INSTALL_TARGETS_DEFAULT_ARGS} )
---- plasma-desktop-20140602git/kcms/kfontinst/dbus/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/dbus/CMakeLists.txt 2014-06-03 17:17:01.382378586 +0200
-@@ -14,11 +14,11 @@
-
- set_target_properties(fontinst_bin PROPERTIES OUTPUT_NAME fontinst)
- target_link_libraries(fontinst_bin
-- Qt5::DBus Qt5::Xml ${FONTCONFIG_LIBRARIES} kfontinst)
-+ Qt5::DBus Qt5::Xml Qt5::X11Extras KF5::KDELibs4Support XCB::XCB XCB::IMAGE ${FONTCONFIG_LIBRARIES} kfontinst)
-
- set_target_properties(fontinst_helper PROPERTIES OUTPUT_NAME fontinst_helper)
- target_link_libraries(fontinst_helper
-- Qt5::DBus Qt5::Xml ${FONTCONFIG_LIBRARIES} kfontinst)
-+ Qt5::DBus Qt5::Xml Qt5::X11Extras KF5::KDELibs4Support XCB::XCB XCB::IMAGE ${FONTCONFIG_LIBRARIES} kfontinst)
-
- install(TARGETS fontinst_bin DESTINATION ${LIBEXEC_INSTALL_DIR} )
- install(TARGETS fontinst_helper DESTINATION ${LIBEXEC_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/kcmfontinst/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/kcmfontinst/CMakeLists.txt 2014-06-03 19:19:00.376164975 +0200
-@@ -10,6 +10,7 @@
- add_library(kcm_fontinst MODULE ${kcm_fontinst_PART_SRCS})
-
- target_link_libraries(kcm_fontinst
-+ Qt5::X11Extras
- KF5::Archive
- KF5::KCMUtils
- KF5::Su
---- plasma-desktop-20140602git/kcms/kfontinst/apps/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/apps/CMakeLists.txt 2014-06-03 19:27:47.209175028 +0200
-@@ -31,6 +31,7 @@
- )
- target_link_libraries(kfontprint_bin
- Qt5::PrintSupport
-+ Qt5::X11Extras
- KF5::IconThemes
- KF5::KDELibs4Support
- ${X11_X11_LIB}
-@@ -38,7 +39,7 @@
- kfontinstui
- kfontinst
- )
--target_link_libraries(kfontview_bin KF5::Parts KF5::XmlGui kfontinstui kfontinst )
-+target_link_libraries(kfontview_bin KF5::Parts KF5::XmlGui KF5::KDELibs4Support kfontinstui kfontinst )
-
- install(TARGETS kfontinst_bin ${INSTALL_TARGETS_DEFAULT_ARGS} )
- install(TARGETS kfontprint_bin DESTINATION ${LIBEXEC_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/kio/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/kio/CMakeLists.txt 2014-06-03 19:31:34.379189708 +0200
-@@ -5,7 +5,7 @@
- set(kio_fonts_PART_SRCS FontInstInterface.cpp KioFonts.cpp ${libkfontinstdbusiface_SRCS})
- # qt5_add_dbus_interface(kio_fonts_PART_SRCS ../dbus/org.kde.fontinst.xml FontinstIface)
- add_library(kio_fonts MODULE ${kio_fonts_PART_SRCS} ${KFI_FONTINST_AUTH_SRC} )
--target_link_libraries(kio_fonts Qt5::DBus Qt5::X11Extras Qt5::Xml KF5::Archive KF5::KIOCore KF5::KIOWidgets kfontinst )
-+target_link_libraries(kio_fonts Qt5::DBus Qt5::X11Extras Qt5::Xml KF5::Archive KF5::KIOCore KF5::KIOWidgets KF5::KDELibs4Support kfontinst )
- install(TARGETS kio_fonts DESTINATION ${PLUGIN_INSTALL_DIR} )
- install( FILES fonts.desktop DESTINATION ${DATA_INSTALL_DIR}/konqsidebartng/virtual_folders/services )
- install( FILES fonts.protocol DESTINATION ${SERVICES_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/thumbnail/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/thumbnail/CMakeLists.txt 2014-06-03 19:34:23.357198688 +0200
-@@ -7,7 +7,7 @@
-
- add_library(fontthumbnail MODULE ${fontthumbnail_PART_SRCS})
-
--target_link_libraries(fontthumbnail KF5::Archive KF5::KIOCore KF5::KIOWidgets kfontinstui kfontinst )
-+target_link_libraries(fontthumbnail KF5::Archive KF5::KIOCore KF5::KIOWidgets KF5::KDELibs4Support kfontinstui kfontinst )
-
- install(TARGETS fontthumbnail DESTINATION ${PLUGIN_INSTALL_DIR} )
- install( FILES fontthumbnail.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/viewpart/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/viewpart/CMakeLists.txt 2014-06-03 19:42:35.590219674 +0200
-@@ -8,7 +8,7 @@
-
- add_library(kfontviewpart MODULE ${kfontviewpart_PART_SRCS})
-
--target_link_libraries(kfontviewpart KF5::Archive KF5::Parts KF5::XmlGui ${FONTCONFIG_LIBRARIES} kfontinstui kfontinst )
-+target_link_libraries(kfontviewpart KF5::Archive KF5::Parts KF5::XmlGui KF5::KDELibs4Support ${FONTCONFIG_LIBRARIES} kfontinstui kfontinst )
-
- install(TARGETS kfontviewpart DESTINATION ${PLUGIN_INSTALL_DIR} )
- install( FILES kfontviewpart.rc DESTINATION ${DATA_INSTALL_DIR}/kfontinst )
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch b/kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch
deleted file mode 100644
index a4d8d9f..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Eike Hein <hein@kde.org>
-Date: Tue, 08 Dec 2015 19:26:26 +0000
-Subject: Fix migration of multiple favorites.
-X-Git-Url: http://quickgit.kde.org/?p=plasma-desktop.git&a=commitdiff&h=97ced66da372737ae5d36d86c9bc0c6fe684d842
----
-Fix migration of multiple favorites.
-
-BUG:356398
----
-
-
---- a/desktoppackage/contents/updates/obsolete_kickoffrc.js
-+++ b/desktoppackage/contents/updates/obsolete_kickoffrc.js
-@@ -1,7 +1,7 @@
- var kickoffConfig = ConfigFile("kickoffrc");
-
- kickoffConfig.group = "Favorites";
--var favorites = kickoffConfig.readEntry("FavoriteURLs");
-+var favorites = kickoffConfig.readEntry("FavoriteURLs").split(',');
-
- kickoffConfig.group = "SystemApplications";
- var systemApplications = kickoffConfig.readEntry("DesktopFiles").split(',');
-
-
diff --git a/kde/patch/plasma-framework.patch b/kde/patch/plasma-framework.patch
index 601f16c..cca9a13 100644
--- a/kde/patch/plasma-framework.patch
+++ b/kde/patch/plasma-framework.patch
@@ -1,12 +1,3 @@
-# KDE Plasma with KF 5.18 crash, if mouse repeatedly hovers over TaskManager
-# KDEBUG 357895; fixed in Frameworks 5.20.
-#cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Icons for SNI Qt apps not appearing
-# KDEBUG 359388; fixed in Frameworks 5.20.
-#cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Password is asked twice when connecting to a new WiFi network,
# KDEBUG 423093; fixed in Frameworks 5.72 and Plasma 5.20.
-cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_423093.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
+#cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_423093.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch b/kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch
deleted file mode 100644
index 9480314..0000000
--- a/kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: David Rosca <nowrep@gmail.com>
-Date: Mon, 15 Feb 2016 18:05:26 +0000
-Subject: WindowThumbnail: Discard glx pixmap in stopRedirecting()
-X-Git-Url: http://quickgit.kde.org/?p=plasma-framework.git&a=commitdiff&h=1e196fdfb2a6eaf1664e1155c086616d55c6712b
----
-WindowThumbnail: Discard glx pixmap in stopRedirecting()
-
-BUG: 357895
-FIXED-IN: 5.20
-REVIEW: 127072
----
-
-
---- a/src/declarativeimports/core/windowthumbnail.cpp
-+++ b/src/declarativeimports/core/windowthumbnail.cpp
-@@ -584,6 +584,7 @@
- return;
- }
- xcb_composite_unredirect_window(c, m_winId, XCB_COMPOSITE_REDIRECT_AUTOMATIC);
-+ discardPixmap();
- if (m_damage == XCB_NONE) {
- return;
- }
-
diff --git a/kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch b/kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch
deleted file mode 100644
index 078dbfd..0000000
--- a/kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Dan Vrátil <dvratil@kde.org>
-Date: Tue, 16 Feb 2016 16:59:32 +0000
-Subject: Fix IconItem not loading non-theme icons with name
-X-Git-Url: http://quickgit.kde.org/?p=plasma-framework.git&a=commitdiff&h=525bf2d377c21b41971a72d694a507bf2af0ada6
----
-Fix IconItem not loading non-theme icons with name
-
-Commit 5184ac introduced a small regression that caused IconItem
-to no longer load non-theme icons with name set, for instance icons
-coming from sni-qt, causing sni-qt apps to not show in systray.
-
-BUG: 359388
-FIXED-IN: 5.20
-REVIEW: 127091
----
-
-
---- a/src/declarativeimports/core/iconitem.cpp
-+++ b/src/declarativeimports/core/iconitem.cpp
-@@ -148,6 +148,10 @@
- //fail, use QIcon
- } else {
- m_icon = QIcon::fromTheme(sourceString);
-+ if (m_icon.isNull()) {
-+ // fallback for non-theme icons
-+ m_icon = source.value<QIcon>();
-+ }
- delete m_svgIcon;
- m_svgIcon = 0;
- m_imageIcon = QImage();
-
diff --git a/kde/patch/plasma-pa.patch b/kde/patch/plasma-pa.patch
deleted file mode 100644
index 2349f09..0000000
--- a/kde/patch/plasma-pa.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Port from gconf to gsettings (wait until post 5.13.4)
-# because PA 12 dropped support for gconf and this broke the advanced settings
-# in the PA audio configuration:
-#cat $CWD/patch/plasma-pa/plasma-pa_enable_gsettings.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch b/kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch
deleted file mode 100644
index ef212d5..0000000
--- a/kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch
+++ /dev/null
@@ -1,583 +0,0 @@
-# https://phabricator.kde.org/D14147
-# Port from gconf to gsettings
-# Step 1 was to make gconf optional in 5.13.4
-# ----------------------------------
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -22,9 +22,6 @@
- include(FindPkgConfig)
- pkg_check_modules(GCONF gconf-2.0)
- pkg_check_modules(GOBJECT gobject-2.0)
--if (GCONF_FOUND AND GOBJECT_FOUND)
-- set(HAVE_GCONF TRUE)
--endif()
-
- find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS
- Core
-@@ -44,6 +41,21 @@
- find_package(PulseAudio 5.0.0 REQUIRED)
- find_package(Canberra REQUIRED)
- find_package(GLIB2 REQUIRED)
-+find_package(GIO)
-+
-+if(USE_GCONF AND USE_GSETTINGS)
-+ message(FATAL_ERROR "USE_GCONF and USE_GSETTINGS cannot be used at the same time")
-+endif()
-+
-+# if GSetting is available and user does not force GConf build use GSettings
-+if(GIO_FOUND AND GLIB2_FOUND AND NOT USE_GCONF)
-+ set(USE_GSETTINGS TRUE)
-+endif()
-+
-+# don't use GConf if not availabe
-+if (NOT GCONF_FOUND OR NOT GOBJECT_FOUND)
-+ set(USE_GCONF FALSE)
-+endif()
-
- configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
-
-diff --git a/cmake/FindGIO.cmake b/cmake/FindGIO.cmake
-new file mode 100644
---- /dev/null
-+++ b/cmake/FindGIO.cmake
-@@ -0,0 +1,72 @@
-+# - Try to find the GIO libraries
-+# Once done this will define
-+#
-+# GIO_FOUND - system has GIO
-+# GIO_INCLUDE_DIR - the GIO include directory
-+# GIO_LIBRARIES - GIO library
-+#
-+# Copyright (c) 2010 Dario Freddi <drf@kde.org>
-+#
-+# Redistribution and use is allowed according to the terms of the BSD license.
-+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-+
-+if(GIO_INCLUDE_DIR AND GIO_LIBRARIES)
-+ # Already in cache, be silent
-+ set(GIO_FIND_QUIETLY TRUE)
-+endif(GIO_INCLUDE_DIR AND GIO_LIBRARIES)
-+
-+if (NOT WIN32)
-+ include(UsePkgConfig)
-+ pkgconfig(gio-2.0 _LibGIOIncDir _LibGIOLinkDir _LibGIOLinkFlags _LibGIOCflags)
-+endif(NOT WIN32)
-+
-+MESSAGE(STATUS "gio include dir: ${_LibGIOIncDir}")
-+
-+# first try without default paths to respect PKG_CONFIG_PATH
-+
-+find_path(GIO_MAIN_INCLUDE_DIR glib.h
-+ PATH_SUFFIXES glib-2.0
-+ PATHS ${_LibGIOIncDir}
-+ NO_DEFAULT_PATH)
-+
-+find_path(GIO_MAIN_INCLUDE_DIR glib.h
-+ PATH_SUFFIXES glib-2.0
-+ PATHS ${_LibGIOIncDir} )
-+
-+MESSAGE(STATUS "found gio main include dir: ${GIO_MAIN_INCLUDE_DIR}")
-+
-+# search the glibconfig.h include dir under the same root where the library is found
-+find_library(GIO_LIBRARIES
-+ NAMES gio-2.0
-+ PATHS ${_LibGIOLinkDir}
-+ NO_DEFAULT_PATH)
-+
-+find_library(GIO_LIBRARIES
-+ NAMES gio-2.0
-+ PATHS ${_LibGIOLinkDir})
-+
-+
-+get_filename_component(GIOLibDir "${GIO_LIBRARIES}" PATH)
-+
-+find_path(GIO_INTERNAL_INCLUDE_DIR glibconfig.h
-+ PATH_SUFFIXES glib-2.0/include
-+ PATHS ${_LibGIOIncDir} "${GIOLibDir}" ${CMAKE_SYSTEM_LIBRARY_PATH}
-+ NO_DEFAULT_PATH)
-+
-+find_path(GIO_INTERNAL_INCLUDE_DIR glibconfig.h
-+ PATH_SUFFIXES glib-2.0/include
-+ PATHS ${_LibGIOIncDir} "${GIOLibDir}" ${CMAKE_SYSTEM_LIBRARY_PATH})
-+
-+set(GIO_INCLUDE_DIR "${GIO_MAIN_INCLUDE_DIR}")
-+
-+# not sure if this include dir is optional or required
-+# for now it is optional
-+if(GIO_INTERNAL_INCLUDE_DIR)
-+ set(GIO_INCLUDE_DIR ${GIO_INCLUDE_DIR} "${GIO_INTERNAL_INCLUDE_DIR}")
-+endif(GIO_INTERNAL_INCLUDE_DIR)
-+
-+include(FindPackageHandleStandardArgs)
-+find_package_handle_standard_args(GIO DEFAULT_MSG GIO_LIBRARIES GIO_MAIN_INCLUDE_DIR)
-+
-+mark_as_advanced(GIO_INCLUDE_DIR GIO_LIBRARIES)
-+
-diff --git a/config.h.cmake b/config.h.cmake
---- a/config.h.cmake
-+++ b/config.h.cmake
-@@ -1,3 +1,4 @@
- /* config.h. Generated by cmake from config.h.cmake */
-
--#cmakedefine01 HAVE_GCONF
-+#cmakedefine01 USE_GSETTINGS
-+#cmakedefine01 USE_GCONF
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -37,11 +37,16 @@
- set_property(SOURCE qml/dbus/osdService.xml APPEND PROPERTY CLASSNAME OsdServiceInterface)
- qt5_add_dbus_interface(dbus_SRCS qml/dbus/osdService.xml osdservice)
-
--if (HAVE_GCONF)
-+if (USE_GCONF)
- include_directories(${GCONF_INCLUDE_DIRS} ${GOBJECT_INCLUDE_DIRS})
- set(cpp_SRCS ${cpp_SRCS} gconfitem.cpp)
- endif()
-
-+if (USE_GSETTINGS)
-+ include_directories(${GIO_INCLUDE_DIRS} ${GOBJECT_INCLUDE_DIRS})
-+ set(cpp_SRCS ${cpp_SRCS} gsettingsitem.cpp)
-+endif()
-+
- add_library(plasma-volume-declarative SHARED ${dbus_SRCS} ${cpp_SRCS} ${qml_SRCS})
- target_link_libraries(plasma-volume-declarative
- Qt5::Core
-@@ -52,12 +57,18 @@
- ${PULSEAUDIO_LIBRARY}
- ${PULSEAUDIO_MAINLOOP_LIBRARY}
- ${CANBERRA_LIBRARIES}
-+ ${GOBJECT_LIBRARIES}
- )
-
--if (HAVE_GCONF)
-+if (USE_GCONF)
- target_link_libraries(plasma-volume-declarative
- ${GCONF_LDFLAGS}
-- ${GOBJECT_LDFLAGS}
-+ )
-+endif()
-+
-+if (USE_GSETTINGS)
-+ target_link_libraries(plasma-volume-declarative
-+ ${GIO_LIBRARIES}
- )
- endif()
-
-diff --git a/src/gsettingsitem.h b/src/gsettingsitem.h
-new file mode 100644
---- /dev/null
-+++ b/src/gsettingsitem.h
-@@ -0,0 +1,59 @@
-+/*
-+ * Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public License
-+ * version 2.1 as published by the Free Software Foundation.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-+ * 02110-1301 USA
-+ *
-+ */
-+
-+#ifndef GSETTINGSITEM_H
-+#define GSETTINGSITEM_H
-+
-+#include <QVariant>
-+#include <QStringList>
-+#include <QObject>
-+
-+#include <gio/gio.h>
-+
-+class GSettingsItem : public QObject
-+{
-+ Q_OBJECT
-+
-+ public:
-+
-+ explicit GSettingsItem(const QString &key, QObject *parent = nullptr);
-+ virtual ~GSettingsItem() override;
-+
-+ QVariant value(const QString &key) const;
-+ void set(const QString &key, const QVariant &val);
-+
-+
-+Q_SIGNALS:
-+ void subtreeChanged();
-+
-+private:
-+ GSettings *m_settings;
-+
-+static void settingChanged(GSettings *settings, const gchar *key, gpointer data)
-+{
-+ Q_UNUSED(settings)
-+ Q_UNUSED(key)
-+
-+ GSettingsItem *self = static_cast<GSettingsItem *>(data);
-+ Q_EMIT self->subtreeChanged();
-+}
-+
-+};
-+
-+#endif // GCONFITEM_H
-diff --git a/src/gsettingsitem.cpp b/src/gsettingsitem.cpp
-new file mode 100644
---- /dev/null
-+++ b/src/gsettingsitem.cpp
-@@ -0,0 +1,93 @@
-+/*
-+ * Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public License
-+ * version 2.1 as published by the Free Software Foundation.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-+ * 02110-1301 USA
-+ *
-+ */
-+
-+#include <QString>
-+#include <QVariant>
-+#include <QDebug>
-+
-+#include <gio/gio.h>
-+
-+#include "gsettingsitem.h"
-+#include "debug.h"
-+
-+QVariant GSettingsItem::value(const QString &key) const
-+{
-+ GVariant *gvalue = g_settings_get_value(m_settings, key.toLatin1().data());
-+
-+ QVariant toReturn;
-+
-+ switch (g_variant_classify(gvalue)) {
-+ case G_VARIANT_CLASS_BOOLEAN:
-+ toReturn = QVariant((bool)g_variant_get_boolean(gvalue));
-+ break;
-+ case G_VARIANT_CLASS_STRING:
-+ toReturn = QVariant(QString::fromUtf8(g_variant_get_string(gvalue, NULL)));
-+ break;
-+ default:
-+ qCDebug(PLASMAPA()) << "Unhandled variant type in value()";
-+ }
-+
-+ g_variant_unref(gvalue);
-+
-+ return toReturn;
-+}
-+
-+void GSettingsItem::set(const QString &key, const QVariant &val)
-+{
-+
-+ // It might be hard to detect the right GVariant type from
-+ // complext QVariant types such as string lists or more detailed
-+ // types such as integers (GVariant has different sizes),
-+ // therefore we get the current value for the key and convert
-+ // to QVariant using the GVariant type
-+ GVariant *oldValue = g_settings_get_value(m_settings, key.toLatin1().data());
-+ GVariant *newValue;
-+
-+ switch (g_variant_type_peek_string(g_variant_get_type(oldValue))[0]) {
-+ case G_VARIANT_CLASS_BOOLEAN:
-+ newValue = g_variant_new_boolean(val.toBool());
-+ break;
-+ case G_VARIANT_CLASS_STRING:
-+ newValue = g_variant_new_string(val.toString().toUtf8().constData());
-+ break;
-+ default:
-+ qCDebug(PLASMAPA()) << "Unhandled variant type in set()";
-+ }
-+
-+ if (newValue)
-+ g_settings_set_value(m_settings, key.toLatin1().data(), newValue);
-+
-+ g_variant_unref(oldValue);
-+}
-+
-+GSettingsItem::GSettingsItem(const QString &key, QObject *parent)
-+ : QObject (parent)
-+{
-+
-+ m_settings = g_settings_new_with_path("org.freedesktop.pulseaudio.module-group", key.toLatin1().data());
-+
-+ g_signal_connect(m_settings, "changed", G_CALLBACK(GSettingsItem::settingChanged), this);
-+}
-+
-+GSettingsItem::~GSettingsItem()
-+{
-+ g_settings_sync();
-+ if (m_settings)
-+ g_object_unref(m_settings);
-+}
-diff --git a/src/kcm/package/contents/ui/Advanced.qml b/src/kcm/package/contents/ui/Advanced.qml
---- a/src/kcm/package/contents/ui/Advanced.qml
-+++ b/src/kcm/package/contents/ui/Advanced.qml
-@@ -73,7 +73,7 @@
- text: i18n("Add virtual output device for simultaneous output on all local sound cards")
- checked: moduleManager.combineSinks
- onCheckedChanged: moduleManager.combineSinks = checked;
-- enabled: moduleManager.loadedModules.indexOf("module-gconf") != -1
-+ enabled: moduleManager.configModuleLoaded
- visible: moduleManager.settingsSupported
- }
-
-@@ -84,16 +84,16 @@
- text: i18n("Automatically switch all running streams when a new output becomes available")
- checked: moduleManager.switchOnConnect
- onCheckedChanged: moduleManager.switchOnConnect = checked;
-- enabled: moduleManager.loadedModules.indexOf("module-gconf") != -1
-+ enabled: moduleManager.configModuleLoaded
- visible: moduleManager.settingsSupported
- }
-
- Label {
- Layout.alignment: Qt.AlignHCenter
- enabled: false
- font.italic: true
-- text: i18n("Requires 'module-gconf' PulseAudio module")
-- visible: moduleManager.settingsSupported && moduleManager.loadedModules.indexOf("module-gconf") == -1
-+ text: i18n("Requires %1 PulseAudio module", moduleManager.configModuleName)
-+ visible: moduleManager.settingsSupported && !moduleManager.configModuleLoaded
- }
-
- Header {
-diff --git a/src/modulemanager.h b/src/modulemanager.h
---- a/src/modulemanager.h
-+++ b/src/modulemanager.h
-@@ -29,18 +29,18 @@
- // Properties need fully qualified classes even with pointers.
- #include "client.h"
-
--class GConfItem;
--
- namespace QPulseAudio
- {
--class GConfModule;
-+class ConfigModule;
-
- class ModuleManager : public QObject
- {
- Q_OBJECT
- Q_PROPERTY(bool settingsSupported READ settingsSupported CONSTANT)
- Q_PROPERTY(bool combineSinks READ combineSinks WRITE setCombineSinks NOTIFY combineSinksChanged)
- Q_PROPERTY(bool switchOnConnect READ switchOnConnect WRITE setSwitchOnConnect NOTIFY switchOnConnectChanged)
-+ Q_PROPERTY(bool configModuleLoaded READ configModuleLoaded NOTIFY loadedModulesChanged)
-+ Q_PROPERTY(QString configModuleName READ configModuleName CONSTANT)
- Q_PROPERTY(QStringList loadedModules READ loadedModules NOTIFY loadedModulesChanged)
- public:
- explicit ModuleManager(QObject *parent = nullptr);
-@@ -52,6 +52,8 @@
- bool switchOnConnect() const;
- void setSwitchOnConnect(bool switchOnConnect);
- QStringList loadedModules() const;
-+ bool configModuleLoaded() const;
-+ QString configModuleName() const;
-
- Q_SIGNALS:
- void combineSinksChanged();
-@@ -61,9 +63,9 @@
- private:
- void updateLoadedModules();
-
-- GConfModule *m_combineSinks;
-- GConfModule *m_switchOnConnect;
-- GConfModule *m_deviceManager;
-+ ConfigModule *m_combineSinks;
-+ ConfigModule *m_switchOnConnect;
-+ ConfigModule *m_deviceManager;
- QStringList m_loadedModules;
- };
-
-diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp
---- a/src/modulemanager.cpp
-+++ b/src/modulemanager.cpp
-@@ -23,40 +23,54 @@
- #include "module.h"
- #include "../config.h"
-
--#if HAVE_GCONF
-+#if USE_GSETTINGS
-+#include "gsettingsitem.h"
-+
-+#define PA_SETTINGS_PATH_MODULES "/org/freedesktop/pulseaudio/module-groups"
-+#endif
-+
-+#if USE_GCONF
- #include "gconfitem.h"
--#define PA_GCONF_ROOT "/system/pulseaudio"
--#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules"
-+#define PA_SETTINGS_PATH_MODULES "/system/pulseaudio/modules"
- #endif
-
- #include <QTimer>
-
- namespace QPulseAudio
- {
-
--#if HAVE_GCONF
--class GConfModule : public GConfItem
-+#if USE_GCONF || USE_GSETTINGS
-+
-+#if USE_GSETTINGS
-+class ConfigModule : public GSettingsItem
-+#elif USE_GCONF
-+class ConfigModule : public GConfItem
-+#endif
- {
- public:
-- GConfModule(const QString &configName, const QString &moduleName, QObject *parent);
-+ ConfigModule(const QString &configName, const QString &moduleName, QObject *parent);
- bool isEnabled() const;
- void setEnabled(bool enabled, const QVariant &args=QVariant());
- private:
- QString m_moduleName;
- };
-
--GConfModule::GConfModule(const QString &configName, const QString &moduleName, QObject *parent) :
-- GConfItem(QStringLiteral(PA_GCONF_PATH_MODULES"/") + configName, parent),
-+ConfigModule::ConfigModule(const QString &configName, const QString &moduleName, QObject *parent) :
-+#if USE_GSETTINGS
-+ GSettingsItem(QStringLiteral(PA_SETTINGS_PATH_MODULES"/") + configName + QStringLiteral("/"), parent),
-+#elif USE_GCONF
-+ GConfItem(QStringLiteral(PA_SETTINGS_PATH_MODULES"/") + configName, parent),
-+#endif
- m_moduleName(moduleName)
- {
- }
-
--bool GConfModule::isEnabled() const
-+bool ConfigModule::isEnabled() const
- {
- return value(QStringLiteral("enabled")).toBool();
- }
-
--void GConfModule::setEnabled(bool enabled, const QVariant &args)
-+void ConfigModule::setEnabled(bool enabled, const QVariant &args)
- {
- set(QStringLiteral("locked"), true);
-
-@@ -69,20 +83,21 @@
- }
- set(QStringLiteral("locked"), false);
- }
--#endif
-
-+#endif
-
- ModuleManager::ModuleManager(QObject *parent) :
- QObject(parent)
- {
--#if HAVE_GCONF
-- m_combineSinks = new GConfModule(QStringLiteral("combine"), QStringLiteral("module-combine"), this);
-- m_switchOnConnect = new GConfModule(QStringLiteral("switch-on-connect"), QStringLiteral("module-switch-on-connect"), this);
-- m_deviceManager = new GConfModule(QStringLiteral("device-manager"), QStringLiteral("module-device-manager"), this);
-+#if USE_GCONF || USE_GSETTINGS
-
-- connect(m_combineSinks, &GConfItem::subtreeChanged, this, &ModuleManager::combineSinksChanged);
-- connect(m_switchOnConnect, &GConfItem::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
-- connect(m_deviceManager, &GConfItem::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
-+ m_combineSinks = new ConfigModule(QStringLiteral("combine"), QStringLiteral("module-combine"), this);
-+ m_switchOnConnect = new ConfigModule(QStringLiteral("switch-on-connect"), QStringLiteral("module-switch-on-connect"), this);
-+ m_deviceManager = new ConfigModule(QStringLiteral("device-manager"), QStringLiteral("module-device-manager"), this);
-+
-+ connect(m_combineSinks, &ConfigModule::subtreeChanged, this, &ModuleManager::combineSinksChanged);
-+ connect(m_switchOnConnect, &ConfigModule::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
-+ connect(m_deviceManager, &ConfigModule::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
- #endif
-
- QTimer *updateModulesTimer = new QTimer(this);
-@@ -100,48 +115,48 @@
-
- bool ModuleManager::settingsSupported() const
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- return true;
- #else
- return false;
- #endif
- }
-
- bool ModuleManager::combineSinks() const
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- return m_combineSinks->isEnabled();
- #else
- return false;
- #endif
- }
-
- void ModuleManager::setCombineSinks(bool combineSinks)
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- m_combineSinks->setEnabled(combineSinks);
- #else
-- Q_UNUSED(combineSinks)
-+ Q_UNUSED(combineSinks()
- #endif
- }
-
- bool ModuleManager::switchOnConnect() const
- {
-+#if USE_GCONF || USE_GSETTINGS
- //switch on connect and device-manager do the same task. Only one should be enabled
-
- //Note on the first run m_deviceManager will appear to be disabled even though it's actually running
- //because there is no gconf entry, however m_switchOnConnect will only exist if set by Plasma PA
- //hence only check this entry
--#if HAVE_GCONF
- return m_switchOnConnect->isEnabled() ;
- #else
- return false;
- #endif
- }
-
- void ModuleManager::setSwitchOnConnect(bool switchOnConnect)
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- m_deviceManager->setEnabled(!switchOnConnect);
- m_switchOnConnect->setEnabled(switchOnConnect);
- #else
-@@ -164,4 +179,19 @@
- Q_EMIT loadedModulesChanged();
- }
-
-+bool ModuleManager::configModuleLoaded() const
-+{
-+ return m_loadedModules.contains(configModuleName());
-+}
-+
-+QString ModuleManager::configModuleName() const
-+{
-+#if USE_GCONF
-+ return QStringLiteral("module-gconf");
-+#elif USE_GSETTINGS
-+ return QStringLiteral("module-gsettings");
-+#else
-+ return QString();
-+#endif
-+}
- }
-
diff --git a/kde/patch/plasma-wayland-protocols.patch b/kde/patch/plasma-wayland-protocols.patch
new file mode 100644
index 0000000..77ba5d6
--- /dev/null
+++ b/kde/patch/plasma-wayland-protocols.patch
@@ -0,0 +1,2 @@
+# Add the missing 'since="13"' to event name "window_with_uuid":
+cat $CWD/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch b/kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch
new file mode 100644
index 0000000..2450b1c
--- /dev/null
+++ b/kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch
@@ -0,0 +1,60 @@
+From 404ae95bc6c2e0a06f09bdcc81bedabcd5c720de Mon Sep 17 00:00:00 2001
+From: Aleix Pol <aleixpol@kde.org>
+Date: Mon, 27 Jul 2020 15:19:56 +0200
+Subject: [PATCH] plasma-window-management: add missing since
+
+---
+ src/protocols/plasma-window-management.xml | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/src/protocols/plasma-window-management.xml b/src/protocols/plasma-window-management.xml
+index e2fe6303..40e1252f 100644
+--- a/src/protocols/plasma-window-management.xml
++++ b/src/protocols/plasma-window-management.xml
+@@ -6,7 +6,7 @@
+ SPDX-License-Identifier: LGPL-2.1-or-later
+ ]]></copyright>
+
+- <interface name="org_kde_plasma_window_management" version="12">
++ <interface name="org_kde_plasma_window_management" version="13">
+ <description summary="application windows management">
+ This interface manages application windows.
+ It provides requests to show and hide the desktop and emits
+@@ -78,14 +78,6 @@
+ <arg name="id" type="uint" summary="Deprecated: internal window Id"/>
+ </event>
+
+- <event name="window_with_uuid">
+- <description summary="notify the client that a window was mapped">
+- This event will be sent immediately after a window is mapped.
+- </description>
+- <arg name="id" type="uint" summary="Deprecated: internal window Id"/>
+- <arg name="uuid" type="string" summary="internal window uuid"/>
+- </event>
+-
+ <event name="stacking_order_changed" since="11">
+ <description summary="notify the client when stacking order changed">
+ This event will be sent when stacking order changed and on bind
+@@ -99,9 +91,17 @@
+ </description>
+ <arg name="uuids" type="string" summary="internal windows id ;-separated"/>
+ </event>
++
++ <event name="window_with_uuid" since="13">
++ <description summary="notify the client that a window was mapped">
++ This event will be sent immediately after a window is mapped.
++ </description>
++ <arg name="id" type="uint" summary="Deprecated: internal window Id"/>
++ <arg name="uuid" type="string" summary="internal window uuid"/>
++ </event>
+ </interface>
+
+- <interface name="org_kde_plasma_window" version="12">
++ <interface name="org_kde_plasma_window" version="13">
+ <description summary="interface to control application windows">
+ Manages and control an application window.
+
+--
+GitLab
+
+
diff --git a/kde/patch/plasma-workspace.patch b/kde/patch/plasma-workspace.patch
deleted file mode 100644
index 8671c65..0000000
--- a/kde/patch/plasma-workspace.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add ConsoleKit2 support for screenlocker (ConsoleKit2 has implemented the
-# systemd-logind API for Lock, Unlock, PrepareForSleep and Inhibit.
-# This functionality has been incorporated into kscreenlocker-5.5.0.
-#cat $CWD/patch/plasma-workspace/plasma-workspace_consolekit2.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Apply commit that fixes compilation of 5.6.5:
-#cat $CWD/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Systray: Move all icon resolution to dataengine, preventing high CPU usage,
-# see https://phabricator.kde.org/D2986 :
-# Fixed in 5.9.0
-#cat $CWD/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix vulnerability (CVE-2018-6791 - KDEBUG_389815)
-# (already fixed in Plasma 5.12.0):
-#cat $CWD/patch/plasma-workspace/plasma-workspace_kdebug389815.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch b/kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch
deleted file mode 100644
index 4ad3c07..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch
+++ /dev/null
@@ -1,152 +0,0 @@
-https://phabricator.kde.org/D2986
-Systray: Move all icon resolution to dataengine
-
-diff --git a/applets/systemtray/package/contents/ui/ConfigEntries.qml b/applets/systemtray/package/contents/ui/ConfigEntries.qml
---- a/applets/systemtray/package/contents/ui/ConfigEntries.qml
-+++ b/applets/systemtray/package/contents/ui/ConfigEntries.qml
-@@ -75,7 +75,7 @@
- "index": i,
- "taskId": item.Id,
- "name": item.Title,
-- "iconName": plasmoid.nativeInterface.resolveIcon(item.IconName, item.IconThemePath),
-+ "iconName": item.IconName,
- "icon": item.Icon
- });
- }
-diff --git a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml
---- a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml
-+++ b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml
-@@ -28,7 +28,7 @@
- text: Title
- mainText: ToolTipTitle != "" ? ToolTipTitle : Title
- subText: ToolTipSubTitle
-- icon: ToolTipIcon != "" ? ToolTipIcon : plasmoid.nativeInterface.resolveIcon(IconName != "" ? IconName : Icon, IconThemePath)
-+ icon: ToolTipIcon != "" ? ToolTipIcon : Icon ? Icon : IconName
- textFormat: Text.AutoText
- category: Category
-
-@@ -48,7 +48,7 @@
-
- PlasmaCore.IconItem {
- id: iconItem
-- source: plasmoid.nativeInterface.resolveIcon(IconName != "" ? IconName : Icon, IconThemePath)
-+ source: Icon ? Icon : IconName
- width: Math.min(parent.width, parent.height)
- height: width
- active: taskIcon.containsMouse
-diff --git a/applets/systemtray/systemtray.h b/applets/systemtray/systemtray.h
---- a/applets/systemtray/systemtray.h
-+++ b/applets/systemtray/systemtray.h
-@@ -60,12 +60,6 @@
-
- //Invokable utilities
- /**
-- * returns either a simple icon name or a custom path if the app is
-- * using a custom theme
-- */
-- Q_INVOKABLE QVariant resolveIcon(const QVariant &variant, const QString &iconThemePath);
--
-- /**
- * Given an AppletInterface pointer, shows a proper context menu for it
- */
- Q_INVOKABLE void showPlasmoidMenu(QQuickItem *appletInterface, int x, int y);
-diff --git a/applets/systemtray/systemtray.cpp b/applets/systemtray/systemtray.cpp
---- a/applets/systemtray/systemtray.cpp
-+++ b/applets/systemtray/systemtray.cpp
-@@ -37,37 +37,11 @@
- #include <Plasma/PluginLoader>
- #include <Plasma/ServiceJob>
-
--#include <KIconLoader>
--#include <KIconEngine>
- #include <KActionCollection>
- #include <KLocalizedString>
-
- #include <plasma_version.h>
-
--/*
-- * An app may also load icons from their own directories, so we need a new iconloader that takes this into account
-- * This is wrapped into a subclass of iconengine so the iconloader lifespan matches the icon object
-- */
--class AppIconEngine : public KIconEngine
--{
--public:
-- AppIconEngine(const QString &variant, const QString &path, const QString &appName);
-- ~AppIconEngine();
--private:
-- KIconLoader* m_loader;
--};
--
--AppIconEngine::AppIconEngine(const QString &variant, const QString &path, const QString &appName) :
-- KIconEngine(variant, m_loader = new KIconLoader(appName, QStringList()))
--{
-- m_loader->addAppDir(appName, path);
--}
--
--AppIconEngine::~AppIconEngine()
--{
-- delete m_loader;
--}
--
- class PlasmoidModel: public QStandardItemModel
- {
- public:
-@@ -169,32 +143,6 @@
- }
- }
-
--QVariant SystemTray::resolveIcon(const QVariant &variant, const QString &iconThemePath)
--{
-- if (variant.canConvert<QString>()) {
-- if (!iconThemePath.isEmpty()) {
-- const QString path = iconThemePath;
-- if (!path.isEmpty()) {
-- // FIXME: If last part of path is not "icons", this won't work!
-- auto tokens = path.splitRef('/', QString::SkipEmptyParts);
-- if (tokens.length() >= 3 && tokens.takeLast() == QLatin1String("icons")) {
-- const QString appName = tokens.takeLast().toString();
--
-- return QVariant(QIcon(new AppIconEngine(variant.toString(), path, appName)));
-- } else {
-- qCWarning(SYSTEM_TRAY) << "Wrong IconThemePath" << path << ": too short or does not end with 'icons'";
-- }
-- }
--
-- //return just the string hoping that IconItem will know how to interpret it anyways as either a normal icon or a SVG from the theme
-- return variant;
-- }
-- }
--
-- // Most importantly QIcons. Nothing to do for those.
-- return variant;
--}
--
- void SystemTray::showPlasmoidMenu(QQuickItem *appletInterface, int x, int y)
- {
- if (!appletInterface) {
-diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp
---- a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp
-+++ b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp
-@@ -240,14 +240,19 @@
- if (!m_customIconLoader) {
- m_customIconLoader = new KIconLoader(QString(), QStringList(), this);
- }
-+ // FIXME: If last part of path is not "icons", this won't work!
-+ QString appName;
-+ auto tokens = path.splitRef('/', QString::SkipEmptyParts);
-+ if (tokens.length() >= 3 && tokens.takeLast() == QLatin1String("icons"))
-+ appName = tokens.takeLast().toString();
-
- //icons may be either in the root directory of the passed path or in a appdir format
- //i.e hicolor/32x32/iconname.png
-
-- m_customIconLoader->reconfigure(QString(), QStringList(path));
-+ m_customIconLoader->reconfigure(appName, QStringList(path));
-
- //add app dir requires an app name, though this is completely unused in this context
-- m_customIconLoader->addAppDir(QStringLiteral("unused"), path);
-+ m_customIconLoader->addAppDir(appName.size() ? appName : QStringLiteral("unused"), path);
- }
- setData(QStringLiteral("IconThemePath"), path);
-
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch b/kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch
deleted file mode 100644
index 4f22b8e..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Kai Uwe Broulik <kde@privat.broulik.de>
-Date: Mon, 13 Jun 2016 18:36:17 +0000
-Subject: [PanelView] Fix build...
-X-Git-Url: http://quickgit.kde.org/?p=plasma-workspace.git&a=commitdiff&h=767aa574400276b872aa0495f9af096784a8ed66
----
-[PanelView] Fix build...
-
-CCMAIL: notmart@gmail.com
----
-
-
---- a/shell/panelview.cpp
-+++ b/shell/panelview.cpp
-@@ -995,7 +995,7 @@
- {
- if (status == Plasma::Types::NeedsAttentionStatus) {
- showTemporarily();
-- } else if (status == Plasma::AcceptingInputStatus) {
-+ } else if (status == Plasma::Types::AcceptingInputStatus) {
- KWindowSystem::forceActiveWindow(winId());
- } else {
- restoreAutoHide();
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch b/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch
deleted file mode 100644
index 6131c90..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch
+++ /dev/null
@@ -1,189 +0,0 @@
-From: Eric Koegel <eric.koegel@gmail.com>
-Date: Wed, 12 Aug 2015 08:33:39 +0000
-Subject: ConsoleKit2 support for screenlocker
-X-Git-Url: http://quickgit.kde.org/?p=plasma-workspace.git&a=commitdiff&h=72578284a1fda5f012cafcaccad6069fadbf9a25
----
-ConsoleKit2 support for screenlocker
-
-ConsoleKit2 has the same API as systemd-logind for Lock, Unlock,
-PrepareForSleep, and Inhibit. This patch adds the functionality
-for ConsoleKit2 while attempting to minimize code duplication.
-
-REVIEW: 124469
----
-
-
---- a/ksmserver/screenlocker/logind.cpp
-+++ b/ksmserver/screenlocker/logind.cpp
-@@ -25,13 +25,17 @@
- #include <QDebug>
- #include <QDBusConnection>
- #include <QDBusConnectionInterface>
--#include <QDBusPendingCallWatcher>
- #include <QDBusServiceWatcher>
-
- const static QString s_login1Service = QStringLiteral("org.freedesktop.login1");
- const static QString s_login1Path = QStringLiteral("/org/freedesktop/login1");
- const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.login1.Manager");
- const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.login1.Session");
-+
-+const static QString s_consolekitService = QStringLiteral("org.freedesktop.ConsoleKit");
-+const static QString s_consolekitPath = QStringLiteral("/org/freedesktop/ConsoleKit/Manager");
-+const static QString s_consolekitManagerInterface = QStringLiteral("org.freedesktop.ConsoleKit.Manager");
-+const static QString s_consolekitSessionInterface = QStringLiteral("org.freedesktop.ConsoleKit.Session");
-
- LogindIntegration::LogindIntegration(const QDBusConnection &connection, QObject *parent)
- : QObject(parent)
-@@ -42,6 +46,10 @@
- this))
- , m_connected(false)
- , m_inhibitFileDescriptor()
-+ , m_service(nullptr)
-+ , m_path(nullptr)
-+ , m_managerInterface(nullptr)
-+ , m_sessionInterface(nullptr)
- {
- connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &LogindIntegration::logindServiceRegistered);
- connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this,
-@@ -67,6 +75,11 @@
- }
- if (reply.value().contains(s_login1Service)) {
- logindServiceRegistered();
-+ // Don't register ck if we have logind
-+ return;
-+ }
-+ if (reply.value().contains(s_consolekitService)) {
-+ consolekitServiceRegistered();
- }
- }
- );
-@@ -89,6 +102,40 @@
- message.setArguments(QVariantList() << (quint32) QCoreApplication::applicationPid());
- QDBusPendingReply<QDBusObjectPath> session = m_bus.asyncCall(message);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(session, this);
-+
-+ m_service = &s_login1Service;
-+ m_path = &s_login1Path;
-+ m_managerInterface = &s_login1ManagerInterface;
-+ m_sessionInterface = &s_login1SessionInterface;
-+
-+ commonServiceRegistered(watcher);
-+}
-+
-+void LogindIntegration::consolekitServiceRegistered()
-+{
-+ // Don't try to register with ck if we have logind
-+ if (m_connected) {
-+ return;
-+ }
-+
-+ // get the current session
-+ QDBusMessage message = QDBusMessage::createMethodCall(s_consolekitService,
-+ s_consolekitPath,
-+ s_consolekitManagerInterface,
-+ QStringLiteral("GetCurrentSession"));
-+ QDBusPendingReply<QDBusObjectPath> session = m_bus.asyncCall(message);
-+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(session, this);
-+
-+ m_service = &s_consolekitService;
-+ m_path = &s_consolekitPath;
-+ m_managerInterface = &s_consolekitManagerInterface;
-+ m_sessionInterface = &s_consolekitSessionInterface;
-+
-+ commonServiceRegistered(watcher);
-+}
-+
-+void LogindIntegration::commonServiceRegistered(QDBusPendingCallWatcher *watcher)
-+{
- connect(watcher, &QDBusPendingCallWatcher::finished, this,
- [this](QDBusPendingCallWatcher *self) {
- QDBusPendingReply<QDBusObjectPath> reply = *self;
-@@ -97,7 +144,7 @@
- return;
- }
- if (!reply.isValid()) {
-- qDebug() << "The session is not registered with logind" << reply.error().message();
-+ qDebug() << "The session is not registered: " << reply.error().message();
- return;
- }
- const QString sessionPath = reply.value().path();
-@@ -105,15 +152,15 @@
-
- // connections need to be done this way as the object exposes both method and signal
- // with name "Lock"/"Unlock". Qt is not able to automatically handle this.
-- m_bus.connect(s_login1Service,
-+ m_bus.connect(*m_service,
- sessionPath,
-- s_login1SessionInterface,
-+ *m_sessionInterface,
- QStringLiteral("Lock"),
- this,
- SIGNAL(requestLock()));
-- m_bus.connect(s_login1Service,
-+ m_bus.connect(*m_service,
- sessionPath,
-- s_login1SessionInterface,
-+ *m_sessionInterface,
- QStringLiteral("Unlock"),
- this,
- SIGNAL(requestUnlock()));
-@@ -123,9 +170,9 @@
- );
-
- // connect to manager object's signals we need
-- m_bus.connect(s_login1Service,
-- s_login1Path,
-- s_login1ManagerInterface,
-+ m_bus.connect(*m_service,
-+ *m_path,
-+ *m_managerInterface,
- QStringLiteral("PrepareForSleep"),
- this,
- SIGNAL(prepareForSleep(bool)));
-@@ -136,9 +183,14 @@
- if (m_inhibitFileDescriptor.isValid()) {
- return;
- }
-- QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service,
-- s_login1Path,
-- s_login1ManagerInterface,
-+
-+ if (!m_connected) {
-+ return;
-+ }
-+
-+ QDBusMessage message = QDBusMessage::createMethodCall(*m_service,
-+ *m_path,
-+ *m_managerInterface,
- QStringLiteral("Inhibit"));
- message.setArguments(QVariantList({QStringLiteral("sleep"),
- i18n("Screen Locker"),
-
---- a/ksmserver/screenlocker/logind.h
-+++ b/ksmserver/screenlocker/logind.h
-@@ -23,6 +23,7 @@
- #include <QDBusConnection>
- #include <QDBusUnixFileDescriptor>
- #include <QObject>
-+#include <QDBusPendingCallWatcher>
-
- class QDBusServiceWatcher;
-
-@@ -59,10 +60,16 @@
- **/
- explicit LogindIntegration(const QDBusConnection &connection, QObject *parent = nullptr);
- void logindServiceRegistered();
-+ void consolekitServiceRegistered();
-+ void commonServiceRegistered(QDBusPendingCallWatcher *watcher);
- QDBusConnection m_bus;
- QDBusServiceWatcher *m_logindServiceWatcher;
- bool m_connected;
- QDBusUnixFileDescriptor m_inhibitFileDescriptor;
-+ const QString *m_service;
-+ const QString *m_path;
-+ const QString *m_managerInterface;
-+ const QString *m_sessionInterface;
- };
-
- #endif
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch b/kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch
deleted file mode 100644
index e2f1e48..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From f32002ce50edc3891f1fa41173132c820b917d57 Mon Sep 17 00:00:00 2001
-From: Marco Martin <notmart@gmail.com>
-Date: Mon, 5 Feb 2018 13:12:51 +0100
-Subject: Make sure device paths are quoted
-
-in the case a vfat removable device has $() or `` in its label,
-such as $(touch foo) the quoted command may get executed,
-leaving an attack vector. Use KMacroExpander::expandMacrosShellQuote
-to make sure everything is quoted and not interpreted as a command
-
-BUG:389815
----
- soliduiserver/deviceserviceaction.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/soliduiserver/deviceserviceaction.cpp b/soliduiserver/deviceserviceaction.cpp
-index f49c967..738b27c 100644
---- a/soliduiserver/deviceserviceaction.cpp
-+++ b/soliduiserver/deviceserviceaction.cpp
-@@ -158,7 +158,7 @@ void DelayedExecutor::delayedExecute(const QString &udi)
-
- QString exec = m_service.exec();
- MacroExpander mx(device);
-- mx.expandMacros(exec);
-+ mx.expandMacrosShellQuote(exec);
-
- KRun::runCommand(exec, QString(), m_service.icon(), 0);
- deleteLater();
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/plasma5-nm.patch b/kde/patch/plasma5-nm.patch
deleted file mode 100644
index deb03e5..0000000
--- a/kde/patch/plasma5-nm.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-# Patches that address reported bugs in plasma-nm 0.9.3.1:
-#cat $CWD/patch/plasma-nm/plasma-nm-fixes.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# The plasma-nm-5.2.2 needs a patch to work with the new modemmanager-qt in
-# frameworks 5.9.0. This patch is no longer needed for plasma-nm-5.3.0:
-#cat $CWD/patch/plasma-nm/plasma-nm_modemmanager-qt_api.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix compilation against NetworkManager 1.0.6:
-#cat $CWD/patch/plasma-nm/plasma-nm_networkmanager.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Password is asked twice when connecting to a new WiFi network,
-# KDEBUG 423093; fixed in Frameworks 5.72 and Plasma 5.20.
-cat $CWD/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma5-nm/plasma-nm-fixes.patch b/kde/patch/plasma5-nm/plasma-nm-fixes.patch
deleted file mode 100644
index d98448d..0000000
--- a/kde/patch/plasma5-nm/plasma-nm-fixes.patch
+++ /dev/null
@@ -1,322 +0,0 @@
-diff --git a/applet/declarative/contents/ui/main.qml b/applet/declarative/contents/ui/main.qml
-index 8ea88cc..aa81707 100644
---- a/applet/declarative/contents/ui/main.qml
-+++ b/applet/declarative/contents/ui/main.qml
-@@ -19,6 +19,7 @@
- */
-
- import QtQuick 1.1
-+import org.kde.plasma.extras 0.1 as PlasmaExtras
- import org.kde.plasma.components 0.1 as PlasmaComponents
- import org.kde.plasma.core 0.1 as PlasmaCore
- import org.kde.networkmanagement 0.1 as PlasmaNM
-@@ -77,16 +78,7 @@ Item {
- anchors.fill: parent
- }
-
-- ListView {
-- id: connectionView;
--
-- property bool expandedItem: false;
-- property string previouslyExpandedItem: "";
--
-- property bool activeExpanded: true;
-- property bool previousExpanded: true;
-- property bool unknownExpanded: true;
--
-+ PlasmaExtras.ScrollArea {
- anchors {
- left: parent.left;
- right: parent.right;
-@@ -95,50 +87,64 @@ Item {
- topMargin: padding.margins.top;
- bottomMargin: padding.margins.bottom
- }
-- clip: true
-- model: connectionSortModel;
-- currentIndex: -1;
-- interactive: true;
-- boundsBehavior: Flickable.StopAtBounds;
-- section.property: "itemSection";
-- section.delegate: SectionHeader {
-- onHideSection: {
-- if (section == i18n("Active connections")) {
-- connectionView.activeExpanded = false;
-- } else if (section == i18n("Previous connections")) {
-- connectionView.previousExpanded = false;
-- } else {
-- connectionView.unknownExpanded = false;
-+
-+ ListView {
-+ id: connectionView;
-+
-+ property bool expandedItem: false;
-+ property string previouslyExpandedItem: "";
-+
-+ property bool activeExpanded: true;
-+ property bool previousExpanded: true;
-+ property bool unknownExpanded: true;
-+
-+ anchors.fill: parent;
-+
-+ clip: true
-+ model: connectionSortModel;
-+ currentIndex: -1;
-+ interactive: true;
-+ boundsBehavior: Flickable.StopAtBounds;
-+ section.property: "itemSection";
-+ section.delegate: SectionHeader {
-+ onHideSection: {
-+ if (section == i18n("Active connections")) {
-+ connectionView.activeExpanded = false;
-+ } else if (section == i18n("Previous connections")) {
-+ connectionView.previousExpanded = false;
-+ } else {
-+ connectionView.unknownExpanded = false;
-+ }
- }
-- }
-
-- onShowSection: {
-- if (section == i18n("Active connections")) {
-- connectionView.activeExpanded = true;
-- } else if (section == i18n("Previous connections")) {
-- connectionView.previousExpanded = true;
-- } else {
-- connectionView.unknownExpanded = true;
-+ onShowSection: {
-+ if (section == i18n("Active connections")) {
-+ connectionView.activeExpanded = true;
-+ } else if (section == i18n("Previous connections")) {
-+ connectionView.previousExpanded = true;
-+ } else {
-+ connectionView.unknownExpanded = true;
-+ }
- }
- }
-- }
-
-- delegate: ConnectionItem {
-- expanded: connectionView.expandedItem && connectionView.previouslyExpandedItem == itemUni;
-- onItemExpanded: {
-- if (itemExpanded) {
-- connectionView.expandedItem = true;
-- connectionView.previouslyExpandedItem = itemUni;;
-- connectionView.currentIndex = index;
-- } else {
-- connectionView.expandedItem = false;
-- connectionView.previouslyExpandedItem = "";
-+ delegate: ConnectionItem {
-+ expanded: connectionView.expandedItem && connectionView.previouslyExpandedItem == itemUni;
-+ onItemExpanded: {
-+ if (itemExpanded) {
-+ connectionView.expandedItem = true;
-+ connectionView.previouslyExpandedItem = itemUni;;
-+ connectionView.currentIndex = index;
-+ } else {
-+ connectionView.expandedItem = false;
-+ connectionView.previouslyExpandedItem = "";
-+ }
- }
-- }
-
-- ListView.onRemove: {
-- if (ListView.isCurrentItem) {
-- connectionView.previouslyExpandedItem = "";
-+ ListView.onRemove: {
-+ if (ListView.isCurrentItem) {
-+ connectionView.previouslyExpandedItem = "";
-+ }
- }
- }
- }
-diff --git a/declarative-plugins/applet/connectionicon.cpp b/declarative-plugins/applet/connectionicon.cpp
-index c3f8540..76bdca0 100644
---- a/declarative-plugins/applet/connectionicon.cpp
-+++ b/declarative-plugins/applet/connectionicon.cpp
-@@ -166,12 +166,24 @@ void ConnectionIcon::setIcons()
-
- foreach (const NetworkManager::ActiveConnection::Ptr & active, actives) {
- if (((active->default4() || active->default6()) && active->state() == NetworkManager::ActiveConnection::Activated) || !defaultRouteExists) {
-+ NetworkManager::ActiveConnection::Ptr activeConnection;
-+ if (active->vpn()) {
-+ NetworkManager::ActiveConnection::Ptr activeTmp;
-+ activeTmp = NetworkManager::findActiveConnection(active->specificObject());
-+ if (activeTmp) {
-+ activeConnection = activeTmp;
-+ }
-
-- if (active->vpn() || active->devices().isEmpty()) {
-+ vpnFound = true;
-+ NMAppletDebug() << "Emit signal setHoverIcon(object-locked)";
-+ Q_EMIT setHoverIcon("object-locked");
-+ } else {
-+ activeConnection = active;
-+ }
-+ if (activeConnection->devices().isEmpty()) {
- continue;
- }
--
-- NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(active->devices().first());
-+ NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(activeConnection->devices().first());
- if (device) {
- NetworkManager::Device::Type type = device->type();
-
-@@ -184,7 +196,7 @@ void ConnectionIcon::setIcons()
- setWirelessIconForSignalStrength(100);
- connectionFound = true;
- } else {
-- NetworkManager::AccessPoint::Ptr ap = wifiDevice->findAccessPoint(active->specificObject());
-+ NetworkManager::AccessPoint::Ptr ap = wifiDevice->findAccessPoint(activeConnection->specificObject());
- if (ap) {
- setWirelessIcon(device, ap->ssid());
- connectionFound = true;
-@@ -222,9 +234,7 @@ void ConnectionIcon::setIcons()
- }
- }
- }
-- }
--
-- if (active->vpn() && active->state() == NetworkManager::ActiveConnection::Activated) {
-+ } else if (active->vpn() && active->state() == NetworkManager::ActiveConnection::Activated) {
- vpnFound = true;
- NMAppletDebug() << "Emit signal setHoverIcon(object-locked)";
- Q_EMIT setHoverIcon("object-locked");
-diff --git a/declarative-plugins/applet/networkstatus.cpp b/declarative-plugins/applet/networkstatus.cpp
-index d63066d..8149da9 100644
---- a/declarative-plugins/applet/networkstatus.cpp
-+++ b/declarative-plugins/applet/networkstatus.cpp
-@@ -129,8 +129,8 @@ void NetworkStatus::changeTooltip()
- }
-
- QString tooltip = "<qt>";
-- QString format = "<b>%1 - %2</b><br>%3<br><br>";
-- QString formatDefault = "<b>%1 - %2</b><br><b>%3</b><br><br>";
-+ const QString format = "<b>%1 - %2</b><br>%3<br><br>";
-+ const QString formatDefault = "<b>%1 - %2</b><br><b>%3</b><br><br>";
-
- foreach (const NetworkManager::ActiveConnection::Ptr & active, NetworkManager::activeConnections()) {
- if (!active->devices().isEmpty()) {
-@@ -145,7 +145,6 @@ void NetworkStatus::changeTooltip()
- } else {
- devName = device->ipInterfaceName();
- }
--// conType = NetworkManager::ConnectionSettings::typeAsString(active->connection()->settings()->connectionType());
- if (active->vpn()) {
- conType = i18n("VPN Connection");
- } else {
-diff --git a/declarative-plugins/model/model.cpp b/declarative-plugins/model/model.cpp
-index 1b3f4c3..bb88362 100644
---- a/declarative-plugins/model/model.cpp
-+++ b/declarative-plugins/model/model.cpp
-@@ -230,7 +230,7 @@ void Model::addConnection(const QString& connection, const QString& device)
- {
- NetworkManager::Connection::Ptr con = NetworkManager::findConnection(connection);
-
-- if (con->settings()->isSlave()) {
-+ if (con->settings()->isSlave() || con->name().isEmpty() || con->uuid().isEmpty()) {
- return;
- }
-
-@@ -395,7 +395,11 @@ void Model::removeWirelessNetwork(const QString& ssid, const QString& device)
- if (wirelessDevice) {
- accessPoint = wirelessDevice->findAccessPoint(item->specificPath());
- }
-- if (accessPoint && accessPoint->mode() == NetworkManager::AccessPoint::Adhoc &&
-+
-+ // When accesspoint in ad-hoc mode dissapears, we should remove the item only when there is no connection. Similar case is when
-+ // a wireless device is in AP mode, but in this case there could be only one visible AP and this should always be associated with some connection.
-+ if (accessPoint && ((accessPoint->mode() == NetworkManager::AccessPoint::Adhoc && !item->connectionPath().isEmpty()) ||
-+ wirelessDevice->mode() == NetworkManager::WirelessDevice::ApMode) &&
- NetworkManager::isWirelessEnabled() && NetworkManager::isWirelessHardwareEnabled()) {
- item->setWirelessNetwork(QString());
- if (updateItem(item)) {
-diff --git a/declarative-plugins/model/modelitem.cpp b/declarative-plugins/model/modelitem.cpp
-index 9a5931f..58d5c42 100644
---- a/declarative-plugins/model/modelitem.cpp
-+++ b/declarative-plugins/model/modelitem.cpp
-@@ -151,6 +151,17 @@ QString ModelItem::icon() const
- break;
- case NetworkManager::ConnectionSettings::Wireless:
- if (m_signal == 0 ) {
-+ if (!m_connectionPath.isEmpty()) {
-+ NetworkManager::Connection::Ptr con = NetworkManager::findConnection(m_connectionPath);
-+ if (con) {
-+ NetworkManager::WirelessSetting::Ptr wirelessSetting;
-+ wirelessSetting = con->settings()->setting(NetworkManager::Setting::Wireless).dynamicCast<NetworkManager::WirelessSetting>();
-+ if (wirelessSetting && (wirelessSetting->mode() == NetworkManager::WirelessSetting::Adhoc ||
-+ wirelessSetting->mode() == NetworkManager::WirelessSetting::Ap)) {
-+ return "network-wireless-100";
-+ }
-+ }
-+ }
- return "network-wireless-00";
- } else if (m_signal < 20) {
- return "network-wireless-20";
-diff --git a/kded/bluetoothmonitor.cpp b/kded/bluetoothmonitor.cpp
-index 2221d09..5d0218b 100644
---- a/kded/bluetoothmonitor.cpp
-+++ b/kded/bluetoothmonitor.cpp
-@@ -220,6 +220,7 @@ void BluetoothMonitor::init()
-
- mDunDevice = reply.value();
- }
-+
- #if WITH_MODEMMANAGER_SUPPORT
- void BluetoothMonitor::modemAdded(const QString &udi)
- {
-diff --git a/lib/editor/bridgewidget.cpp b/lib/editor/bridgewidget.cpp
-index 8815eb2..95344c4 100644
---- a/lib/editor/bridgewidget.cpp
-+++ b/lib/editor/bridgewidget.cpp
-@@ -216,5 +216,5 @@ void BridgeWidget::populateBridges()
-
- bool BridgeWidget::isValid() const
- {
-- return !m_ui->ifaceName->text().isEmpty() && m_ui->bridges->count() > 0;
-+ return !m_ui->ifaceName->text().isEmpty();
- }
-diff --git a/vpn/vpnc/vpnc.cpp b/vpn/vpnc/vpnc.cpp
-index d4a511d..645249d 100644
---- a/vpn/vpnc/vpnc.cpp
-+++ b/vpn/vpnc/vpnc.cpp
-@@ -145,7 +145,6 @@ NMVariantMapMap VpncUiPlugin::importConnectionSettings(const QString &fileName)
- KConfigGroup cg(config, "main"); // Keys&Values are stored under [main]
- if (cg.exists()) {
- // Setup cisco-decrypt binary to decrypt the passwords
-- QStringList decrArgs;
- const QString ciscoDecryptBinary = KStandardDirs::findExe("cisco-decrypt", QString::fromLocal8Bit(qgetenv("PATH")) + ":/usr/lib/vpnc");
- if (ciscoDecryptBinary.isEmpty()) {
- mErrorMessage = i18n("Needed executable cisco-decrypt could not be found.");
-@@ -174,11 +173,11 @@ NMVariantMapMap VpncUiPlugin::importConnectionSettings(const QString &fileName)
- }
- else if (!decrPlugin->readStringKeyValue(cg,"enc_UserPassword").isEmpty() && !ciscoDecryptBinary.isEmpty()) {
- // Decrypt the password and insert into map
-- decrArgs.clear();
-- decrArgs << decrPlugin->readStringKeyValue(cg,"enc_UserPassword");
-- decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary, decrArgs);
-+ decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary);
- decrPlugin->ciscoDecrypt->start();
-- if (decrPlugin->ciscoDecrypt->waitForStarted() && decrPlugin->ciscoDecrypt->waitForFinished()) {
-+ decrPlugin->ciscoDecrypt->waitForStarted();
-+ decrPlugin->ciscoDecrypt->write(decrPlugin->readStringKeyValue(cg,"enc_UserPassword").toUtf8());
-+ if (decrPlugin->ciscoDecrypt->waitForFinished()) {
- secretData.insert(NM_VPNC_KEY_XAUTH_PASSWORD, decrPlugin->decryptedPasswd);
- }
- }
-@@ -203,11 +202,11 @@ NMVariantMapMap VpncUiPlugin::importConnectionSettings(const QString &fileName)
- }
- else if (!decrPlugin->readStringKeyValue(cg,"enc_GroupPwd").isEmpty() && !ciscoDecryptBinary.isEmpty()) {
- //Decrypt the password and insert into map
-- decrArgs.clear();
-- decrArgs << decrPlugin->readStringKeyValue(cg,"enc_GroupPwd");
-- decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary, decrArgs);
-+ decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary);
- decrPlugin->ciscoDecrypt->start();
-- if (decrPlugin->ciscoDecrypt->waitForStarted() && decrPlugin->ciscoDecrypt->waitForFinished()) {
-+ decrPlugin->ciscoDecrypt->waitForStarted();
-+ decrPlugin->ciscoDecrypt->write(decrPlugin->readStringKeyValue(cg,"enc_GroupPwd").toUtf8());
-+ if (decrPlugin->ciscoDecrypt->waitForFinished()) {
- secretData.insert(NM_VPNC_KEY_SECRET, decrPlugin->decryptedPasswd);
- data.insert(NM_VPNC_KEY_SECRET"-flags", QString::number(NetworkManager::Setting::AgentOwned));
- }
diff --git a/kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch b/kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch
deleted file mode 100644
index 4c59f4c..0000000
--- a/kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From: Jan Grulich <jgrulich@redhat.com>
-Date: Tue, 31 Mar 2015 12:37:16 +0000
-Subject: Adapt to modemmanager-qt API changes
-X-Git-Url: http://quickgit.kde.org/?p=plasma-nm.git&a=commitdiff&h=4d72cb7966edda33bc72c77fc2a126844fc1f134
----
-Adapt to modemmanager-qt API changes
----
-
-
---- a/libs/models/networkmodel.cpp
-+++ b/libs/models/networkmodel.cpp
-@@ -246,10 +246,10 @@
- if (modem->hasInterface(ModemManager::ModemDevice::ModemInterface)) {
- ModemManager::Modem::Ptr modemNetwork = modem->interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
- if (modemNetwork) {
-- connect(modemNetwork.data(), SIGNAL(signalQualityChanged(uint)),
-- SLOT(gsmNetworkSignalQualityChanged(uint)), Qt::UniqueConnection);
-- connect(modemNetwork.data(), SIGNAL(accessTechnologyChanged(ModemManager::Modem::AccessTechnologies)),
-- SLOT(gsmNetworkAccessTechnologyChanged(ModemManager::Modem::AccessTechnologies)), Qt::UniqueConnection);
-+ connect(modemNetwork.data(), SIGNAL(signalQualityChanged(ModemManager::SignalQualityPair)),
-+ SLOT(gsmNetworkSignalQualityChanged(ModemManager::SignalQualityPair)), Qt::UniqueConnection);
-+ connect(modemNetwork.data(), SIGNAL(accessTechnologiesChanged(QFlags<MMModemAccessTechnology>)),
-+ SLOT(gsmNetworkAccessTechnologiesChanged(QFlags<MMModemAccessTechnology>)), Qt::UniqueConnection);
- connect(modemNetwork.data(), SIGNAL(currentModesChanged()),
- SLOT(gsmNetworkCurrentModesChanged()), Qt::UniqueConnection);
- }
-@@ -847,9 +847,9 @@
- }
-
- #if WITH_MODEMMANAGER_SUPPORT
--void NetworkModel::gsmNetworkAccessTechnologyChanged(ModemManager::Modem::AccessTechnologies technology)
--{
-- Q_UNUSED(technology);
-+void NetworkModel::gsmNetworkAccessTechnologiesChanged(QFlags<MMModemAccessTechnology> accessTechnologies)
-+{
-+ Q_UNUSED(accessTechnologies);
- ModemManager::Modem * gsmNetwork = qobject_cast<ModemManager::Modem*>(sender());
- if (gsmNetwork) {
- Q_FOREACH (const NetworkManager::Device::Ptr & dev, NetworkManager::networkInterfaces()) {
-@@ -893,7 +893,7 @@
- }
- }
-
--void NetworkModel::gsmNetworkSignalQualityChanged(uint signal)
-+void NetworkModel::gsmNetworkSignalQualityChanged(const ModemManager::SignalQualityPair &signalQuality)
- {
- ModemManager::Modem * gsmNetwork = qobject_cast<ModemManager::Modem*>(sender());
- if (gsmNetwork) {
-@@ -905,7 +905,7 @@
- ModemManager::Modem::Ptr modemNetwork = modem->interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
- if (modemNetwork && modemNetwork->device() == gsmNetwork->device()) {
- Q_FOREACH (NetworkModelItem * item, m_list.returnItems(NetworkItemsList::Device, dev->uni())) {
-- item->setSignal(signal);
-+ item->setSignal(signalQuality.signal);
- updateItem(item);
- }
- }
-
---- a/libs/models/networkmodel.h
-+++ b/libs/models/networkmodel.h
-@@ -94,9 +94,9 @@
- void deviceRemoved(const QString& device);
- void deviceStateChanged(NetworkManager::Device::State state, NetworkManager::Device::State oldState, NetworkManager::Device::StateChangeReason reason);
- #if WITH_MODEMMANAGER_SUPPORT
-- void gsmNetworkAccessTechnologyChanged(ModemManager::Modem::AccessTechnologies technology);
-+ void gsmNetworkAccessTechnologiesChanged(QFlags<MMModemAccessTechnology> accessTechnologies);
- void gsmNetworkCurrentModesChanged();
-- void gsmNetworkSignalQualityChanged(uint signal);
-+ void gsmNetworkSignalQualityChanged(const ModemManager::SignalQualityPair &signalQuality);
- #endif
- void ipConfigChanged();
- void ipInterfaceChanged();
-
diff --git a/kde/patch/plasma5-nm/plasma-nm_networkmanager.patch b/kde/patch/plasma5-nm/plasma-nm_networkmanager.patch
deleted file mode 100644
index e635954..0000000
--- a/kde/patch/plasma5-nm/plasma-nm_networkmanager.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-Patch taken from gentoo:
-https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=bd7dad9ddb35e1e3e68ad43176c5e48fbb25338d
-
-Fixes build with networkmanager-1.0.6.
-
-Triggered by http://cgit.freedesktop.org/NetworkManager/NetworkManager/commit/?h=nm-1-0&id=6f616d4c4b04d5478f60d0311317bc84c5459ea4.
-
---- CMakeLists.txt
-+++ CMakeLists.txt
-@@ -49,6 +49,7 @@
- ${CMAKE_CURRENT_SOURCE_DIR}/libs
- ${CMAKE_CURRENT_SOURCE_DIR}/libs/editor/
- ${NETWORKMANAGER_INCLUDE_DIRS}
-+ ${NM-UTIL_INCLUDE_DIRS}
- ${NETWORKMANAGERQT_INCLUDE_DIRS}
- ${KDE4_INCLUDES})
-
diff --git a/kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch b/kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch
deleted file mode 100644
index 53ea613..0000000
--- a/kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 271332cfc19ede398854113d037abfb35503179f Mon Sep 17 00:00:00 2001
-From: Nate Graham <nate@kde.org>
-Date: Thu, 18 Jun 2020 15:34:40 +0000
-Subject: [PATCH] [WIP] [applet] Fix inline password field component not
- working properly
-
-BUG: 423093
-FIXED-IN: 5.20
----
- applet/contents/ui/ConnectionItem.qml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/applet/contents/ui/ConnectionItem.qml b/applet/contents/ui/ConnectionItem.qml
-index 98240928..06c7ab25 100644
---- a/applet/contents/ui/ConnectionItem.qml
-+++ b/applet/contents/ui/ConnectionItem.qml
-@@ -231,8 +231,8 @@ PlasmaExtras.ExpandableListItem {
- if (!predictableWirelessPassword && !Uuid) {
- handler.addAndActivateConnection(DevicePath, SpecificPath)
- } else if (connectionItem.customExpandedViewContent == passwordDialogComponent) {
-- if (passwordDialogComponent.password != "") {
-- handler.addAndActivateConnection(DevicePath, SpecificPath, passwordDialogComponent.password)
-+ if (connectionItem.customExpandedViewContentItem.password != "") {
-+ handler.addAndActivateConnection(DevicePath, SpecificPath, connectionItem.customExpandedViewContentItem.password)
- connectionItem.customExpandedViewContent = detailsComponent
- connectionItem.collapse()
- } else {
---
-2.27.0
-
-
diff --git a/kde/patch/powerdevil.patch b/kde/patch/powerdevil.patch
deleted file mode 100644
index b7e2bae..0000000
--- a/kde/patch/powerdevil.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# PowerDevil fails to setup power settings on a fresh install.
-# Fixed in 5.12.5.
-#cat $CWD/patch/powerdevil/powerdevil-5.12.4_firstrun.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch b/kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch
deleted file mode 100644
index 165e67b..0000000
--- a/kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From be91abe7fc8cc731b57bec4cf2c004c07b0fd79b Mon Sep 17 00:00:00 2001
-From: Kai Uwe Broulik <kde@privat.broulik.de>
-Date: Wed, 25 Apr 2018 10:56:16 +0200
-Subject: Ignore "migration" key for determining whether the config is empty
-
-Otherwise we would never generate the default power management configuration
-leading to it not suspending on lid close, not handling power buttons etc etc
-
-CHANGELOG: Fixed bug that caused power management system to not work on a fresh install
-
-Reviewed-By: David Edmundson
-
-BUG: 391782
-FIXED-IN: 5.12.5
----
- daemon/powerdevilcore.cpp | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/daemon/powerdevilcore.cpp b/daemon/powerdevilcore.cpp
-index 2cf936e..53b7521 100644
---- a/daemon/powerdevilcore.cpp
-+++ b/daemon/powerdevilcore.cpp
-@@ -108,9 +108,15 @@ void Core::onBackendReady()
-
- m_profilesConfig = KSharedConfig::openConfig("powermanagementprofilesrc", KConfig::CascadeConfig);
-
-+ QStringList groups = m_profilesConfig->groupList();
-+ // the "migration" key is for shortcuts migration in added by migratePre512KeyboardShortcuts
-+ // and as such our configuration would never be considered empty, ignore it!
-+ groups.removeOne(QStringLiteral("migration"));
-+
- // Is it brand new?
-- if (m_profilesConfig->groupList().isEmpty()) {
-+ if (groups.isEmpty()) {
- // Generate defaults
-+ qCDebug(POWERDEVIL) << "Generating a default configuration";
- bool toRam = m_backend->supportedSuspendMethods() & PowerDevil::BackendInterface::ToRam;
- bool toDisk = m_backend->supportedSuspendMethods() & PowerDevil::BackendInterface::ToDisk;
- ProfileGenerator::generateProfiles(toRam, toDisk);
---
-cgit v0.11.2
-
diff --git a/kde/patch/pykde4.patch b/kde/patch/pykde4.patch
index 48073d4..d5eb044 100644
--- a/kde/patch/pykde4.patch
+++ b/kde/patch/pykde4.patch
@@ -2,4 +2,3 @@
cat $CWD/patch/pykde4/0001-use-LIB_PYTHON-realpath.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
cat $CWD/patch/pykde4/0002-Add-some-missing-link-libraries.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
cat $CWD/patch/pykde4/0003-Fix-build-with-sip-4.19.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/qqc2-desktop-style.patch b/kde/patch/qqc2-desktop-style.patch
deleted file mode 100644
index 36e0bb1..0000000
--- a/kde/patch/qqc2-desktop-style.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Use scrollbar height as bottom padding, not width.
-# Should be fixed post qqc2-desktop-style 5.67.0):
-#cat $CWD/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-
diff --git a/kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch b/kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch
deleted file mode 100644
index 9f577e2..0000000
--- a/kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 6995b4ae81a2f3ca3c24d2fa6d1560bfe0898737 Mon Sep 17 00:00:00 2001
-From: Arjen Hiemstra <ahiemstra@heimr.nl>
-Date: Mon, 10 Feb 2020 11:47:00 +0100
-Subject: ScrollView: Use scrollbar height as bottom padding, not width
-
-Summary:
-Apparently I accidentally used the bottom scrollbar width instead of
-height. Oops.
-
-Test Plan: ScrollView with horizontal scrollbar no longer hides content
-
-Reviewers: #plasma, davidedmundson
-
-Reviewed By: #plasma, davidedmundson
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D27280
----
- org.kde.desktop/ScrollView.qml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/org.kde.desktop/ScrollView.qml b/org.kde.desktop/ScrollView.qml
-index 4bea5c7..38bc8ed 100644
---- a/org.kde.desktop/ScrollView.qml
-+++ b/org.kde.desktop/ScrollView.qml
-@@ -45,7 +45,7 @@ T.ScrollView {
- rightPadding: (internal.backgroundVisible && background.hasOwnProperty("rightPadding") ? background.rightPadding : 0)
- + (!LayoutMirroring.enabled ? internal.verticalScrollBarWidth : 0)
- bottomPadding: (internal.backgroundVisible && background.hasOwnProperty("bottomPadding") ? background.bottomPadding : 0)
-- + internal.horizontalScrollBarWidth
-+ + internal.horizontalScrollBarHeight
-
- //create a background only after Component.onCompleted, see on the component creation below for explanation
- Component.onCompleted: {
-@@ -97,7 +97,7 @@ T.ScrollView {
-
- readonly property bool backgroundVisible: controlRoot.background && controlRoot.background.visible
- readonly property real verticalScrollBarWidth: controlRoot.ScrollBar.vertical.visible && !Kirigami.Settings.tabletMode ? controlRoot.ScrollBar.vertical.width : 0
-- readonly property real horizontalScrollBarWidth: controlRoot.ScrollBar.horizontal.visible && !Kirigami.Settings.tabletMode ? controlRoot.ScrollBar.horizontal.width : 0
-+ readonly property real horizontalScrollBarHeight: controlRoot.ScrollBar.horizontal.visible && !Kirigami.Settings.tabletMode ? controlRoot.ScrollBar.horizontal.height : 0
- }
- ]
- ScrollBar.vertical: ScrollBar {
---
-cgit v1.1
-
-
-
diff --git a/kde/patch/sddm-theme-breeze.patch b/kde/patch/sddm-theme-breeze.patch
deleted file mode 100644
index c500dba..0000000
--- a/kde/patch/sddm-theme-breeze.patch
+++ /dev/null
@@ -1,2 +0,0 @@
-# SDDM changed its location for the themes:
-#cat $CWD/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff b/kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff
deleted file mode 100644
index 96817ad..0000000
--- a/kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-diff -uar sddm-theme-breeze-20140601.orig/CMakeLists.txt sddm-theme-breeze-20140601/CMakeLists.txt
---- sddm-theme-breeze-20140601.orig/CMakeLists.txt 2014-06-01 05:19:59.000000000 +0200
-+++ sddm-theme-breeze-20140601/CMakeLists.txt 2014-09-15 14:08:36.883149093 +0200
-@@ -3,5 +3,5 @@
- message("This cmake file does some weird stuff for the neon ISO")
- message("unless you are Rohan or Harold turn back now and revert this commit")
-
--INSTALL(DIRECTORY breeze DESTINATION ${CMAKE_INSTALL_PREFIX}/share/apps/sddm/themes/)
-+INSTALL(DIRECTORY breeze DESTINATION ${CMAKE_INSTALL_PREFIX}/share/sddm/themes/)
- INSTALL(FILES plasmarc DESTINATION /var/lib/sddm/.config)
diff --git a/kde/patch/spectacle.patch b/kde/patch/spectacle.patch
deleted file mode 100644
index 9ab4616..0000000
--- a/kde/patch/spectacle.patch
+++ /dev/null
@@ -1,7 +0,0 @@
-# Fix for broken HiDPI support.
-# Fixed post Applications 16.04.0:
-#cat $CWD/patch/spectacle/spectacle_hidpi.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-# Fix for broken rectangular image capture on Nvidia GPU (KDEBUG 362241):
-# Fixed post Applications 16.04.0:
-#cat $CWD/patch/spectacle/spectacle_rect_capture.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/spectacle/spectacle_hidpi.patch b/kde/patch/spectacle/spectacle_hidpi.patch
deleted file mode 100644
index 19cf923..0000000
--- a/kde/patch/spectacle/spectacle_hidpi.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/src/QuickEditor/EditorRoot.qml
-+++ b/src/QuickEditor/EditorRoot.qml
-@@ -36,10 +36,10 @@
- }
-
- selection = cropRectangle.createObject(parent, {
-- "x": xx,
-- "y": yy,
-+ "x": xx,
-+ "y": yy,
- "height": hh,
-- "width": ww
-+ "width": ww
- });
-
- cropDisplayCanvas.requestPaint();
-@@ -73,8 +73,8 @@
- source: "image://snapshot/rawimage";
- cache: false;
-
-- height: Window.height;
-- width: Window.width;
-+ height: Window.height / Screen.devicePixelRatio;
-+ width: Window.width / Screen.devicePixelRatio;
- fillMode: Image.PreserveAspectFit;
- }
-
-
diff --git a/kde/patch/spectacle/spectacle_rect_capture.patch b/kde/patch/spectacle/spectacle_rect_capture.patch
deleted file mode 100644
index 8556674..0000000
--- a/kde/patch/spectacle/spectacle_rect_capture.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Boudhayan Gupta <me@BaloneyGeek.com>
-Date: Mon, 25 Apr 2016 18:27:49 +0000
-Subject: Unbreak rectangular image grabs for nvidia users.
-X-Git-Url: http://quickgit.kde.org/?p=spectacle.git&a=commitdiff&h=abbbe6d13de870f9e9349acc2542cffc5d41b76d
----
-Unbreak rectangular image grabs for nvidia users.
-
-BUG: 362241
-FIXED-IN: 16.04.1
-Patch rebased for Slackware (did not apply cleanly)
----
-
-
-diff -uar spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.cpp spectacle-16.04.0/src/QuickEditor/QuickEditor.cpp
---- spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.cpp 2016-04-13 18:54:34.000000000 +0200
-+++ spectacle-16.04.0/src/QuickEditor/QuickEditor.cpp 2016-05-02 12:25:49.554524405 +0200
-@@ -138,23 +138,6 @@
- d->mGrabRect = QRect(x, y, width, height);
- SpectacleConfig::instance()->setCropRegion(d->mGrabRect);
-
-- QQuickItem *target = d->mQuickView->rootObject()->findChild<QQuickItem *>(QStringLiteral("imageBackground"));
-- d->mCurrentGrabResult = target->grabToImage();
-- if (d->mCurrentGrabResult.isNull()) {
-- emit grabCancelled();
-- return;
-- }
--
-- connect(d->mCurrentGrabResult.data(), &QQuickItemGrabResult::ready, this, &QuickEditor::grabReadyHandler);
--}
--
--void QuickEditor::grabReadyHandler()
--{
-- Q_D(QuickEditor);
--
-- QImage croppedImage = d->mCurrentGrabResult->image().copy(d->mGrabRect);
-- QPixmap croppedPixmap = QPixmap::fromImage(croppedImage);
--
- d->mQuickView->hide();
-- emit grabDone(croppedPixmap, d->mGrabRect);
-+ emit grabDone(mImageStore->mPixmap.copy(d->mGrabRect), d->mGrabRect);
- }
-diff -uar spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.h spectacle-16.04.0/src/QuickEditor/QuickEditor.h
---- spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.h 2016-04-13 18:54:34.000000000 +0200
-+++ spectacle-16.04.0/src/QuickEditor/QuickEditor.h 2016-05-02 12:22:48.124516811 +0200
-@@ -39,7 +39,6 @@
- private slots:
-
- void acceptImageHandler(int x, int y, int width, int height);
-- void grabReadyHandler();
-
- private:
-
diff --git a/kde/patch/strigi-multimedia.patch b/kde/patch/strigi-multimedia.patch
index aebad0d..77b9424 100644
--- a/kde/patch/strigi-multimedia.patch
+++ b/kde/patch/strigi-multimedia.patch
@@ -1,3 +1,2 @@
# Fix build:
cat $CWD/patch/strigi-multimedia/strigi-multimedia_port.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/umbrello.patch b/kde/patch/umbrello.patch
deleted file mode 100644
index 641688c..0000000
--- a/kde/patch/umbrello.patch
+++ /dev/null
@@ -1,10 +0,0 @@
-# Fix compilation error (undefined listitem in classifierlistpage.cpp)
-# Fixed post KDE 4.11.4 in
-# http://quickgit.kde.org/?p=umbrello.git&a=commit&h=5f9f6a68716a8aced2c5f962247d9b05b326fcf5
-#cat $CWD/patch/umbrello/umbrello-4.11.4_listitem.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix compilation error "specialization of template<class T> struct QMetaTypeId in different namespace [-fpermissive]".
-# Fixed in Applications 18.12.0
-# https://cgit.kde.org/umbrello.git/patch/?id=62a9e5e6afdd920779f1211afb0381857659e578
-#cat $CWD/patch/umbrello/umbrello_qt510_kaboutdata_h.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/umbrello/umbrello-4.11.4_listitem.patch b/kde/patch/umbrello/umbrello-4.11.4_listitem.patch
deleted file mode 100644
index f5cb615..0000000
--- a/kde/patch/umbrello/umbrello-4.11.4_listitem.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/umbrello/dialogs/classifierlistpage.cpp
-+++ b/umbrello/dialogs/classifierlistpage.cpp
-@@ -346,7 +346,7 @@
- }
-
- if (itemIndex >= 0 && (itemIndex < getItemList().size())) {
-- listItem = getItemList().at( itemIndex );
-+ UMLClassifierListItem* listItem = getItemList().at( itemIndex );
-
- //now update screen
- m_docTE->setText( listItem->doc() );
-
-
diff --git a/kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch b/kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch
deleted file mode 100644
index a27b0ed..0000000
--- a/kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 62a9e5e6afdd920779f1211afb0381857659e578 Mon Sep 17 00:00:00 2001
-From: Ralf Habacker <ralf.habacker@freenet.de>
-Date: Thu, 6 Dec 2018 13:36:34 +0100
-Subject: Fix KDE CI compile error with Qt 5.10 on linux
-
-The error was "specialization of template<class T>
-struct QMetaTypeId in different namespace [-fpermissive]"
-
-The Qt 5.10 related issue is fixed by using another approach
-to exclude KF5 class KAboutData.
----
- umbrello/main.cpp | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/umbrello/main.cpp b/umbrello/main.cpp
-index e3315fa..9d2acd8 100644
---- a/umbrello/main.cpp
-+++ b/umbrello/main.cpp
-@@ -19,9 +19,8 @@
-
- // kde includes
- #if QT_VERSION > 0x050000
--namespace dummy {
--#include <kaboutdata.h>
--}
-+// prevent including of <kaboutdata.h>
-+#define KABOUTDATA_H
- #include <k4aboutdata.h>
- #define KAboutData K4AboutData
- #include <KCrash>
---
-cgit v0.11.2
-
diff --git a/kde/slack-desc/akonadi b/kde/slack-desc/akonadi
index 14a0d1b..f0c8da9 100644
--- a/kde/slack-desc/akonadi
+++ b/kde/slack-desc/akonadi
@@ -13,7 +13,7 @@ akonadi: and meta data providing concurrent read, write, and query access.
akonadi: It will provide a unique desktop wide object identification and
akonadi: retrieval.
akonadi:
+akonadi: Homepage: http://www.kdepim.org/akonadi/
akonadi:
akonadi:
-akonadi: Homepage: http://www.kdepim.org/akonadi/
akonadi:
diff --git a/kde/slack-desc/akonadi-calendar b/kde/slack-desc/akonadi-calendar
index 712ec19..5a8b58f 100644
--- a/kde/slack-desc/akonadi-calendar
+++ b/kde/slack-desc/akonadi-calendar
@@ -15,5 +15,5 @@ akonadi-calendar:
akonadi-calendar:
akonadi-calendar:
akonadi-calendar:
-akonadi-calendar: Home page: http://www.kde.org/
+akonadi-calendar:
akonadi-calendar:
diff --git a/kde/slack-desc/akonadi-calendar-tools b/kde/slack-desc/akonadi-calendar-tools
index e018173..dead865 100644
--- a/kde/slack-desc/akonadi-calendar-tools
+++ b/kde/slack-desc/akonadi-calendar-tools
@@ -15,5 +15,5 @@ akonadi-calendar-tools:
akonadi-calendar-tools:
akonadi-calendar-tools:
akonadi-calendar-tools:
-akonadi-calendar-tools: Home page: http://www.kde.org/
+akonadi-calendar-tools:
akonadi-calendar-tools:
diff --git a/kde/slack-desc/akonadi-contacts b/kde/slack-desc/akonadi-contacts
index 872802c..068b9f9 100644
--- a/kde/slack-desc/akonadi-contacts
+++ b/kde/slack-desc/akonadi-contacts
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-contacts: akonadi-contacts (implement contact management in akonadi)
akonadi-contacts:
-akonadi-contacts: akonadi-contacts contains libraries and daemons to implement
-akonadi-contacts: Contact Management in Akonadi.
+akonadi-contacts: akonadi-contacts contains libraries and daemons to implement Contact
+akonadi-contacts: Management in Akonadi.
+akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
-akonadi-contacts: Home page: http://www.kde.org/
akonadi-contacts:
diff --git a/kde/slack-desc/akonadi-import-wizard b/kde/slack-desc/akonadi-import-wizard
index 4f0e90a..83d47e8 100644
--- a/kde/slack-desc/akonadi-import-wizard
+++ b/kde/slack-desc/akonadi-import-wizard
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-akonadi-import-wizard: akonadi-import-wizard (import data from other mail clients to KMail)
+akonadi-import-wizard: akonadi-import-wizard (import data to KMail)
akonadi-import-wizard:
akonadi-import-wizard: Import data from other mail clients to KMail.
akonadi-import-wizard:
@@ -15,5 +15,5 @@ akonadi-import-wizard:
akonadi-import-wizard:
akonadi-import-wizard:
akonadi-import-wizard:
-akonadi-import-wizard: Home page: http://www.kde.org/
+akonadi-import-wizard:
akonadi-import-wizard:
diff --git a/kde/slack-desc/akonadi-mime b/kde/slack-desc/akonadi-mime
index 80aa41d..295f57a 100644
--- a/kde/slack-desc/akonadi-mime
+++ b/kde/slack-desc/akonadi-mime
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-mime: akonadi-mime (implement mimeing in akonadi)
akonadi-mime:
-akonadi-mime: akonadi-mime contains libraries and daemons to implement
-akonadi-mime: basic email handling in Akonadi.
+akonadi-mime: akonadi-mime contains libraries and daemons to implement basic email
+akonadi-mime: handling in Akonadi.
+akonadi-mime:
akonadi-mime:
akonadi-mime:
akonadi-mime:
akonadi-mime:
akonadi-mime:
-akonadi-mime: Home page: http://www.kde.org/
akonadi-mime:
diff --git a/kde/slack-desc/akonadi-notes b/kde/slack-desc/akonadi-notes
index 2893b64..d9be735 100644
--- a/kde/slack-desc/akonadi-notes
+++ b/kde/slack-desc/akonadi-notes
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-notes: akonadi-notes (implement management of notes in akonadi)
akonadi-notes:
-akonadi-notes: akonadi-notes contains libraries and daemons to implement
-akonadi-notes: management of notes in Akonadi.
+akonadi-notes: akonadi-notes contains libraries and daemons to implement management
+akonadi-notes: of notes in Akonadi.
+akonadi-notes:
akonadi-notes:
akonadi-notes:
akonadi-notes:
akonadi-notes:
akonadi-notes:
-akonadi-notes: Home page: http://www.kde.org/
akonadi-notes:
diff --git a/kde/slack-desc/akonadi-search b/kde/slack-desc/akonadi-search
index 9d345b4..86a1e69 100644
--- a/kde/slack-desc/akonadi-search
+++ b/kde/slack-desc/akonadi-search
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-search: akonadi-search (implement searching in akonadi)
akonadi-search:
-akonadi-search: akonadi-search contains libraries and daemons to implement
-akonadi-search: searching in Akonadi.
+akonadi-search: akonadi-search contains libraries and daemons to implement searching
+akonadi-search: in Akonadi.
+akonadi-search:
akonadi-search:
akonadi-search:
akonadi-search:
akonadi-search:
akonadi-search:
-akonadi-search: Home page: http://www.kde.org/
akonadi-search:
diff --git a/kde/slack-desc/akonadiconsole b/kde/slack-desc/akonadiconsole
index 9ac1808..cb08cb3 100644
--- a/kde/slack-desc/akonadiconsole
+++ b/kde/slack-desc/akonadiconsole
@@ -15,5 +15,5 @@ akonadiconsole:
akonadiconsole:
akonadiconsole:
akonadiconsole:
-akonadiconsole: Home page: http://www.kde.org/
+akonadiconsole:
akonadiconsole:
diff --git a/kde/slack-desc/akregator b/kde/slack-desc/akregator
index b3b466a..b4e46c4 100644
--- a/kde/slack-desc/akregator
+++ b/kde/slack-desc/akregator
@@ -15,5 +15,5 @@ akregator:
akregator:
akregator:
akregator:
-akregator: Home page: http://www.kde.org/
+akregator:
akregator:
diff --git a/kde/slack-desc/alkimia b/kde/slack-desc/alkimia
index 9230682..803af97 100644
--- a/kde/slack-desc/alkimia
+++ b/kde/slack-desc/alkimia
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-alkimia: alkimia (Library used by KDE Finance applications)
+alkimia: alkimia (KDE Finance library)
alkimia:
alkimia: Alkimia is a library used by KDE Finance applications, like Kmymoney.
alkimia:
@@ -15,5 +15,5 @@ alkimia:
alkimia:
alkimia:
alkimia:
-alkimia: Home page: http://www.kde.org/
+alkimia:
alkimia:
diff --git a/kde/slack-desc/analitza b/kde/slack-desc/analitza
index 84123be..793ac3a 100644
--- a/kde/slack-desc/analitza
+++ b/kde/slack-desc/analitza
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-analitza: analitza (library to add mathematical features to programs)
+analitza: analitza (KDE mathematical library)
analitza:
analitza: The analitza library will let you add mathematical features
analitza: to your program.
diff --git a/kde/slack-desc/ark b/kde/slack-desc/ark
index 93dd1c8..89db562 100644
--- a/kde/slack-desc/ark
+++ b/kde/slack-desc/ark
@@ -10,7 +10,7 @@ ark: ark (KDE archiver tool)
ark:
ark: This is KDE's application to work with compressed archives.
ark:
-ark: Ark's home page is: http://kde.org
+ark:
ark:
ark:
ark:
diff --git a/kde/slack-desc/artikulate b/kde/slack-desc/artikulate
index be00419..36479ff 100644
--- a/kde/slack-desc/artikulate
+++ b/kde/slack-desc/artikulate
@@ -9,11 +9,11 @@
artikulate: artikulate (pronunciation trainer)
artikulate:
artikulate: Artikulate is a pronunciation trainer, which helps in improving and
-artikulate: perfecting pronunciation skills. Learners train their pronunciation
+artikulate: perfecting pronunciation skills. Learners train their pronunciation
artikulate: by recording their own voices and comparing them to native speaker
-artikulate: recordings.
-artikulate: Artikulate is part of the KDE Education Project.
+artikulate: recordings. Artikulate is part of the KDE Education Project.
+artikulate:
+artikulate:
artikulate:
artikulate:
-artikulate: For more information, visit: http://www.kde.org
artikulate:
diff --git a/kde/slack-desc/attica-framework b/kde/slack-desc/attica-framework
index ad9b478..36d9080 100644
--- a/kde/slack-desc/attica-framework
+++ b/kde/slack-desc/attica-framework
@@ -16,4 +16,4 @@ attica-framework:
attica-framework:
attica-framework:
attica-framework:
-attica-framework: Homepage: http://kde.org/
+attica-framework:
diff --git a/kde/slack-desc/audiocd-kio b/kde/slack-desc/audiocd-kio
index a82bd28..56e1944 100644
--- a/kde/slack-desc/audiocd-kio
+++ b/kde/slack-desc/audiocd-kio
@@ -15,5 +15,5 @@ audiocd-kio:
audiocd-kio:
audiocd-kio:
audiocd-kio:
-audiocd-kio: For more information, visit: http://www.kde.org
+audiocd-kio:
audiocd-kio:
diff --git a/kde/slack-desc/baloo5 b/kde/slack-desc/baloo5
index d275b83..d4ffebd 100644
--- a/kde/slack-desc/baloo5
+++ b/kde/slack-desc/baloo5
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
baloo5: baloo5 (framework for searching and managing metadata)
baloo5:
-baloo5: Baloo is a framework for searching and managing metadata.
-baloo5: Baloo focuses on providing a very small memory footprint along
-baloo5: with with extremely fast searching.
-baloo5: It also supports storing additional file based metadata via
-baloo5: extended attributes.
+baloo5: Baloo is a framework for searching and managing metadata. Baloo
+baloo5: focuses on providing a very small memory footprint along with
+baloo5: extremely fast searching. It also supports storing additional file
+baloo5: based metadata via extended attributes.
+baloo5:
+baloo5:
baloo5:
baloo5:
-baloo5: For more information, visit: http://www.kde.org
baloo5:
diff --git a/kde/slack-desc/baloo5-widgets b/kde/slack-desc/baloo5-widgets
index e4d4a86..010def6 100644
--- a/kde/slack-desc/baloo5-widgets
+++ b/kde/slack-desc/baloo5-widgets
@@ -9,11 +9,11 @@
baloo5-widgets: baloo5-widgets (widgets for baloo)
baloo5-widgets:
baloo5-widgets: Baloo is a framework for searching and managing metadata.
-baloo5-widgets: Balooo-widgets contains widgets for use with Baloo.
+baloo5-widgets: Baloo5-widgets contains widgets for use with Baloo.
+baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
-baloo5-widgets: For more information, visit: http://www.kde.org
baloo5-widgets:
diff --git a/kde/slack-desc/blinken b/kde/slack-desc/blinken
index 72773dd..edcb442 100644
--- a/kde/slack-desc/blinken
+++ b/kde/slack-desc/blinken
@@ -10,7 +10,7 @@ blinken: blinken (a memory enhancement game)
blinken:
blinken: Blinken is a memory enhancement game for KDE.
blinken:
-blinken: For more information, visit: http://edu.kde.org/
+blinken:
blinken:
blinken:
blinken:
diff --git a/kde/slack-desc/bluez-qt b/kde/slack-desc/bluez-qt
index 2848c69..bae4410 100644
--- a/kde/slack-desc/bluez-qt
+++ b/kde/slack-desc/bluez-qt
@@ -9,11 +9,11 @@
bluez-qt: bluez-qt (Qt wrapper for BlueZ 5 DBus API)
bluez-qt:
bluez-qt: BluezQt is a library for communication with BlueZ system and session
-bluez-qt: daemons.
-bluez-qt: * Manager class is used to communicate with system daemon
-bluez-qt: - org.bluez
-bluez-qt: * ObexManager class is used to communicate with session daemon
-bluez-qt: - org.bluez.obex
+bluez-qt: daemons. Manager class is used to communicate with system daemon
+bluez-qt: org.bluez. ObexManager class is used to communicate with session
+bluez-qt: daemon org.bluez.obex.
bluez-qt:
bluez-qt: Homepage: https://projects.kde.org/projects/frameworks/bluez-qt
bluez-qt:
+bluez-qt:
+bluez-qt:
diff --git a/kde/slack-desc/bomber b/kde/slack-desc/bomber
index cae9a73..2777aea 100644
--- a/kde/slack-desc/bomber
+++ b/kde/slack-desc/bomber
@@ -9,11 +9,11 @@
bomber: bomber (arcade bombing game for KDE)
bomber:
bomber: Bomber is a single player arcade game. The player is invading various
-bomber: cities in a plane that is decreasing in height. The goal of the game
-bomber: is to destroy all the buildings and advance to the next level.
-bomber: Each level gets a bit harder by increasing the speed of the plane
-bomber: and the height of the buildings.
+bomber: cities in a plane that is decreasing in height. The goal of the game
+bomber: is to destroy all the buildings and advance to the next level. Each
+bomber: level gets a bit harder by increasing the speed of the plane and the
+bomber: height of the buildings.
+bomber:
bomber:
bomber:
-bomber: For more information, visit: http://www.kde.org
bomber:
diff --git a/kde/slack-desc/bovo b/kde/slack-desc/bovo
index 8ccebb3..508eda9 100644
--- a/kde/slack-desc/bovo
+++ b/kde/slack-desc/bovo
@@ -10,10 +10,10 @@ bovo: bovo (five-in-a-row board game)
bovo:
bovo: Bovo is a Gomoku ("five points" in Japanese) like game for two
bovo: players, where the opponents alternate in placing their respective
-bovo: pictogram on the game board. Also known as: Connect Five,
-bovo: Five in a row, X and O, Naughts and Crosses.
+bovo: pictogram on the game board. Also known as: Connect Five, Five in a
+bovo: row, X and O, Naughts and Crosses.
+bovo:
bovo:
bovo:
bovo:
-bovo: For more information, visit: http://www.kde.org
bovo:
diff --git a/kde/slack-desc/breeze b/kde/slack-desc/breeze
index 6c30973..91c3779 100644
--- a/kde/slack-desc/breeze
+++ b/kde/slack-desc/breeze
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
breeze: breeze (artwork for Plasma)
breeze:
-breeze: Artwork, styles and assets for the Breeze visual style for
-breeze: the Plasma Desktop.
+breeze: Artwork, styles and assets for the Breeze visual style for the Plasma
+breeze: Desktop.
+breeze:
breeze:
breeze:
breeze:
breeze:
breeze:
breeze:
-breeze: Homepage: http://kde.org/
diff --git a/kde/slack-desc/breeze-grub b/kde/slack-desc/breeze-grub
index 34daf09..b4c5095 100644
--- a/kde/slack-desc/breeze-grub
+++ b/kde/slack-desc/breeze-grub
@@ -15,5 +15,5 @@ breeze-grub:
breeze-grub:
breeze-grub:
breeze-grub:
-breeze-grub: For more information, visit: http://www.kde.org
+breeze-grub:
breeze-grub:
diff --git a/kde/slack-desc/breeze-gtk b/kde/slack-desc/breeze-gtk
index f81c0ca..c4c2ed5 100644
--- a/kde/slack-desc/breeze-gtk
+++ b/kde/slack-desc/breeze-gtk
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':' except on otherwise blank lines.
- |-----handy-ruler------------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
breeze-gtk: breeze-gtk (Breeze widget theme for GTK 2 and 3)
breeze-gtk:
breeze-gtk: Breeze widget theme for GTK 2 and 3.
@@ -16,4 +16,4 @@ breeze-gtk:
breeze-gtk:
breeze-gtk:
breeze-gtk:
-breeze-gtk: Homepage: http://kde.org/
+breeze-gtk:
diff --git a/kde/slack-desc/breeze-icons b/kde/slack-desc/breeze-icons
index 3c8788d..a23df6f 100644
--- a/kde/slack-desc/breeze-icons
+++ b/kde/slack-desc/breeze-icons
@@ -10,10 +10,10 @@ breeze-icons: breeze-icons (Breeze icon themes for KDE Plasma)
breeze-icons:
breeze-icons: Breeze icon themes for KDE Plasma.
breeze-icons:
+breeze-icons: For more information, visit:
+breeze-icons: https://projects.kde.org/projects/kde/workspace/breeze
breeze-icons:
breeze-icons:
breeze-icons:
breeze-icons:
-breeze-icons: For more information, visit:
-breeze-icons: https://projects.kde.org/projects/kde/workspace/breeze
breeze-icons:
diff --git a/kde/slack-desc/calendarsupport b/kde/slack-desc/calendarsupport
index e868865..4bd87a4 100644
--- a/kde/slack-desc/calendarsupport
+++ b/kde/slack-desc/calendarsupport
@@ -15,5 +15,5 @@ calendarsupport:
calendarsupport:
calendarsupport:
calendarsupport:
-calendarsupport: Home page: http://www.kde.org/
+calendarsupport:
calendarsupport:
diff --git a/kde/slack-desc/calligra b/kde/slack-desc/calligra
index a1f5261..fbce9db 100644
--- a/kde/slack-desc/calligra
+++ b/kde/slack-desc/calligra
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
calligra: calligra (KDE office productivity suite)
calligra:
-calligra: Calligra office productivity applications. Included are a word
+calligra: Calligra office productivity applications. Included are a word
calligra: processor, spreadsheet, presentation program, chart and graph creator,
calligra: vector graphics tool, database report creator, flowcharting program,
-calligra: integrated data management program, a pixel graphics editor,
-calligra: a mathematical formula editor, and Calligra Workspace
-calligra: (a combination of all of the above).
+calligra: integrated data management program, a pixel graphics editor, a
+calligra: mathematical formula editor, and Calligra Workspace (a combination of
+calligra: all of the above).
calligra:
-calligra: For more information, see: http://calligra-suite.org/
+calligra: Homepage: http://calligra-suite.org/
calligra:
diff --git a/kde/slack-desc/calligraplan b/kde/slack-desc/calligraplan
index f092af2..cb3e4d6 100644
--- a/kde/slack-desc/calligraplan
+++ b/kde/slack-desc/calligraplan
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
calligraplan: calligraplan (project planner)
calligraplan:
-calligraplan: Calligra Plan is a project management application.
-calligraplan: It is intended for managing moderately large projects
-calligraplan: with multiple resources.
+calligraplan: Calligra Plan is a project management application. It is intended for
+calligraplan: managing moderately large projects with multiple resources.
+calligraplan:
+calligraplan: Homepage: http://www.calligra-suite.org/
calligraplan:
calligraplan:
calligraplan:
calligraplan:
-calligraplan: Home page: http://www.calligra-suite.org/
calligraplan:
diff --git a/kde/slack-desc/cantor b/kde/slack-desc/cantor
index 34cf867..7e9e65e 100644
--- a/kde/slack-desc/cantor
+++ b/kde/slack-desc/cantor
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
cantor: cantor (front-end to mathematics software)
cantor:
-cantor: Cantor is a frontend to several existing mathematical software
-cantor: such as R, Sage and Maxima: Cantor.
-cantor: Cantor offers a worksheet as a nice GUI for all those backends
-cantor: and is not targeted to kids but to scientists.
+cantor: Cantor is a frontend to several existing mathematical software such as
+cantor: R, Sage and Maxima. Cantor offers a worksheet as a nice GUI for all
+cantor: those backends and is not targeted to kids but to scientists.
+cantor:
+cantor:
cantor:
-cantor: For more information, visit: http://edu.kde.org/
cantor:
cantor:
cantor:
diff --git a/kde/slack-desc/cervisia b/kde/slack-desc/cervisia
index 2f6de97..141da3d 100644
--- a/kde/slack-desc/cervisia
+++ b/kde/slack-desc/cervisia
@@ -15,5 +15,5 @@ cervisia:
cervisia:
cervisia:
cervisia:
-cervisia: For more information, visit: http://www.kde.org
+cervisia:
cervisia:
diff --git a/kde/slack-desc/digikam b/kde/slack-desc/digikam
index 607801e..0f1c812 100644
--- a/kde/slack-desc/digikam
+++ b/kde/slack-desc/digikam
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
-digikam: digiKam (KDE Photo Management Application)
+ |-----handy-ruler------------------------------------------------------|
+digikam: digikam (KDE Photo Management Application)
digikam:
digikam: digiKam is a simple digital photo management application for KDE,
-digikam: which makes importing and organizing digital photos a "snap". The
-digikam: photos can be organized in albums which can be sorted
-digikam: chronologically, by directory layout, or by custom collections. An
-digikam: easy to use interface enables you to connect to your camera and
-digikam: preview, download, and/or delete your images.
+digikam: which makes importing and organizing digital photos a snap. The photos
+digikam: can be organized in albums which can be sorted chronologically, by
+digikam: directory layout, or by custom collections. An easy to use interface
+digikam: enables you to connect to your camera and preview, download, and/or
+digikam: delete your images.
digikam:
digikam: Homepage: http://www.digikam.org/
digikam:
diff --git a/kde/slack-desc/discover b/kde/slack-desc/discover
index 6d659c5..7f11c78 100644
--- a/kde/slack-desc/discover
+++ b/kde/slack-desc/discover
@@ -10,10 +10,10 @@ discover: discover (KDE package management tools)
discover:
discover: A collection of package management tools for KDE.
discover:
+discover: For more information, visit:
+discover: https://projects.kde.org/projects/kde/workspace/discover
discover:
discover:
discover:
discover:
-discover: For more information, visit:
-discover: https://projects.kde.org/projects/kde/workspace/discover
discover:
diff --git a/kde/slack-desc/dolphin b/kde/slack-desc/dolphin
index 27d3b1e..99a5173 100644
--- a/kde/slack-desc/dolphin
+++ b/kde/slack-desc/dolphin
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
dolphin: dolphin (KDE file manager)
dolphin:
-dolphin: Dolphin is a lightweight file manager.
-dolphin: It has been designed with ease of use and simplicity in mind,
-dolphin: while still allowing flexibility and customisation.
+dolphin: Dolphin is a lightweight file manager. It has been designed with ease
+dolphin: of use and simplicity in mind, while still allowing flexibility and
+dolphin: customization.
dolphin:
+dolphin: Homepage: https://www.kde.org/applications/system/dolphin/
dolphin:
dolphin:
dolphin:
-dolphin: For more information, visit https://www.kde.org/applications/system/dolphin/
dolphin:
diff --git a/kde/slack-desc/dolphin-plugins b/kde/slack-desc/dolphin-plugins
index ef2c5b1..5309de8 100644
--- a/kde/slack-desc/dolphin-plugins
+++ b/kde/slack-desc/dolphin-plugins
@@ -15,5 +15,5 @@ dolphin-plugins:
dolphin-plugins:
dolphin-plugins:
dolphin-plugins:
-dolphin-plugins: For more information, visit: http://www.kde.org
+dolphin-plugins:
dolphin-plugins:
diff --git a/kde/slack-desc/dragon b/kde/slack-desc/dragon
index 115fda1..b9b2002 100644
--- a/kde/slack-desc/dragon
+++ b/kde/slack-desc/dragon
@@ -9,11 +9,11 @@
dragon: dragon (KDE multimedia player)
dragon:
dragon: Dragon Player is a multimedia player where the focus is on simplicity,
-dragon: instead of features. Dragon Player does one thing, and only one
+dragon: instead of features. Dragon Player does one thing, and only one
dragon: thing, which is playing multimedia files.
dragon:
dragon:
dragon:
dragon:
-dragon: For more information, visit: http://www.kde.org
+dragon:
dragon:
diff --git a/kde/slack-desc/drkonqi b/kde/slack-desc/drkonqi
index 7469ce6..abdec03 100644
--- a/kde/slack-desc/drkonqi
+++ b/kde/slack-desc/drkonqi
@@ -15,5 +15,5 @@ drkonqi:
drkonqi:
drkonqi:
drkonqi:
-drkonqi: Home page: http://www.kde.org/
+drkonqi:
drkonqi:
diff --git a/kde/slack-desc/elisa b/kde/slack-desc/elisa
index 0d2e502..b17d990 100644
--- a/kde/slack-desc/elisa
+++ b/kde/slack-desc/elisa
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
elisa: elisa (music player)
elisa:
-elisa: Elisa is a simple music player that should be easy to use.
-elisa: It does not require any configuration before one can use it.
+elisa: Elisa is a simple music player that should be easy to use. It does not
+elisa: require any configuration before one can use it.
elisa:
+elisa: Homepage: https://community.kde.org/Elisa
elisa:
elisa:
elisa:
elisa:
-elisa: Home page: https://community.kde.org/Elisa
elisa:
diff --git a/kde/slack-desc/eventviews b/kde/slack-desc/eventviews
index e21a2d9..d9c2a08 100644
--- a/kde/slack-desc/eventviews
+++ b/kde/slack-desc/eventviews
@@ -15,5 +15,5 @@ eventviews:
eventviews:
eventviews:
eventviews:
-eventviews: Home page: http://www.kde.org/
+eventviews:
eventviews:
diff --git a/kde/slack-desc/extra-cmake-modules b/kde/slack-desc/extra-cmake-modules
index 6fdc90c..265838b 100644
--- a/kde/slack-desc/extra-cmake-modules
+++ b/kde/slack-desc/extra-cmake-modules
@@ -6,10 +6,10 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-extra-cmake-modules: CMake extra modules (extra cmake modules for compiling KDE Frameworks
+extra-cmake-modules: extra-cmake-modules (extra KDE CMake modules)
extra-cmake-modules:
-extra-cmake-modules: This package contains additional cmake modules required for
-extra-cmake-modules: compiling KDE Frameworks 5.
+extra-cmake-modules: This package contains additional CMake modules required for compiling
+extra-cmake-modules: KDE Frameworks 5.
extra-cmake-modules:
extra-cmake-modules:
extra-cmake-modules:
diff --git a/kde/slack-desc/falkon b/kde/slack-desc/falkon
index 14cf33e..ecac825 100644
--- a/kde/slack-desc/falkon
+++ b/kde/slack-desc/falkon
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-falkon: falkon (short description here)
+falkon: falkon (KDE web browser)
falkon:
falkon: Falkon is a QtWebEngine based cross-platform web browser.
falkon:
@@ -15,5 +15,5 @@ falkon:
falkon:
falkon:
falkon:
-falkon: Home page: http://www.kde.org/
+falkon:
falkon:
diff --git a/kde/slack-desc/ffmpegthumbs b/kde/slack-desc/ffmpegthumbs
index 6ff665f..54f96f4 100644
--- a/kde/slack-desc/ffmpegthumbs
+++ b/kde/slack-desc/ffmpegthumbs
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ffmpegthumbs: ffmpegthumbs (video thumbnail generator using ffmpeg)
ffmpegthumbs:
-ffmpegthumbs: FFMpegThumbs is a video thumbnail generator for KDE file managers
-ffmpegthumbs: like Dolphin and Konqueror. It enables them to show preview
-ffmpegthumbs: images of video files using FFMpeg.
+ffmpegthumbs: FFMpegThumbs is a video thumbnail generator for KDE file managers like
+ffmpegthumbs: Dolphin and Konqueror. It enables them to show preview images of
+ffmpegthumbs: video files using FFMpeg.
+ffmpegthumbs:
ffmpegthumbs:
ffmpegthumbs:
ffmpegthumbs:
ffmpegthumbs:
-ffmpegthumbs: For more information, visit: http://www.kde.org
ffmpegthumbs:
diff --git a/kde/slack-desc/filelight b/kde/slack-desc/filelight
index f86e2f0..bef21ee 100644
--- a/kde/slack-desc/filelight
+++ b/kde/slack-desc/filelight
@@ -11,7 +11,7 @@ filelight:
filelight: Filelight allows you to quickly understand exactly where your
filelight: diskspace is being used by graphically representing your file system.
filelight:
-filelight: filelight's home page is: http://utils.kde.org/projects/filelight
+filelight: Homepage: http://utils.kde.org/projects/filelight
filelight:
filelight:
filelight:
diff --git a/kde/slack-desc/frameworkintegration b/kde/slack-desc/frameworkintegration
index da17f75..815225c 100644
--- a/kde/slack-desc/frameworkintegration
+++ b/kde/slack-desc/frameworkintegration
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-frameworkintegration: frameworkintegration (applications integration with KDE Workspaces)
+frameworkintegration: frameworkintegration (applications integration with KDE)
frameworkintegration:
frameworkintegration: Framework providing components to allow applications to integrate
frameworkintegration: with a KDE Workspace.
frameworkintegration:
+frameworkintegration: Homepage: https://community.kde.org/Frameworks
frameworkintegration:
frameworkintegration:
frameworkintegration:
frameworkintegration:
-frameworkintegration: Homepage: https://community.kde.org/Frameworks
frameworkintegration:
diff --git a/kde/slack-desc/granatier b/kde/slack-desc/granatier
index 6eb3695..646b7ee 100644
--- a/kde/slack-desc/granatier
+++ b/kde/slack-desc/granatier
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
granatier: granatier (bomberman clone for KDE)
granatier:
-granatier: Granatier is a clone of the classic Bomberman game, inspired by
-granatier: the work of the Clanbomber clone.
+granatier: Granatier is a clone of the classic Bomberman game, inspired by the
+granatier: work of the Clanbomber clone.
+granatier:
granatier:
granatier:
granatier:
granatier:
granatier:
-granatier: For more information, visit: http://www.kde.org
granatier:
diff --git a/kde/slack-desc/grantlee-editor b/kde/slack-desc/grantlee-editor
index 9ef75e7..71b375c 100644
--- a/kde/slack-desc/grantlee-editor
+++ b/kde/slack-desc/grantlee-editor
@@ -15,5 +15,5 @@ grantlee-editor:
grantlee-editor:
grantlee-editor:
grantlee-editor:
-grantlee-editor: Home page: http://www.kde.org/
+grantlee-editor:
grantlee-editor:
diff --git a/kde/slack-desc/grantleetheme b/kde/slack-desc/grantleetheme
index 0364e1f..4a9edb4 100644
--- a/kde/slack-desc/grantleetheme
+++ b/kde/slack-desc/grantleetheme
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-grantleetheme: grantleetheme (library for Grantlee theming support)
+grantleetheme: grantleetheme (Grantlee theming support)
grantleetheme:
grantleetheme: grantleetheme is a library for Grantlee theming support.
grantleetheme:
@@ -15,5 +15,5 @@ grantleetheme:
grantleetheme:
grantleetheme:
grantleetheme:
-grantleetheme: Home page: http://www.kde.org/
+grantleetheme:
grantleetheme:
diff --git a/kde/slack-desc/gwenview b/kde/slack-desc/gwenview
index bc56b12..73cc58d 100644
--- a/kde/slack-desc/gwenview
+++ b/kde/slack-desc/gwenview
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
gwenview: gwenview (image viewer for KDE)
gwenview:
-gwenview: Gwenview is a simple image viewer for KDE. It features a folder tree
+gwenview: Gwenview is a simple image viewer for KDE. It features a folder tree
gwenview: window and a file list window, providing easy navigation of your file
gwenview: hierarchy.
gwenview:
-gwenview: For more information, visit: http://www.kde.org
+gwenview:
gwenview:
gwenview:
gwenview:
diff --git a/kde/slack-desc/incidenceeditor b/kde/slack-desc/incidenceeditor
index d3929c2..67050f5 100644
--- a/kde/slack-desc/incidenceeditor
+++ b/kde/slack-desc/incidenceeditor
@@ -15,5 +15,5 @@ incidenceeditor:
incidenceeditor:
incidenceeditor:
incidenceeditor:
-incidenceeditor: Home page: http://www.kde.org/
+incidenceeditor:
incidenceeditor:
diff --git a/kde/slack-desc/juk b/kde/slack-desc/juk
index bad97bd..1830bd6 100644
--- a/kde/slack-desc/juk
+++ b/kde/slack-desc/juk
@@ -9,11 +9,11 @@
juk: juk (audio jukebox application)
juk:
juk: JuK is an audio jukebox application, supporting collections of MP3,
-juk: Ogg Vorbis, and FLAC audio files. It allows you to edit the "tags"
-juk: of your audio files, and manage your collection and playlists.
-juk: It's main focus, in fact, is on music management.
+juk: Ogg Vorbis, and FLAC audio files. It allows you to edit the tags of
+juk: your audio files and manage your collection and playlists. In fact,
+juk: its main focus is on music management.
+juk:
juk:
juk:
juk:
-juk: For more information, visit: http://www.kde.org
juk:
diff --git a/kde/slack-desc/k3b b/kde/slack-desc/k3b
index 032bbb8..c3e71fc 100644
--- a/kde/slack-desc/k3b
+++ b/kde/slack-desc/k3b
@@ -15,5 +15,5 @@ k3b:
k3b: K3b was written by Sebastian Trueg, Thomas Froescher,
k3b: Christian Kvasny, and Klaus-Dieter Krannich.
k3b:
-k3b: For more information, visit: http://www.k3b.org
+k3b: Homepage: http://www.k3b.org
k3b:
diff --git a/kde/slack-desc/kaccounts-integration b/kde/slack-desc/kaccounts-integration
index 33d7857..dc1d35f 100644
--- a/kde/slack-desc/kaccounts-integration
+++ b/kde/slack-desc/kaccounts-integration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kaccounts-integration: kaccounts-integration (web account administration)
kaccounts-integration:
-kaccounts-integration: Tools to administer web accounts for the sites and services
-kaccounts-integration: across the KDE desktop, including:
-kaccounts-integration: Google, Facebook, Owncloud, IMAP, Jabber and others.
+kaccounts-integration: Tools to administer web accounts for the sites and services across the
+kaccounts-integration: KDE desktop, including Google, Facebook, Owncloud, IMAP, Jabber, and
+kaccounts-integration: others.
+kaccounts-integration:
kaccounts-integration:
kaccounts-integration:
kaccounts-integration:
kaccounts-integration:
-kaccounts-integration: For more information, visit: http://www.kde.org
kaccounts-integration:
diff --git a/kde/slack-desc/kaccounts-providers b/kde/slack-desc/kaccounts-providers
index 3818bcf..3c09475 100644
--- a/kde/slack-desc/kaccounts-providers
+++ b/kde/slack-desc/kaccounts-providers
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kaccounts-providers: kaccounts-providers (administer web accounts)
kaccounts-providers:
-kaccounts-providers: Tools to administer web accounts for the sites and services
-kaccounts-providers: across the KDE desktop, including:
-kaccounts-providers: Google, Facebook, Owncloud, IMAP, Jabber and others.
+kaccounts-providers: Tools to administer web accounts for the sites and services across the
+kaccounts-providers: KDE desktop, including Google, Facebook, Owncloud, IMAP, Jabber, and
+kaccounts-providers: others.
+kaccounts-providers:
kaccounts-providers:
kaccounts-providers:
kaccounts-providers:
kaccounts-providers:
-kaccounts-providers: For more information, visit: http://www.kde.org
kaccounts-providers:
diff --git a/kde/slack-desc/kactivities b/kde/slack-desc/kactivities
index 2ca504a..d82cbe5 100644
--- a/kde/slack-desc/kactivities
+++ b/kde/slack-desc/kactivities
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kactivities: kactivities (API for using and interacting with Activities)
+kactivities: kactivities (API for using Activities)
kactivities:
kactivities: API for using and interacting with Activities as a consumer,
-kactivities: application adding information to them or as an activity manager.
+kactivities: application adding information to them, or as an activity manager.
+kactivities:
kactivities:
-kactivities: For more information, visit: http://www.kde.org
kactivities:
kactivities:
kactivities:
diff --git a/kde/slack-desc/kactivities-framework b/kde/slack-desc/kactivities-framework
index c3a1bbc..9f27990 100644
--- a/kde/slack-desc/kactivities-framework
+++ b/kde/slack-desc/kactivities-framework
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kactivities-framework: kactivities-framework (API for using and interacting with Activities)
+kactivities-framework: kactivities-framework (API for using Activities)
kactivities-framework:
kactivities-framework: API for using and interacting with Activities as a consumer,
-kactivities-framework: application adding information to them or as an activity manager.
+kactivities-framework: application adding information to them, or as an activity manager.
+kactivities-framework:
kactivities-framework:
-kactivities-framework: For more information, visit: http://www.kde.org
kactivities-framework:
kactivities-framework:
kactivities-framework:
diff --git a/kde/slack-desc/kactivities-stats b/kde/slack-desc/kactivities-stats
index b2e2337..70e58db 100644
--- a/kde/slack-desc/kactivities-stats
+++ b/kde/slack-desc/kactivities-stats
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kactivities-stats: kactivities-stats (component of KDE activities)
+kactivities-stats: kactivities-stats (component of KDE Activities)
+kactivities-stats:
+kactivities-stats: kactivities-stats is library for accessing the usage data collected by
+kactivities-stats: the Activities system.
kactivities-stats:
-kactivities-stats: kactivities-stats is library for accessing the usage dat
-kactivities-stats:a collected by the activities system.
kactivities-stats:
kactivities-stats:
kactivities-stats:
kactivities-stats:
kactivities-stats:
-kactivities-stats: For more information, visit: http://www.kde.org
kactivities-stats:
diff --git a/kde/slack-desc/kactivitymanagerd b/kde/slack-desc/kactivitymanagerd
index 17d1fe9..a8650de 100644
--- a/kde/slack-desc/kactivitymanagerd
+++ b/kde/slack-desc/kactivitymanagerd
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kactivitymanagerd: kactivitymanagerd (manage and track user activities)
kactivitymanagerd:
-kactivitymanagerd: System service to manage user activities
-kactivitymanagerd: and track the usage patterns.
-kactivitymanagerd: Transient package for the period between the upgrade
-kactivitymanagerd: to KDE Frameworks 5.20 and upgrade to Plasma 5.6.
-kactivitymanagerd:
+kactivitymanagerd: System service to manage user activities and track the usage patterns.
+kactivitymanagerd: Transient package for the period between the upgrade to KDE Frameworks
+kactivitymanagerd: 5.20 and upgrade to Plasma 5.6.
kactivitymanagerd:
kactivitymanagerd: For more information, visit:
kactivitymanagerd: https://projects.kde.org/projects/kde/workspace/kactivitymanagerd
kactivitymanagerd:
+kactivitymanagerd:
+kactivitymanagerd:
diff --git a/kde/slack-desc/kaddressbook b/kde/slack-desc/kaddressbook
index d07f372..e686692 100644
--- a/kde/slack-desc/kaddressbook
+++ b/kde/slack-desc/kaddressbook
@@ -15,5 +15,5 @@ kaddressbook:
kaddressbook:
kaddressbook:
kaddressbook:
-kaddressbook: Home page: http://www.kde.org/
+kaddressbook:
kaddressbook:
diff --git a/kde/slack-desc/kajongg b/kde/slack-desc/kajongg
index eb317ef..1486eb0 100644
--- a/kde/slack-desc/kajongg
+++ b/kde/slack-desc/kajongg
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kajongg: kajongg (Mah Jongg for KDE)
kajongg:
-kajongg: Kajongg is the ancient Chinese board game for 4 players.
-kajongg: Kajongg can be used in two different ways: Scoring a manual game where
-kajongg: you play as always and use Kajongg for the computation of scores and
-kajongg: for bookkeeping. Or you can use Kajongg to play against any
-kajongg: combination of other human players or computer players.
+kajongg: Kajongg is the ancient Chinese board game for 4 players. Kajongg can
+kajongg: be used in two different ways: Scoring a manual game where you play as
+kajongg: always and use Kajongg for the computation of scores and for
+kajongg: bookkeeping. Or you can use Kajongg to play against any combination
+kajongg: of other human players or computer players.
+kajongg:
kajongg:
kajongg:
-kajongg: For more information, visit: http://www.kde.org
kajongg:
diff --git a/kde/slack-desc/kalarm b/kde/slack-desc/kalarm
index e142866..c6d3c94 100644
--- a/kde/slack-desc/kalarm
+++ b/kde/slack-desc/kalarm
@@ -15,5 +15,5 @@ kalarm:
kalarm:
kalarm:
kalarm:
-kalarm: Home page: http://www.kde.org/
+kalarm:
kalarm:
diff --git a/kde/slack-desc/kalarmcal b/kde/slack-desc/kalarmcal
index cdb84aa..6a9ab91 100644
--- a/kde/slack-desc/kalarmcal
+++ b/kde/slack-desc/kalarmcal
@@ -15,5 +15,5 @@ kalarmcal:
kalarmcal:
kalarmcal:
kalarmcal:
-kalarmcal: Home page: http://www.kde.org/
+kalarmcal:
kalarmcal:
diff --git a/kde/slack-desc/kalgebra b/kde/slack-desc/kalgebra
index aefc3cc..606862e 100644
--- a/kde/slack-desc/kalgebra
+++ b/kde/slack-desc/kalgebra
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
kalgebra: kalgebra (a graph calculator)
kalgebra:
-kalgebra: KAlgebra is a MathML-based graph calculator. It was initially mathml
-kalgebra: oriented, but now it can be used by anyone with a little mathematic
+kalgebra: KAlgebra is a MathML-based graph calculator. It was initially MathML
+kalgebra: oriented, but now it can be used by anyone with a little mathematical
kalgebra: knowledge.
kalgebra:
-kalgebra: For more information, visit: http://edu.kde.org/
+kalgebra:
kalgebra:
kalgebra:
kalgebra:
diff --git a/kde/slack-desc/kalzium b/kde/slack-desc/kalzium
index b96c7bc..d757f95 100644
--- a/kde/slack-desc/kalzium
+++ b/kde/slack-desc/kalzium
@@ -10,7 +10,7 @@ kalzium: kalzium (periodic table of the elements)
kalzium:
kalzium: Kalzium shows a periodic table of the elements.
kalzium:
-kalzium: For more information, visit: http://edu.kde.org/
+kalzium:
kalzium:
kalzium:
kalzium:
diff --git a/kde/slack-desc/kamera b/kde/slack-desc/kamera
index 8d86f1d..0244544 100644
--- a/kde/slack-desc/kamera
+++ b/kde/slack-desc/kamera
@@ -5,12 +5,12 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler------------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kamera: kamera (digital camera support for KDE)
kamera:
kamera: Digital camera support for KDE.
kamera:
-kamera: For more information, visit: http://www.kde.org
+kamera:
kamera:
kamera:
kamera:
diff --git a/kde/slack-desc/kamoso b/kde/slack-desc/kamoso
index 3e787d1..6527dd0 100644
--- a/kde/slack-desc/kamoso
+++ b/kde/slack-desc/kamoso
@@ -13,7 +13,7 @@ kamoso: videos. It probably should be the best webcam recorder for Linux.
kamoso:
kamoso: Kamoso can make photos from your webcam and upload them to Facebook.
kamoso: It also allows to record videos from your webcam and upload them
-kamoso: to YouTube
+kamoso: to YouTube.
kamoso:
-kamoso: Home page: https://userbase.kde.org/Kamoso
+kamoso: Homepage: https://userbase.kde.org/Kamoso
kamoso:
diff --git a/kde/slack-desc/kanagram b/kde/slack-desc/kanagram
index 98288f5..13443f0 100644
--- a/kde/slack-desc/kanagram
+++ b/kde/slack-desc/kanagram
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kanagram: kanagram (letter game)
kanagram:
-kanagram: Kanagram is a replacement for KMessedWords. Kanagram mixes up the
-kanagram: letters of a word to create an anagram, and you have to guess what
-kanagram: the mixed up word is. Kanagram features several built-in word lists,
-kanagram: hints, and a cheat feature which reveals the original word.
-kanagram: Kanagram also has a vocabulary editor.
+kanagram: Kanagram is a replacement for KMessedWords. Kanagram mixes up the
+kanagram: letters of a word to create an anagram, and you have to guess what the
+kanagram: mixed up word is. Kanagram features several built-in word lists,
+kanagram: hints, and a cheat feature which reveals the original word. Kanagram
+kanagram: also has a vocabulary editor.
+kanagram:
kanagram:
-kanagram: For more information, visit: http://edu.kde.org/
kanagram:
kanagram:
diff --git a/kde/slack-desc/kapidox b/kde/slack-desc/kapidox
index 56ab0e7..961780b 100644
--- a/kde/slack-desc/kapidox
+++ b/kde/slack-desc/kapidox
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kapidox: kapidox (kapidox)
+kapidox: kapidox (KDE Doxygen Tools)
kapidox:
+kapidox: This framework contains scripts and data for building API
+kapidox: documentation (dox) in a standard format and style.
kapidox:
kapidox:
kapidox:
@@ -15,5 +17,3 @@ kapidox:
kapidox:
kapidox:
kapidox:
-kapidox:
-kapidox: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kapman b/kde/slack-desc/kapman
index 750a4ef..a7fc186 100644
--- a/kde/slack-desc/kapman
+++ b/kde/slack-desc/kapman
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kapman: kapman (KDE version of Pac-Man)
kapman:
-kapman: Kapman is a clone of the well known game Pac-Man.
-kapman: You must run through the maze to eat all pills without being captured
-kapman: by a ghost. By eating an energizer, Kapman gets the ability to eat
-kapman: ghosts for a few seconds. When a stage is cleared of pills and
-kapman: energizer the player is taken to the next stage with slightly
-kapman: increased game speed.
+kapman: Kapman is a clone of the well known game Pac-Man. You must run through
+kapman: the maze to eat all pills without being captured by a ghost. By eating
+kapman: an energizer, Kapman gets the ability to eat ghosts for a few seconds.
+kapman: When a stage is cleared of pills and energizers the player is taken to
+kapman: the next stage with slightly increased game speed.
+kapman:
+kapman:
kapman:
-kapman: For more information, visit: http://www.kde.org
kapman:
diff --git a/kde/slack-desc/kapptemplate b/kde/slack-desc/kapptemplate
index 092cd66..5de2077 100644
--- a/kde/slack-desc/kapptemplate
+++ b/kde/slack-desc/kapptemplate
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kapptemplate: kapptemplate (application template generator)
kapptemplate:
-kapptemplate: KAppTemplate is a shell script to create the necessary framework
-kapptemplate: to develop KDE applications.
+kapptemplate: KAppTemplate is a shell script to create the necessary framework to
+kapptemplate: develop KDE applications.
+kapptemplate:
kapptemplate:
kapptemplate:
kapptemplate:
kapptemplate:
kapptemplate:
-kapptemplate: For more information, visit: http://www.kde.org
kapptemplate:
diff --git a/kde/slack-desc/karchive b/kde/slack-desc/karchive
index 25268e4..3b98274 100644
--- a/kde/slack-desc/karchive
+++ b/kde/slack-desc/karchive
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-karchive: karchive (karchive)
+karchive: karchive (Read, create, and manipulate archives)
karchive:
+karchive: KArchive provides classes for easy reading, creation and manipulation
+karchive: of archive formats like ZIP and TAR. It also provides transparent
+karchive: compression and decompression of data, like the GZip format, via a
+karchive: subclass of QIODevice.
karchive:
karchive:
karchive:
karchive:
karchive:
-karchive:
-karchive:
-karchive:
-karchive: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kate b/kde/slack-desc/kate
index 9b19944..a1bf3ed 100644
--- a/kde/slack-desc/kate
+++ b/kde/slack-desc/kate
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kate: kate (an advanced text editor for KDE)
kate:
-kate: The Kate project develops two main products:
-kate: KatePart, the advanced editor component which is used in numerous KDE
-kate: applications requiring a text editing component, and Kate, a MDI text
-kate: editor application. In addition, we provide KWrite, a simple SDI
-kate: editor shell which allows the user to select his/her favorite editor
-kate: component.
+kate: The Kate project develops two main products: KatePart, the advanced
+kate: editor component which is used in numerous KDE applications requiring
+kate: a text editing component, and Kate, a MDI text editor application.
+kate: In addition, it provides KWrite, a simple SDI editor shell which
+kate: allows the user to select his/her favorite editor component.
kate:
kate: Homepage: http://kate-editor.org
kate:
+kate:
diff --git a/kde/slack-desc/katomic b/kde/slack-desc/katomic
index de76b51..3af6ae0 100644
--- a/kde/slack-desc/katomic
+++ b/kde/slack-desc/katomic
@@ -9,11 +9,11 @@
katomic: katomic (re-assemble molecules from compound atoms)
katomic:
katomic: Katomic is both fun and educational game built around molecular
-katomic: geometry. It employs simplistic two-dimensional looks at different
-katomic: chemical elements. You can also play an online demo version
-katomic: of this game.
+katomic: geometry. It employs simplistic two-dimensional looks at different
+katomic: chemical elements. You can also play an online demo version of this
+katomic: game.
+katomic:
katomic:
katomic:
katomic:
-katomic: For more information, visit: http://www.kde.org
katomic:
diff --git a/kde/slack-desc/kaudiocreator b/kde/slack-desc/kaudiocreator
index 3de3772..4340fc1 100644
--- a/kde/slack-desc/kaudiocreator
+++ b/kde/slack-desc/kaudiocreator
@@ -5,11 +5,11 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kaudiocreator: kaudiocreator (CD ripper and audio encoder)
kaudiocreator:
-kaudiocreator: kaudiocreater is a KDE frontend for ripping and encoding audio
-kaudiocreator: to/from optical media.
+kaudiocreator: kaudiocreater is a KDE frontend for ripping and encoding audio to/from
+kaudiocreator: optical media.
kaudiocreator:
kaudiocreator:
kaudiocreator:
diff --git a/kde/slack-desc/kauth b/kde/slack-desc/kauth
index 7b5e651..d7a5825 100644
--- a/kde/slack-desc/kauth
+++ b/kde/slack-desc/kauth
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kauth: kauth (kauth)
+kauth: kauth (Execute actions as privileged user)
kauth:
+kauth: KAuth provides a convenient, system-integrated way to offload actions
+kauth: that need to be performed as a privileged user (root, for example) to
+kauth: small (hopefully secure) helper utilities.
kauth:
kauth:
kauth:
kauth:
kauth:
kauth:
-kauth:
-kauth:
-kauth: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kbackup b/kde/slack-desc/kbackup
index eaebf28..f89e2d4 100644
--- a/kde/slack-desc/kbackup
+++ b/kde/slack-desc/kbackup
@@ -10,10 +10,10 @@ kbackup: kbackup (KDE backup program)
kbackup:
kbackup: KBackup is an application that lets you back up any folders or files
kbackup: in a tar archive to a local folder, e.g. a locally mounted device
-kbackup: like a ZIP drive, USB stick, etc. or a remote URL.
-kbackup: KBackup can run automated backups without using a graphical
-kbackup: user interface.
+kbackup: like a ZIP drive, USB stick, etc. or a remote URL. KBackup can also
+kbackup: run automated backups without using a graphical user interface.
+kbackup:
+kbackup: Homepage: https://www.kde.org/applications/utilities/kbackup/
kbackup:
kbackup:
-kbackup: Home page: https://www.kde.org/applications/utilities/kbackup/
kbackup:
diff --git a/kde/slack-desc/kblackbox b/kde/slack-desc/kblackbox
index a4525a2..3a0713d 100644
--- a/kde/slack-desc/kblackbox
+++ b/kde/slack-desc/kblackbox
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kblackbox: kblackbox (a game of hide and seek)
kblackbox:
-kblackbox: KBlackbox is a game of hide and seek played on a grid of boxes
-kblackbox: where the computer has hidden several balls.
+kblackbox: KBlackbox is a game of hide and seek played on a grid of boxes where
+kblackbox: the computer has hidden several balls.
+kblackbox:
kblackbox:
kblackbox:
kblackbox:
kblackbox:
kblackbox:
-kblackbox: For more information, visit: http://www.kde.org
kblackbox:
diff --git a/kde/slack-desc/kblocks b/kde/slack-desc/kblocks
index bdbfdfa..ed3b827 100644
--- a/kde/slack-desc/kblocks
+++ b/kde/slack-desc/kblocks
@@ -15,5 +15,5 @@ kblocks:
kblocks:
kblocks:
kblocks:
-kblocks: For more information, visit: http://www.kde.org
+kblocks:
kblocks:
diff --git a/kde/slack-desc/kblog b/kde/slack-desc/kblog
index 266d97e..b6516fe 100644
--- a/kde/slack-desc/kblog
+++ b/kde/slack-desc/kblog
@@ -9,11 +9,11 @@
kblog: kblog (blogging library for KDE)
kblog:
kblog: KBlog is a library for calling functions on Blogger 1.0, MetaWeblog,
-kblog: MovableType and GData compatible blogs.
-kblog: It calls the APIs using KXmlRpcClient and Syndication.
-kblog: It supports asynchronous sending and fetching of posts and,
-kblog: if supported on the server, multimedia files.
+kblog: MovableType and GData compatible blogs. It calls the APIs using
+kblog: KXmlRpcClient and Syndication. It supports asynchronous sending and
+kblog: fetching of posts and, if supported on the server, multimedia files.
kblog: Almost every modern blogging web application that provides an XML data
kblog: interface supports one of the APIs mentioned above.
kblog:
-kblog: Home page: http://www.kde.org/
+kblog:
+kblog:
diff --git a/kde/slack-desc/kbookmarks b/kde/slack-desc/kbookmarks
index 7f3f949..00c7c8b 100644
--- a/kde/slack-desc/kbookmarks
+++ b/kde/slack-desc/kbookmarks
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kbookmarks: kbookmarks (kbookmarks)
+kbookmarks: kbookmarks (Bookmarks management library)
kbookmarks:
+kbookmarks: KBookmarks lets you access and manipulate bookmarks stored using the
+kbookmarks: XBEL format. The most common use for bookmarks is web browsers, but
+kbookmarks: this can also be useful in any application where local files or URLs
+kbookmarks: can be saved as bookmarks.
kbookmarks:
+kbookmarks: For more information on the XBEL format, see:
+kbookmarks: http://pyxml.sourceforge.net/topics/xbel/
kbookmarks:
kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kbounce b/kde/slack-desc/kbounce
index 2a98326..a5aa9a1 100644
--- a/kde/slack-desc/kbounce
+++ b/kde/slack-desc/kbounce
@@ -10,10 +10,10 @@ kbounce: kbounce (KDE Bounce Ball Game)
kbounce:
kbounce: KBounce is a single player arcade game with the elements of puzzle.
kbounce: It is played on a field, surrounded by wall, with two or more balls
-kbounce: that move about in the field bouncing off of walls.
-kbounce: The player can build new walls, decreasing the size of active field.
+kbounce: that move about in the field bouncing off of walls. The player can
+kbounce: build new walls, decreasing the size of active field.
+kbounce:
kbounce:
kbounce:
kbounce:
-kbounce: For more information, visit: http://www.kde.org
kbounce:
diff --git a/kde/slack-desc/kbreakout b/kde/slack-desc/kbreakout
index e9b53a1..d060800 100644
--- a/kde/slack-desc/kbreakout
+++ b/kde/slack-desc/kbreakout
@@ -15,5 +15,5 @@ kbreakout:
kbreakout:
kbreakout:
kbreakout:
-kbreakout: For more information, visit: http://www.kde.org
+kbreakout:
kbreakout:
diff --git a/kde/slack-desc/kbruch b/kde/slack-desc/kbruch
index 43a2aa3..2b9bdb6 100644
--- a/kde/slack-desc/kbruch
+++ b/kde/slack-desc/kbruch
@@ -10,7 +10,7 @@ kbruch: kbruch (calculate fractions)
kbruch:
kbruch: KBruch is a small program to practice calculating with fractions.
kbruch:
-kbruch: For more information, visit: http://edu.kde.org/
+kbruch:
kbruch:
kbruch:
kbruch:
diff --git a/kde/slack-desc/kcachegrind b/kde/slack-desc/kcachegrind
index e47d7d9..9fe0153 100644
--- a/kde/slack-desc/kcachegrind
+++ b/kde/slack-desc/kcachegrind
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kcachegrind: kcachegrind (GUI to profilers such as Valgrind)
kcachegrind:
-kcachegrind: kcachegrind is a graphical browser for data produced by
-kcachegrind: profiling tools such as Valgrind.
+kcachegrind: kcachegrind is a graphical browser for data produced by profiling
+kcachegrind: tools such as Valgrind.
+kcachegrind:
kcachegrind:
kcachegrind:
kcachegrind:
kcachegrind:
kcachegrind:
-kcachegrind: For more information, visit: http://www.kde.org
kcachegrind:
diff --git a/kde/slack-desc/kcalc b/kde/slack-desc/kcalc
index f5144c5..fd72f12 100644
--- a/kde/slack-desc/kcalc
+++ b/kde/slack-desc/kcalc
@@ -11,7 +11,7 @@ kcalc:
kcalc: KCalc is a calculator which offers many more mathematical functions
kcalc: than meet the eye on a first glance.
kcalc:
-kcalc: kcalc's home page is: http://utils.kde.org/projects/kcalc
+kcalc: Homepage: http://utils.kde.org/projects/kcalc
kcalc:
kcalc:
kcalc:
diff --git a/kde/slack-desc/kcalcore b/kde/slack-desc/kcalcore
index 44c4147..7a45093 100644
--- a/kde/slack-desc/kcalcore
+++ b/kde/slack-desc/kcalcore
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kcalcore: kcalcore (KDE calendar access library)
kcalcore:
-kcalcore: This library provides access to and handling of calendar data.
-kcalcore: It supports the standard formats iCalendar and vCalendar and the
-kcalcore: group scheduling standard iTIP.
+kcalcore: This library provides access to and handling of calendar data. It
+kcalcore: supports the standard formats iCalendar and vCalendar and the group
+kcalcore: scheduling standard iTIP.
+kcalcore:
kcalcore:
kcalcore:
kcalcore:
kcalcore:
-kcalcore: Home page: http://www.kde.org/
kcalcore:
diff --git a/kde/slack-desc/kcalendarcore b/kde/slack-desc/kcalendarcore
index 12a2961..7106b56 100644
--- a/kde/slack-desc/kcalendarcore
+++ b/kde/slack-desc/kcalendarcore
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kcalendarcore: kcalendarcore (KDE calendar access library)
kcalendarcore:
-kcalendarcore: This library provides access to and handling of calendar data.
-kcalendarcore: It supports the standard formats iCalendar and vCalendar and the
-kcalendarcore: group scheduling standard iTIP.
+kcalendarcore: This library provides access to and handling of calendar data. It
+kcalendarcore: supports the standard formats iCalendar and vCalendar and the group
+kcalendarcore: scheduling standard iTIP.
+kcalendarcore:
kcalendarcore:
kcalendarcore:
kcalendarcore:
kcalendarcore:
-kcalendarcore: Home page: http://www.kde.org/
kcalendarcore:
diff --git a/kde/slack-desc/kcalutils b/kde/slack-desc/kcalutils
index fa95cc1..3ec2f34 100644
--- a/kde/slack-desc/kcalutils
+++ b/kde/slack-desc/kcalutils
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kcalutils: kcalutils (utility functions for the handling of calendar data)
+kcalutils: kcalutils (calendar data utilities)
kcalutils:
kcalutils: This library provides a set of utility functions that help
kcalutils: applications access and use calendar data via the KCalCore library.
@@ -15,5 +15,5 @@ kcalutils:
kcalutils:
kcalutils:
kcalutils:
-kcalutils: Home page: http://www.kde.org/
+kcalutils:
kcalutils:
diff --git a/kde/slack-desc/kcharselect b/kde/slack-desc/kcharselect
index 3c937dd..50a2524 100644
--- a/kde/slack-desc/kcharselect
+++ b/kde/slack-desc/kcharselect
@@ -8,10 +8,10 @@
|-----handy-ruler------------------------------------------------------|
kcharselect: kcharselect (character picker)
kcharselect:
-kcharselect: KCharSelect is a tool to select special characters from all
-kcharselect: installed fonts and copy them into the clipboard.
+kcharselect: KCharSelect is a tool to select special characters from all installed
+kcharselect: fonts and copy them into the clipboard.
kcharselect:
-kcharselect: kcharselect's home page: http://utils.kde.org/projects/kcharselect
+kcharselect: Homepage: http://utils.kde.org/projects/kcharselect
kcharselect:
kcharselect:
kcharselect:
diff --git a/kde/slack-desc/kcmutils b/kde/slack-desc/kcmutils
index 504aa27..2236849 100644
--- a/kde/slack-desc/kcmutils
+++ b/kde/slack-desc/kcmutils
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcmutils: kcmutils (kcmutils)
+kcmutils: kcmutils (KDE System Settings utilities)
kcmutils:
+kcmutils: KCMUtils provides various classes to work with KCModules. KCModules
+kcmutils: can be created with the KConfigWidgets framework.
kcmutils:
kcmutils:
kcmutils:
@@ -15,5 +17,3 @@ kcmutils:
kcmutils:
kcmutils:
kcmutils:
-kcmutils:
-kcmutils: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcodecs b/kde/slack-desc/kcodecs
index b3d461e..ea4b170 100644
--- a/kde/slack-desc/kcodecs
+++ b/kde/slack-desc/kcodecs
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcodecs: kcodecs (kcodecs)
+kcodecs: kcodecs (String encoding library)
kcodecs:
+kcodecs: KCodecs provide a collection of methods to manipulate strings using
+kcodecs: various encodings. It can automatically determine the charset of a
+kcodecs: string, translate XML entities, validate email addresses, and find
+kcodecs: encodings by name in a more tolerant way than QTextCodec (useful e.g.
+kcodecs: for data coming from the Internet).
kcodecs:
kcodecs:
kcodecs:
kcodecs:
-kcodecs:
-kcodecs:
-kcodecs:
-kcodecs:
-kcodecs: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcolorchooser b/kde/slack-desc/kcolorchooser
index 61e356d..b5219c5 100644
--- a/kde/slack-desc/kcolorchooser
+++ b/kde/slack-desc/kcolorchooser
@@ -10,7 +10,7 @@ kcolorchooser: kcolorchooser (color chooser)
kcolorchooser:
kcolorchooser: A color chooser application for KDE.
kcolorchooser:
-kcolorchooser: For more information, visit: http://www.kde.org
+kcolorchooser:
kcolorchooser:
kcolorchooser:
kcolorchooser:
diff --git a/kde/slack-desc/kcompletion b/kde/slack-desc/kcompletion
index 00b6ce2..d66ccb3 100644
--- a/kde/slack-desc/kcompletion
+++ b/kde/slack-desc/kcompletion
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcompletion: kcompletion (kcompletion)
+kcompletion: kcompletion (Powerful completion framework)
kcompletion:
+kcompletion: When typing filenames, email addresses and other text where the user
+kcompletion: often wants to select from existing data (including what they
+kcompletion: previously typed) rather than enter anything wholly original, users
+kcompletion: often find it helpful if they only need to type the first few
+kcompletion: characters, and then have the application offer them a set of choices
+kcompletion: or attempt to finish off what they were typing. This framework helps
+kcompletion: implement this in Qt-based applications.
kcompletion:
kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kconfig b/kde/slack-desc/kconfig
index 7cefad3..058549d 100644
--- a/kde/slack-desc/kconfig
+++ b/kde/slack-desc/kconfig
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kconfig: kconfig (kconfig)
+kconfig: kconfig (Persistent application settings)
kconfig:
+kconfig: KConfig provides an advanced configuration system. It is made of two
+kconfig: parts: KConfigCore and KConfigGui. KConfigCore provides access to the
+kconfig: configuration files themselves. KConfigGui provides a way to hook
+kconfig: widgets to the configuration so that they are automatically
+kconfig: initialized from the configuration and automatically propagate their
+kconfig: changes to their respective configuration files.
kconfig:
kconfig:
kconfig:
-kconfig:
-kconfig:
-kconfig:
-kconfig:
-kconfig:
-kconfig: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kconfigwidgets b/kde/slack-desc/kconfigwidgets
index 647a404..683097a 100644
--- a/kde/slack-desc/kconfigwidgets
+++ b/kde/slack-desc/kconfigwidgets
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kconfigwidgets: kconfigwidgets (kconfigwidgets)
+kconfigwidgets: kconfigwidgets (Widgets for configuration dialogs)
kconfigwidgets:
+kconfigwidgets: KConfigWidgets provides easy-to-use classes to create configuration
+kconfigwidgets: dialogs, as well as a set of widgets which uses KConfig to store their
+kconfigwidgets: settings.
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
-kconfigwidgets:
-kconfigwidgets:
-kconfigwidgets: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcontacts b/kde/slack-desc/kcontacts
index 6dcf4fc..b04c192 100644
--- a/kde/slack-desc/kcontacts
+++ b/kde/slack-desc/kcontacts
@@ -11,9 +11,9 @@ kcontacts:
kcontacts: kcontacts contains an address book API for KDE. This can be used by
kcontacts: all KDE applications using data of this type, e.g. KAddressBook,
kcontacts: KMail, KOrganizer, KPilot etc.
-kcontacts: It is meant as replacement for libkab (in kdebase/kab).
kcontacts:
kcontacts:
kcontacts:
-kcontacts: Home page: http://www.kde.org/
+kcontacts:
+kcontacts:
kcontacts:
diff --git a/kde/slack-desc/kcoreaddons b/kde/slack-desc/kcoreaddons
index 54d736a..e21417c 100644
--- a/kde/slack-desc/kcoreaddons
+++ b/kde/slack-desc/kcoreaddons
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcoreaddons: kcoreaddons (kcoreaddons)
+kcoreaddons: kcoreaddons (QtCore addon library)
kcoreaddons:
+kcoreaddons: KCoreAddons provides classes built on top of QtCore to perform various
+kcoreaddons: tasks such as manipulating mime types, autosaving files, creating
+kcoreaddons: backup files, generating random sequences, performing text
+kcoreaddons: manipulations such as macro replacement, accessing user information
+kcoreaddons: and many more.
kcoreaddons:
kcoreaddons:
kcoreaddons:
kcoreaddons:
-kcoreaddons:
-kcoreaddons:
-kcoreaddons:
-kcoreaddons:
-kcoreaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcrash b/kde/slack-desc/kcrash
index 0d0bfb8..7324a80 100644
--- a/kde/slack-desc/kcrash
+++ b/kde/slack-desc/kcrash
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcrash: kcrash (kcrash)
+kcrash: kcrash (Crash handler)
kcrash:
+kcrash: KCrash provides support for intercepting and handling application
+kcrash: crashes.
kcrash:
kcrash:
kcrash:
@@ -15,5 +17,3 @@ kcrash:
kcrash:
kcrash:
kcrash:
-kcrash:
-kcrash: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcron b/kde/slack-desc/kcron
index 109ccfa..d4be744 100644
--- a/kde/slack-desc/kcron
+++ b/kde/slack-desc/kcron
@@ -15,5 +15,5 @@ kcron:
kcron:
kcron:
kcron:
-kcron: For more information, visit: http://www.kde.org
+kcron:
kcron:
diff --git a/kde/slack-desc/kdav b/kde/slack-desc/kdav
index 5e09f66..7abe02a 100644
--- a/kde/slack-desc/kdav
+++ b/kde/slack-desc/kdav
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdav: kdav (KDE DAV protocol implementation)
kdav:
-kdav: A DAV protocol implemention with KJobs.
+kdav: The DAV protocol extends HTTP with new methods that allow a DAV client
+kdav: to create, modify, and update files and directories in the server.
+kdav: KDAV provides a DAV protocol implemention with KJobs. Calendars and
+kdav: todos are supported, using either GroupDAV or CalDAV, and contacts are
+kdav: supported using GroupDAV or CardDAV.
kdav:
kdav:
kdav:
kdav:
-kdav:
-kdav:
-kdav: For more information, visit: http://pim.kde.org
-kdav:
diff --git a/kde/slack-desc/kdbusaddons b/kde/slack-desc/kdbusaddons
index 1912355..29332b5 100644
--- a/kde/slack-desc/kdbusaddons
+++ b/kde/slack-desc/kdbusaddons
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdbusaddons: kdbusaddons (kdbusaddons)
+kdbusaddons: kdbusaddons (Convenience classes for D-Bus)
kdbusaddons:
+kdbusaddons: KDBusAddons provides convenience classes on top of QtDBus, as well as
+kdbusaddons: an API to create KDED modules.
kdbusaddons:
kdbusaddons:
kdbusaddons:
@@ -15,5 +17,3 @@ kdbusaddons:
kdbusaddons:
kdbusaddons:
kdbusaddons:
-kdbusaddons:
-kdbusaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kde-cli-tools b/kde/slack-desc/kde-cli-tools
index 0c4fc04..5f29d16 100644
--- a/kde/slack-desc/kde-cli-tools
+++ b/kde/slack-desc/kde-cli-tools
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kde-cli-tools: kde-cli-tools (KDE commandline tools)
+kde-cli-tools: kde-cli-tools (KDE command-line tools)
+kde-cli-tools:
+kde-cli-tools: Tools based on KDE Frameworks 5 to better interact with the system.
+kde-cli-tools:
kde-cli-tools:
-kde-cli-tools: Tools based on KDE Frameworks 5 to better interact
-kde-cli-tools: with the system.
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
-kde-cli-tools: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kde-dev-scripts b/kde/slack-desc/kde-dev-scripts
index df28666..296127e 100644
--- a/kde/slack-desc/kde-dev-scripts
+++ b/kde/slack-desc/kde-dev-scripts
@@ -15,5 +15,5 @@ kde-dev-scripts:
kde-dev-scripts:
kde-dev-scripts:
kde-dev-scripts:
-kde-dev-scripts: For more information, visit: http://www.kde.org
+kde-dev-scripts:
kde-dev-scripts:
diff --git a/kde/slack-desc/kde-dev-utils b/kde/slack-desc/kde-dev-utils
index 55d3ad3..cc8f350 100644
--- a/kde/slack-desc/kde-dev-utils
+++ b/kde/slack-desc/kde-dev-utils
@@ -15,5 +15,5 @@ kde-dev-utils:
kde-dev-utils:
kde-dev-utils:
kde-dev-utils:
-kde-dev-utils: For more information, visit: http://www.kde.org
+kde-dev-utils:
kde-dev-utils:
diff --git a/kde/slack-desc/kde-gtk-config b/kde/slack-desc/kde-gtk-config
index d59bfb6..162a411 100644
--- a/kde/slack-desc/kde-gtk-config
+++ b/kde/slack-desc/kde-gtk-config
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kde-gtk-config: kde-gtk-config (configure GTK application look & feel in KDE)
+kde-gtk-config: kde-gtk-config (configure GTK appearance)
kde-gtk-config:
-kde-gtk-config: KDE systemsettings kcm to set GTK application look and feel.
+kde-gtk-config: System settings kcm to set GTK application look and feel in KDE.
kde-gtk-config:
+kde-gtk-config: Homepage: http://projects.kde.org/kde-gtk-config
kde-gtk-config:
kde-gtk-config:
kde-gtk-config:
kde-gtk-config:
kde-gtk-config:
-kde-gtk-config: For more information, visit: http://projects.kde.org/kde-gtk-config
kde-gtk-config:
diff --git a/kde/slack-desc/kde-wallpapers b/kde/slack-desc/kde-wallpapers
index e78fbfb..5c14a8a 100644
--- a/kde/slack-desc/kde-wallpapers
+++ b/kde/slack-desc/kde-wallpapers
@@ -5,7 +5,7 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler-------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kde-wallpapers: kde-wallpapers (Wallpapers for KDE)
kde-wallpapers:
kde-wallpapers: Additional wallpapers for KDE.
diff --git a/kde/slack-desc/kdeaccessibility b/kde/slack-desc/kdeaccessibility
index 91669ef..e176b38 100644
--- a/kde/slack-desc/kdeaccessibility
+++ b/kde/slack-desc/kdeaccessibility
@@ -17,4 +17,3 @@ kdeaccessibility:
kdeaccessibility:
kdeaccessibility:
kdeaccessibility:
-kdeaccessibility:
diff --git a/kde/slack-desc/kdeadmin b/kde/slack-desc/kdeadmin
index cef4307..515abd9 100644
--- a/kde/slack-desc/kdeadmin
+++ b/kde/slack-desc/kdeadmin
@@ -6,7 +6,7 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler---------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdeadmin: kdeadmin (System Administration tools)
kdeadmin:
kdeadmin: KDE system administration tools.
diff --git a/kde/slack-desc/kdebugsettings b/kde/slack-desc/kdebugsettings
index df5771f..bc4921f 100644
--- a/kde/slack-desc/kdebugsettings
+++ b/kde/slack-desc/kdebugsettings
@@ -15,5 +15,5 @@ kdebugsettings:
kdebugsettings:
kdebugsettings:
kdebugsettings:
-kdebugsettings: For more information, visit: http://www.kde.org
+kdebugsettings:
kdebugsettings:
diff --git a/kde/slack-desc/kdeclarative b/kde/slack-desc/kdeclarative
index bd82c61..09cd5cd 100644
--- a/kde/slack-desc/kdeclarative
+++ b/kde/slack-desc/kdeclarative
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdeclarative: kdeclarative (kdeclarative)
+kdeclarative: kdeclarative (Integration of QML and KDE workspaces)
kdeclarative:
+kdeclarative: KDeclarative provides integration of QML and KDE work spaces. It
+kdeclarative: comprises two parts: a library used by the C++ part of your
+kdeclarative: application to intergrate QML with KDE Frameworks specific features,
+kdeclarative: and a series of QML imports that offer bindings to some of the
+kdeclarative: frameworks.
kdeclarative:
kdeclarative:
kdeclarative:
kdeclarative:
-kdeclarative:
-kdeclarative:
-kdeclarative:
-kdeclarative:
-kdeclarative: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdeconnect-kde b/kde/slack-desc/kdeconnect-kde
index 7fe5334..1eb21b9 100644
--- a/kde/slack-desc/kdeconnect-kde
+++ b/kde/slack-desc/kdeconnect-kde
@@ -13,7 +13,7 @@ kdeconnect-kde: Prominent features are: clipboard share, notifications sync,
kdeconnect-kde: multimedia remote control over secured network connections.
kdeconnect-kde: Please note you will need to install KDE Connect on Android
kdeconnect-kde: for this app to work:
+kdeconnect-kde:
kdeconnect-kde: https://play.google.com/store/apps/details?id=org.kde.kdeconnect_tp
kdeconnect-kde:
-kdeconnect-kde: See also:
-kdeconnect-kde: https://albertvaka.wordpress.com/2013/08/05/introducing-kde-connect/
+kdeconnect-kde:
diff --git a/kde/slack-desc/kdecoration b/kde/slack-desc/kdecoration
index 499a27b..79481ca 100644
--- a/kde/slack-desc/kdecoration
+++ b/kde/slack-desc/kdecoration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdecoration: kdecoration (library to create themes for kwin)
kdecoration:
-kdecoration: This library makes it easier and more reliable to make themes
-kdecoration: for KWin, Plasma's window manager.
-kdecoration: It has impressive memory, performance and stability improvements.
+kdecoration: This library makes it easier and more reliable to make themes for
+kdecoration: KWin, Plasma's window manager. It has impressive memory, performance
+kdecoration: and stability improvements.
+kdecoration:
kdecoration:
kdecoration:
kdecoration:
kdecoration:
-kdecoration: For more information, visit: http://www.kde.org
kdecoration:
diff --git a/kde/slack-desc/kded b/kde/slack-desc/kded
index 98a2b88..4767063 100644
--- a/kde/slack-desc/kded
+++ b/kde/slack-desc/kded
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kded: kded (kded)
+kded: kded (Central daemon of KDE workspaces)
kded:
+kded: KDED stands for KDE Daemon. KDED runs in the background and performs a
+kded: number of small tasks. Some of these tasks are built in, others are
+kded: started on demand. Examples include checking for newly installed
+kded: software and checking for newly installed update files.
kded:
kded:
kded:
kded:
kded:
-kded:
-kded:
-kded:
-kded: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdeedu-data b/kde/slack-desc/kdeedu-data
index a55d9a6..b22384f 100644
--- a/kde/slack-desc/kdeedu-data
+++ b/kde/slack-desc/kdeedu-data
@@ -15,5 +15,5 @@ kdeedu-data:
kdeedu-data:
kdeedu-data:
kdeedu-data:
-kdeedu-data: For more information, visit: http://www.kde.org
+kdeedu-data:
kdeedu-data:
diff --git a/kde/slack-desc/kdegraphics-mobipocket b/kde/slack-desc/kdegraphics-mobipocket
index 2704d36..fedd14d 100644
--- a/kde/slack-desc/kdegraphics-mobipocket
+++ b/kde/slack-desc/kdegraphics-mobipocket
@@ -10,7 +10,7 @@ kdegraphics-mobipocket: kdegraphics-mobipocket (Mobipocket support for Okular)
kdegraphics-mobipocket:
kdegraphics-mobipocket: Mobipocket support for Okular.
kdegraphics-mobipocket:
-kdegraphics-mobipocket: For more information, visit: http://www.kde.org/
+kdegraphics-mobipocket:
kdegraphics-mobipocket:
kdegraphics-mobipocket:
kdegraphics-mobipocket:
diff --git a/kde/slack-desc/kdegraphics-thumbnailers b/kde/slack-desc/kdegraphics-thumbnailers
index 1f781d5..c6807f1 100644
--- a/kde/slack-desc/kdegraphics-thumbnailers
+++ b/kde/slack-desc/kdegraphics-thumbnailers
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kdegraphics-thumbnailers: kdegraphics-thumbnailers (thumbnailers for various graphics formats)
+kdegraphics-thumbnailers: kdegraphics-thumbnailers (image thumbnailers)
+kdegraphics-thumbnailers:
+kdegraphics-thumbnailers: These plugins allow KDE software to create thumbnails for several
+kdegraphics-thumbnailers: graphic file formats.
kdegraphics-thumbnailers:
-kdegraphics-thumbnailers: These plugins allow KDE software to create thumbnails for
-kdegraphics-thumbnailers: several advanced graphic file formats.
kdegraphics-thumbnailers:
-kdegraphics-thumbnailers: For more information, visit: http://www.kde.org
kdegraphics-thumbnailers:
kdegraphics-thumbnailers:
kdegraphics-thumbnailers:
diff --git a/kde/slack-desc/kdelibs4support b/kde/slack-desc/kdelibs4support
index 13c929e..684a2bc 100644
--- a/kde/slack-desc/kdelibs4support
+++ b/kde/slack-desc/kdelibs4support
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdelibs4support: kdelibs4support (KDE 4 support)
kdelibs4support:
+kdelibs4support: kdelibs4support provides legacy support for kdelibs 4 compatibility
+kdelibs4support: such as code and utilities to ease the transition from kdelibs 4 to
+kdelibs4support: KDE Frameworks 5. This includes CMake macros and C++ classes whose
+kdelibs4support: functionality has been replaced by code in CMake, Qt and other
+kdelibs4support: frameworks.
kdelibs4support:
kdelibs4support:
kdelibs4support:
kdelibs4support:
-kdelibs4support:
-kdelibs4support:
-kdelibs4support:
-kdelibs4support:
-kdelibs4support: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdenetwork-filesharing b/kde/slack-desc/kdenetwork-filesharing
index 1233eed..02cfcfe 100644
--- a/kde/slack-desc/kdenetwork-filesharing
+++ b/kde/slack-desc/kdenetwork-filesharing
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdenetwork-filesharing: kdenetwork-filesharing (share a directory with the local network)
kdenetwork-filesharing:
-kdenetwork-filesharing: Konqueror properties dialog plugin to share a directory
-kdenetwork-filesharing: with the local network.
+kdenetwork-filesharing: Konqueror properties dialog plugin to share a directory with the local
+kdenetwork-filesharing: network.
+kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
-kdenetwork-filesharing: For more information, visit: http://www.kde.org
kdenetwork-filesharing:
diff --git a/kde/slack-desc/kdenlive b/kde/slack-desc/kdenlive
index 7d1b619..4900af6 100644
--- a/kde/slack-desc/kdenlive
+++ b/kde/slack-desc/kdenlive
@@ -10,10 +10,10 @@ kdenlive: kdenlive (non-linear video editor)
kdenlive:
kdenlive: A non-linear video editor for Linux using the MLT video framework.
kdenlive:
+kdenlive: Homepage: http://www.kdenlive.org
kdenlive:
kdenlive:
kdenlive:
kdenlive:
kdenlive:
-kdenlive: For more information, visit: http://www.kdenlive.org
kdenlive:
diff --git a/kde/slack-desc/kdepim b/kde/slack-desc/kdepim
index 7a66c17..08e3bbb 100644
--- a/kde/slack-desc/kdepim
+++ b/kde/slack-desc/kdepim
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdepim: kdepim (KDE Personal Information Management applications)
kdepim:
kdepim: The KDE-PIM project aims to bring together those who wish to help
diff --git a/kde/slack-desc/kdepim-addons b/kde/slack-desc/kdepim-addons
index ac3e2d3..28e4778 100644
--- a/kde/slack-desc/kdepim-addons
+++ b/kde/slack-desc/kdepim-addons
@@ -15,5 +15,5 @@ kdepim-addons:
kdepim-addons:
kdepim-addons:
kdepim-addons:
-kdepim-addons: Home page: http://www.kde.org/
+kdepim-addons:
kdepim-addons:
diff --git a/kde/slack-desc/kdepim-apps-libs b/kde/slack-desc/kdepim-apps-libs
index d20bb3b..28be245 100644
--- a/kde/slack-desc/kdepim-apps-libs
+++ b/kde/slack-desc/kdepim-apps-libs
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdepim-apps-libs: kdepim-apps-libs (KDE PIM mail related libraries)
kdepim-apps-libs:
-kdepim-apps-libs: kdepim-apps-libs package contains KDE PIM mail
-kdepim-apps-libs: related libraries.
+kdepim-apps-libs: The kdepim-apps-libs package contains KDE PIM mail related libraries.
+kdepim-apps-libs:
+kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
-kdepim-apps-libs: Home page: http://www.kde.org/
kdepim-apps-libs:
diff --git a/kde/slack-desc/kdepim-runtime b/kde/slack-desc/kdepim-runtime
index cb0ac6e..a3d90b2 100644
--- a/kde/slack-desc/kdepim-runtime
+++ b/kde/slack-desc/kdepim-runtime
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdepim-runtime: kdepim-runtime (KDE Personal Information Management runtime)
kdepim-runtime:
kdepim-runtime: The KDE-PIM project aims to bring together those who wish to help
diff --git a/kde/slack-desc/kdesdk b/kde/slack-desc/kdesdk
index f954a27..5a8b267 100644
--- a/kde/slack-desc/kdesdk
+++ b/kde/slack-desc/kdesdk
@@ -5,11 +5,11 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdesdk: kdesdk (KDE SDK)
kdesdk:
-kdesdk: KDE Software Development Kit. This is a collection of applications
-kdesdk: and tools used to develop on the KDE Platform. It also contains
+kdesdk: KDE Software Development Kit. This is a collection of applications
+kdesdk: and tools used to develop on the KDE Platform. It also contains
kdesdk: example code for use in learning KDE programming or starting a new
kdesdk: KDE application.
kdesdk:
diff --git a/kde/slack-desc/kdesdk-kioslaves b/kde/slack-desc/kdesdk-kioslaves
index 124fa29..2128872 100644
--- a/kde/slack-desc/kdesdk-kioslaves
+++ b/kde/slack-desc/kdesdk-kioslaves
@@ -15,5 +15,5 @@ kdesdk-kioslaves:
kdesdk-kioslaves:
kdesdk-kioslaves:
kdesdk-kioslaves:
-kdesdk-kioslaves: For more information, visit: http://www.kde.org
+kdesdk-kioslaves:
kdesdk-kioslaves:
diff --git a/kde/slack-desc/kdesdk-thumbnailers b/kde/slack-desc/kdesdk-thumbnailers
index 4ff1066..99f75f1 100644
--- a/kde/slack-desc/kdesdk-thumbnailers
+++ b/kde/slack-desc/kdesdk-thumbnailers
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdesdk-thumbnailers: kdesdk-thumbnailers (thumbnailers for KDE)
kdesdk-thumbnailers:
-kdesdk-thumbnailers: Thumbnailers for KDE, including gnu gettext po translation
-kdesdk-thumbnailers: files and gettext translation templates.
+kdesdk-thumbnailers: Thumbnailers for KDE, including gnu gettext po translation files and
+kdesdk-thumbnailers: gettext translation templates.
+kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
-kdesdk-thumbnailers: For more information, visit: http://www.kde.org
kdesdk-thumbnailers:
diff --git a/kde/slack-desc/kdesignerplugin b/kde/slack-desc/kdesignerplugin
index a008191..08d1f04 100644
--- a/kde/slack-desc/kdesignerplugin
+++ b/kde/slack-desc/kdesignerplugin
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdesignerplugin: kdesignerplugin (kdesignerplugin)
+kdesignerplugin: kdesignerplugin (Integrate custom widgets with Qt Designer)
kdesignerplugin:
+kdesignerplugin: This framework provides a utility (kgendesignerplugin) that can be
+kdesignerplugin: used to generate plugins for Qt Designer from ini-style description
+kdesignerplugin: files.
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
-kdesignerplugin:
-kdesignerplugin:
-kdesignerplugin: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdesu b/kde/slack-desc/kdesu
index 91a372c..994ee4f 100644
--- a/kde/slack-desc/kdesu
+++ b/kde/slack-desc/kdesu
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdesu: kdesu (kdesu)
+kdesu: kdesu (run shell commands as root)
kdesu:
+kdesu: KDESU provides functionality for building GUI front ends for (password
+kdesu: asking) console mode programs. For example, kdesu and kdessh use it to
+kdesu: interface with su and ssh respectively.
kdesu:
kdesu:
kdesu:
kdesu:
kdesu:
kdesu:
-kdesu:
-kdesu:
-kdesu: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdeutils b/kde/slack-desc/kdeutils
index 927ac43..91f09b9 100644
--- a/kde/slack-desc/kdeutils
+++ b/kde/slack-desc/kdeutils
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler---------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdeutils: kdeutils (KDE Utilities)
kdeutils:
kdeutils: This package includes utilities for the KDE Software Compilation.
diff --git a/kde/slack-desc/kdewebdev b/kde/slack-desc/kdewebdev
index 294ef22..66b1cc6 100644
--- a/kde/slack-desc/kdewebdev
+++ b/kde/slack-desc/kdewebdev
@@ -5,11 +5,11 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler--------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdewebdev: kdewebdev (web development package for the KDE Platform)
kdewebdev:
-kdewebdev: The kdewebdev package contains applications which are useful for
-kdewebdev: web development.
+kdewebdev: The kdewebdev package contains applications which are useful for web
+kdewebdev: development.
kdewebdev:
kdewebdev:
kdewebdev:
diff --git a/kde/slack-desc/kdewebkit b/kde/slack-desc/kdewebkit
index 7bf1eae..d3f30f4 100644
--- a/kde/slack-desc/kdewebkit
+++ b/kde/slack-desc/kdewebkit
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdewebkit: kdewebkit (kdewebkit)
+kdewebkit: kdewebkit (WebKit rendering engine for KDE)
kdewebkit:
+kdewebkit: This library provides KDE integration of the QtWebKit library. If you
+kdewebkit: are using QtWebKit in your KDE application, you are encouraged to use
+kdewebkit: this layer instead of using the QtWebKit classes directly. In
+kdewebkit: particular, you should use KWebView in place of QWebView,
+kdewebkit: KGraphicsWebView in place of QGraphicsWebView and KWebPage in place of
+kdewebkit: QWebPage. See the documentation for more information.
kdewebkit:
kdewebkit:
kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdf b/kde/slack-desc/kdf
index 896ade4..cb5a935 100644
--- a/kde/slack-desc/kdf
+++ b/kde/slack-desc/kdf
@@ -12,7 +12,7 @@ kdf: kdf (KDiskFree) displays the available file devices (hard drive
kdf: partitions, floppy and CD/DVD drives, etc.) along with information on
kdf: their capacity, free space, type and mount point.
kdf:
-kdf: kdf's home page is: http://utils.kde.org/projects/kdf
+kdf: Homepage: http://utils.kde.org/projects/kdf
kdf:
kdf:
kdf:
diff --git a/kde/slack-desc/kdiagram b/kde/slack-desc/kdiagram
index 7cc07d1..602b4f0 100644
--- a/kde/slack-desc/kdiagram
+++ b/kde/slack-desc/kdiagram
@@ -10,10 +10,10 @@ kdiagram: kdiagram (libraries for creating business diagrams)
kdiagram:
kdiagram: Powerful libraries (KChart, KGantt) for creating business diagrams.
kdiagram:
+kdiagram: Homepage: https://github.com/KDE/kdiagram
kdiagram:
kdiagram:
kdiagram:
kdiagram:
kdiagram:
-kdiagram: For more information, visit: https://github.com/KDE/kdiagram
kdiagram:
diff --git a/kde/slack-desc/kdialog b/kde/slack-desc/kdialog
index a15c57b..43a21c4 100644
--- a/kde/slack-desc/kdialog
+++ b/kde/slack-desc/kdialog
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kdialog: kdialog (utility for displaying dialog boxes from shell scripts)
+kdialog: kdialog (shell dialog box utility)
kdialog:
kdialog: A utility for displaying dialog boxes from shell scripts.
kdialog:
@@ -15,5 +15,5 @@ kdialog:
kdialog:
kdialog:
kdialog:
-kdialog: Home page: http://www.kde.org/
+kdialog:
kdialog:
diff --git a/kde/slack-desc/kdiamond b/kde/slack-desc/kdiamond
index 4c2c7cc..d98f5c9 100644
--- a/kde/slack-desc/kdiamond
+++ b/kde/slack-desc/kdiamond
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdiamond: kdiamond (three-in-a-row game for KDE)
kdiamond:
-kdiamond: KDiamond is a single player puzzle game. The object of the game is
-kdiamond: to build and remove lines of three similar diamonds.
+kdiamond: KDiamond is a single player puzzle game. The object of the game is to
+kdiamond: build and remove lines of three similar diamonds.
+kdiamond:
kdiamond:
kdiamond:
kdiamond:
kdiamond:
kdiamond:
-kdiamond: For more information, visit: http://www.kde.org
kdiamond:
diff --git a/kde/slack-desc/kdnssd b/kde/slack-desc/kdnssd
index 109946e..0a87fba 100644
--- a/kde/slack-desc/kdnssd
+++ b/kde/slack-desc/kdnssd
@@ -15,5 +15,5 @@ kdnssd:
kdnssd:
kdnssd:
kdnssd:
-kdnssd: For more information, visit: http://www.kde.org
+kdnssd:
kdnssd:
diff --git a/kde/slack-desc/kdoctools b/kde/slack-desc/kdoctools
index 15dbb7a..d558b39 100644
--- a/kde/slack-desc/kdoctools
+++ b/kde/slack-desc/kdoctools
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdoctools: kdoctools (kdoctools)
+kdoctools: kdoctools (Create documentation from DocBook)
kdoctools:
+kdoctools: KDocTools provides tools to generate documentation in various formats
+kdoctools: from DocBook files.
kdoctools:
kdoctools:
kdoctools:
@@ -15,5 +17,3 @@ kdoctools:
kdoctools:
kdoctools:
kdoctools:
-kdoctools:
-kdoctools: Homepage: http://kde.org/
diff --git a/kde/slack-desc/keditbookmarks b/kde/slack-desc/keditbookmarks
index 343b621..5f31428 100644
--- a/kde/slack-desc/keditbookmarks
+++ b/kde/slack-desc/keditbookmarks
@@ -15,5 +15,5 @@ keditbookmarks:
keditbookmarks:
keditbookmarks:
keditbookmarks:
-keditbookmarks: Home page: http://www.kde.org/
+keditbookmarks:
keditbookmarks:
diff --git a/kde/slack-desc/kemoticons b/kde/slack-desc/kemoticons
index 7f8ca76..ad2c780 100644
--- a/kde/slack-desc/kemoticons
+++ b/kde/slack-desc/kemoticons
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kemoticons: kemoticons (kemoticons)
+kemoticons: kemoticons (Convert text emoticons to graphical emoticons)
kemoticons:
+kemoticons: KEmoticons converts emoticons from text to a graphical representation
+kemoticons: with images in HTML. It supports setting different themes for
+kemoticons: emoticons coming from different providers.
kemoticons:
kemoticons:
kemoticons:
kemoticons:
kemoticons:
kemoticons:
-kemoticons:
-kemoticons:
-kemoticons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kfilemetadata5 b/kde/slack-desc/kfilemetadata5
index 7798f2f..fda33d6 100644
--- a/kde/slack-desc/kfilemetadata5
+++ b/kde/slack-desc/kfilemetadata5
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kfilemetadata5: kfilemetadata5 (a library for extracting file metadata)
kfilemetadata5:
-kfilemetadata5: kfilemetadata5 is a library for extracting file metadata.
+kfilemetadata5: KFileMetaData provides a simple library for extracting the text and
+kfilemetadata5: metadata from a number of different files. This library is typically
+kfilemetadata5: used by file indexers to retreive the metadata. This library can also
+kfilemetadata5: be used by applications to write metadata.
kfilemetadata5:
kfilemetadata5:
kfilemetadata5:
kfilemetadata5:
kfilemetadata5:
-kfilemetadata5:
-kfilemetadata5: For more information, visit: http://www.kde.org
-kfilemetadata5:
diff --git a/kde/slack-desc/kfind b/kde/slack-desc/kfind
index b2b61a1..d2106ed 100644
--- a/kde/slack-desc/kfind
+++ b/kde/slack-desc/kfind
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kfind: kfind (find files and directories in KDE)
kfind:
-kfind: Find files and directories in KDE.
+kfind: The Find Files tool is a useful method of searching for specific files
+kfind: on your computer, or for searching for files that match a pattern. An
+kfind: example of this could include searching for files of a particular type
+kfind: or with certain letters in the filename, or that contain a certain
+kfind: piece of text in their contents.
kfind:
kfind:
kfind:
kfind:
-kfind:
-kfind:
-kfind: Home page: http://www.kde.org/
-kfind:
diff --git a/kde/slack-desc/kfloppy b/kde/slack-desc/kfloppy
index 761f227..a75d375 100644
--- a/kde/slack-desc/kfloppy
+++ b/kde/slack-desc/kfloppy
@@ -11,7 +11,7 @@ kfloppy:
kfloppy: KFloppy is a utility that provides a straightforward graphical means
kfloppy: to format 3.5" and 5.25" floppy disks.
kfloppy:
-kfloppy: kfloppy's home page is: http://utils.kde.org/projects/kfloppy
+kfloppy: Homepage: http://utils.kde.org/projects/kfloppy
kfloppy:
kfloppy:
kfloppy:
diff --git a/kde/slack-desc/kfourinline b/kde/slack-desc/kfourinline
index 78b18d8..3f34a96 100644
--- a/kde/slack-desc/kfourinline
+++ b/kde/slack-desc/kfourinline
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kfourinline: kfourinline (four-in-a-row board game)
kfourinline:
-kfourinline: KFourInLine is a board game for two players based on the
-kfourinline: Connect-Four game. The players try to build up a row of
-kfourinline: four pieces using different strategies.
+kfourinline: KFourInLine is a board game for two players based on the Connect-Four
+kfourinline: game. The players try to build up a row of four pieces using different
+kfourinline: strategies.
+kfourinline:
kfourinline:
kfourinline:
kfourinline:
kfourinline:
-kfourinline: For more information, visit: http://www.kde.org
kfourinline:
diff --git a/kde/slack-desc/kgamma5 b/kde/slack-desc/kgamma5
index 054342a..8a136ea 100644
--- a/kde/slack-desc/kgamma5
+++ b/kde/slack-desc/kgamma5
@@ -10,7 +10,7 @@ kgamma5: kgamma5 (display gamma configuration)
kgamma5:
kgamma5: A KDE system settings module to configure display gamma.
kgamma5:
-kgamma5: For more information, visit: http://www.kde.org
+kgamma5:
kgamma5:
kgamma5:
kgamma5:
diff --git a/kde/slack-desc/kgeography b/kde/slack-desc/kgeography
index cb03bc5..32ecb64 100644
--- a/kde/slack-desc/kgeography
+++ b/kde/slack-desc/kgeography
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kgeography: kgeography (a geography learning tool)
kgeography:
-kgeography: KGeography is a geography learning tool.
-kgeography: Right now it has three usage modes:
-kgeography: * Browse the maps clicking in a map division to see it's name
-kgeography: * The game tells you a map division name and you have to click on it
-kgeography: * The game shows you a map division flag and you have to guess
-kgeography: its name
+kgeography: KGeography is a geography learning tool with three usage modes:
+kgeography:
+kgeography: Browse the maps clicking in a map division to see it's name.
+kgeography: The game tells you a map division name and you have to click on it.
+kgeography: The game shows you a map division flag and you have to guess its name.
+kgeography:
+kgeography: Homepage: http://kgeography.berlios.de/
kgeography:
-kgeography: For more information, visit: http://kgeography.berlios.de/
kgeography:
diff --git a/kde/slack-desc/kget b/kde/slack-desc/kget
index 3103122..c6a0366 100644
--- a/kde/slack-desc/kget
+++ b/kde/slack-desc/kget
@@ -15,5 +15,5 @@ kget:
kget:
kget:
kget:
-kget: For more information, visit: http://www.kde.org
+kget:
kget:
diff --git a/kde/slack-desc/kglobalaccel b/kde/slack-desc/kglobalaccel
index 2d84ff4..78d77e5 100644
--- a/kde/slack-desc/kglobalaccel
+++ b/kde/slack-desc/kglobalaccel
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kglobalaccel: kglobalaccel (kglobalaccel)
+kglobalaccel: kglobalaccel (Global desktop keyboard shortcuts)
kglobalaccel:
+kglobalaccel: KGlobalAccel allows you to have global accelerators that are
+kglobalaccel: independent of the focused window. Unlike regular shortcuts, the
+kglobalaccel: application's window does not need focus for them to be activated.
kglobalaccel:
kglobalaccel:
kglobalaccel:
kglobalaccel:
kglobalaccel:
kglobalaccel:
-kglobalaccel:
-kglobalaccel:
-kglobalaccel: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kgoldrunner b/kde/slack-desc/kgoldrunner
index 6b067c1..4f31499 100644
--- a/kde/slack-desc/kgoldrunner
+++ b/kde/slack-desc/kgoldrunner
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kgoldrunner: kgoldrunner (Hunt gold, dodge enemies and solve puzzles)
kgoldrunner:
-kgoldrunner: KGoldrunner is a maze-threading game with a puzzle flavor.
-kgoldrunner: It has hundreds of levels where pieces of gold must be collected,
-kgoldrunner: with enemies in hot pursuit.
+kgoldrunner: KGoldrunner is a maze-threading game with a puzzle flavor. It has
+kgoldrunner: hundreds of levels where pieces of gold must be collected, with
+kgoldrunner: enemies in hot pursuit.
+kgoldrunner:
kgoldrunner:
kgoldrunner:
kgoldrunner:
kgoldrunner:
-kgoldrunner: For more information, visit: http://www.kde.org
kgoldrunner:
diff --git a/kde/slack-desc/kgpg b/kde/slack-desc/kgpg
index 51975cd..5dd7769 100644
--- a/kde/slack-desc/kgpg
+++ b/kde/slack-desc/kgpg
@@ -10,7 +10,7 @@ kgpg: kgpg (KDE GUI for GnuPG)
kgpg:
kgpg: KGpg is a simple interface for GnuPG, a powerful encryption utility.
kgpg:
-kgpg: kgpg's home page is: http://utils.kde.org/projects/kgpg
+kgpg: Homepage: http://utils.kde.org/projects/kgpg
kgpg:
kgpg:
kgpg:
diff --git a/kde/slack-desc/kguiaddons b/kde/slack-desc/kguiaddons
index e181d67..afb4ef4 100644
--- a/kde/slack-desc/kguiaddons
+++ b/kde/slack-desc/kguiaddons
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kguiaddons: kguiaddons (kguiaddons)
+kguiaddons: kguiaddons (KDE GUI Addons)
kguiaddons:
+kguiaddons: The KDE GUI addons provide utilities for graphical user interfaces in
+kguiaddons: the areas of colors, fonts, text, images, and keyboard input.
kguiaddons:
kguiaddons:
kguiaddons:
@@ -15,5 +17,3 @@ kguiaddons:
kguiaddons:
kguiaddons:
kguiaddons:
-kguiaddons:
-kguiaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/khangman b/kde/slack-desc/khangman
index eaf9a85..430e0ea 100644
--- a/kde/slack-desc/khangman
+++ b/kde/slack-desc/khangman
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-khangman: khangman (classical hangman game)
+khangman: khangman (hangman game)
khangman:
khangman: KHangman is the classical hangman game. The child should guess a word
-khangman: letter by letter. At each miss, the picture of a hangman appears.
+khangman: letter by letter. At each miss, the picture of a hangman appears.
khangman: After 10 tries, if the word is not guessed, the game is over and
khangman: the answer is displayed.
khangman:
-khangman: For more information, visit: http://edu.kde.org/
+khangman:
khangman:
khangman:
khangman:
diff --git a/kde/slack-desc/khelpcenter b/kde/slack-desc/khelpcenter
index 8fad4a2..0d01cb9 100644
--- a/kde/slack-desc/khelpcenter
+++ b/kde/slack-desc/khelpcenter
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
khelpcenter: khelpcenter (KDE help center)
khelpcenter:
-khelpcenter: The KDE Help Center displays documentation on how to
-khelpcenter: use the KDE plasma workspaces and applications, as
-khelpcenter: well as UNIX man and info pages. It can search through
-khelpcenter: documentation using the 'htdig' package.
+khelpcenter: The KDE Help Center displays documentation on how to use the KDE
+khelpcenter: plasma workspaces and applications, as well as man and info pages.
+khelpcenter: It can search through documentation using the 'htdig' package.
+khelpcenter:
+khelpcenter:
khelpcenter:
khelpcenter:
khelpcenter:
khelpcenter:
-khelpcenter: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kholidays b/kde/slack-desc/kholidays
index 06fa51c..5db18cd 100644
--- a/kde/slack-desc/kholidays
+++ b/kde/slack-desc/kholidays
@@ -9,11 +9,11 @@
kholidays: kholidays (KDE library for regional holiday information)
kholidays:
kholidays: The KHolidays library in kdepimlibs provides details on public
-kholidays: holidays for a given country and date range.
-kholidays: A separate library and file format is required as iCalendar is not
-kholidays: capable of expressing recurrence rules for all possible holidays.
+kholidays: holidays for a given country and date range. A separate library and
+kholidays: file format is required as iCalendar is not capable of expressing
+kholidays: recurrence rules for all possible holidays.
+kholidays:
kholidays:
kholidays:
kholidays:
-kholidays: Home page: http://www.kde.org/
kholidays:
diff --git a/kde/slack-desc/khotkeys b/kde/slack-desc/khotkeys
index e523744..d737837 100644
--- a/kde/slack-desc/khotkeys
+++ b/kde/slack-desc/khotkeys
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-khotkeys: khotkeys (khotkeys)
+khotkeys: khotkeys (custom shortcuts)
+khotkeys:
+khotkeys: The Custom Shortcuts systemsettings module allows you to configure
+khotkeys: custom keyboard shortcuts and mouse gestures. You can use them to
+khotkeys: control applications, run specific commands, and more.
+khotkeys:
khotkeys:
-khotkeys: The Custom Shortcuts systemsettings module allows you to
-khotkeys: configure custom keyboard shortcuts and mouse gestures. You
-khotkeys: can use them to control applications, run specific commands,
-khotkeys: and more.
khotkeys:
khotkeys:
khotkeys:
khotkeys:
-khotkeys: Homepage: http://kde.org/
diff --git a/kde/slack-desc/khtml b/kde/slack-desc/khtml
index 493ed69..b4c4332 100644
--- a/kde/slack-desc/khtml
+++ b/kde/slack-desc/khtml
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-khtml: khtml (khtml)
+khtml: khtml (HTML rendering engine)
khtml:
+khtml: KHTML is a web rendering engine based on the KParts technology and
+khtml: using KJS for JavaScript support.
khtml:
khtml:
khtml:
@@ -15,5 +17,3 @@ khtml:
khtml:
khtml:
khtml:
-khtml:
-khtml: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ki18n b/kde/slack-desc/ki18n
index 8c2e9d3..49b80c2 100644
--- a/kde/slack-desc/ki18n
+++ b/kde/slack-desc/ki18n
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-ki18n: ki18n (ki18n)
+ki18n: ki18n (UI text internationalization)
ki18n:
+ki18n: KI18n provides functionality for internationalizing user interface
+ki18n: text in applications, based on the GNU Gettext translation system.
+ki18n: It wraps the standard Gettext functionality, so that the programmers
+ki18n: and translators can use the familiar Gettext tools and workflows.
+ki18n: KI18n also provides argument capturing, customizable markup, and
+ki18n: translation scripting.
ki18n:
ki18n:
ki18n:
-ki18n:
-ki18n:
-ki18n:
-ki18n:
-ki18n:
-ki18n: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kiconthemes b/kde/slack-desc/kiconthemes
index 69e43fd..44e4d46 100644
--- a/kde/slack-desc/kiconthemes
+++ b/kde/slack-desc/kiconthemes
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kiconthemes: kiconthemes (kiconthemes)
+kiconthemes: kiconthemes (Icon GUI utilities)
kiconthemes:
+kiconthemes: The KIconThemes library contains classes to improve the handling of
+kiconthemes: icons in applications using the KDE Frameworks.
kiconthemes:
kiconthemes:
kiconthemes:
@@ -15,5 +17,3 @@ kiconthemes:
kiconthemes:
kiconthemes:
kiconthemes:
-kiconthemes:
-kiconthemes: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kid3 b/kde/slack-desc/kid3
index 1412fbf..9a2ecc1 100644
--- a/kde/slack-desc/kid3
+++ b/kde/slack-desc/kid3
@@ -9,11 +9,11 @@
kid3: kid3 (audio tagger)
kid3:
kid3: If you want to easily tag multiple MP3, Ogg/Vorbis, FLAC, MPC,
-kid3: MP4/AAC, MP2, Opus, Speex, TrueAudio, WavPack, WMA, WAV and AIFF
-kid3: files (e.g. full albums) without typing the same information
-kid3: again and again and have control over both ID3v1 and ID3v2 tags,
-kid3: then Kid3 is the program you are looking for.
+kid3: MP4/AAC, MP2, Opus, Speex, TrueAudio, WavPack, WMA, WAV and AIFF files
+kid3: (e.g. full albums) without typing the same information again and again
+kid3: and have control over both ID3v1 and ID3v2 tags, then Kid3 is the
+kid3: program you are looking for.
kid3:
+kid3: Homepage: http://kid3.kde.org/
kid3:
-kid3: Home page: http://kid3.kde.org/
kid3:
diff --git a/kde/slack-desc/kidentitymanagement b/kde/slack-desc/kidentitymanagement
index e3f8204..f0c5412 100644
--- a/kde/slack-desc/kidentitymanagement
+++ b/kde/slack-desc/kidentitymanagement
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kidentitymanagement: kidentitymanagement (the KIdentityManagement Library)
+kidentitymanagement: kidentitymanagement (Manage PIM identity)
kidentitymanagement:
kidentitymanagement: kidentitymanagement contains the KIdentityManagement Library.
kidentitymanagement:
@@ -15,5 +15,5 @@ kidentitymanagement:
kidentitymanagement:
kidentitymanagement:
kidentitymanagement:
-kidentitymanagement: Home page: http://www.kde.org/
+kidentitymanagement:
kidentitymanagement:
diff --git a/kde/slack-desc/kidletime b/kde/slack-desc/kidletime
index dd28a29..2116f6b 100644
--- a/kde/slack-desc/kidletime
+++ b/kde/slack-desc/kidletime
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kidletime: kidletime (kidletime)
+kidletime: kidletime (report system/user idle time)
kidletime:
+kidletime: KIdleTime is a singleton reporting information on idle time. It is
+kidletime: useful not only for finding out about the current idle time of the
+kidletime: system, but also for getting notified upon idle time events, such as
+kidletime: custom timeouts or user activity.
kidletime:
kidletime:
kidletime:
kidletime:
kidletime:
-kidletime:
-kidletime:
-kidletime:
-kidletime: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kig b/kde/slack-desc/kig
index 062fa2b..6d53887 100644
--- a/kde/slack-desc/kig
+++ b/kde/slack-desc/kig
@@ -12,7 +12,7 @@ kig: Kig is an application meant to allow high school students to
kig: interactively explore mathematical concepts, much like Dr.Geo, KGeo,
kig: KSeg and Cabri.
kig:
-kig: For more information, visit: http://edu.kde.org/kig/
+kig: Homepage: http://edu.kde.org/kig/
kig:
kig:
kig:
diff --git a/kde/slack-desc/kigo b/kde/slack-desc/kigo
index 3939e01..ec17269 100644
--- a/kde/slack-desc/kigo
+++ b/kde/slack-desc/kigo
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kigo: kigo (Go board game for KDE)
kigo:
-kigo: Kigo is an open-source implementation of the popular Go game.
-kigo: Go is a strategic board game for two players. It is also known as igo
+kigo: Kigo is an open-source implementation of the popular Go game. Go is a
+kigo: strategic board game for two players. It is also known as igo
kigo: (Japanese), weiqi or wei ch'i (Chinese) or baduk (Korean). Go is noted
-kigo: for being rich in strategic complexity despite its simple rules.
-kigo: The game is played by two players who alternately place black and
-kigo: white pieces on the vacant intersections of a grid of 19x19 lines
-kigo: (9x9 or 13x13 for easier games).
+kigo: for being rich in strategic complexity despite its simple rules. The
+kigo: game is played by two players who alternately place black and white
+kigo: pieces on the vacant intersections of a grid of 19x19 lines (9x9 or
+kigo: 13x13 for easier games).
+kigo:
kigo:
-kigo: For more information, visit: http://www.kde.org
diff --git a/kde/slack-desc/kile b/kde/slack-desc/kile
index a6cd1de..e51d9f4 100644
--- a/kde/slack-desc/kile
+++ b/kde/slack-desc/kile
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kile: kile (TeX/LaTeX frontend for Plasma5)
kile:
-kile: kile is a user-friendly TeX/LaTeX editor
-kile: for the KDE desktop environment.
+kile: kile is a user-friendly TeX/LaTeX editor for the KDE desktop environment.
+kile:
+kile: Homepage: https://kile.sourceforge.io
kile:
kile:
kile:
kile:
kile:
-kile: Home page: https://kile.sourceforge.io
kile:
diff --git a/kde/slack-desc/killbots b/kde/slack-desc/killbots
index 6acee05..20c6813 100644
--- a/kde/slack-desc/killbots
+++ b/kde/slack-desc/killbots
@@ -15,5 +15,5 @@ killbots:
killbots:
killbots:
killbots:
-killbots: For more information, visit: http://www.kde.org
+killbots:
killbots:
diff --git a/kde/slack-desc/kimageformats b/kde/slack-desc/kimageformats
index d926b6c..a396e21 100644
--- a/kde/slack-desc/kimageformats
+++ b/kde/slack-desc/kimageformats
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kimageformats: kimageformats (kimageformats)
+kimageformats: kimageformats (QImage format plugins)
kimageformats:
+kimageformats: This framework provides additional image format plugins for QtGui. As
+kimageformats: such it is not required for the compilation of any other software, but
+kimageformats: may be a runtime requirement for Qt-based software to support certain
+kimageformats: image formats.
kimageformats:
kimageformats:
kimageformats:
kimageformats:
kimageformats:
-kimageformats:
-kimageformats:
-kimageformats:
-kimageformats: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kimagemapeditor b/kde/slack-desc/kimagemapeditor
index 83a2fd1..a36dee0 100644
--- a/kde/slack-desc/kimagemapeditor
+++ b/kde/slack-desc/kimagemapeditor
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kimagemapeditor: kimagemapeditor (HTML image map editor)
kimagemapeditor:
-kimagemapeditor: HTML image map editor.
+kimagemapeditor: An HTML image map editor.
+kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
-kimagemapeditor: Home page: http://www.kde.org/
kimagemapeditor:
diff --git a/kde/slack-desc/kimap b/kde/slack-desc/kimap
index dd28481..9348ef0 100644
--- a/kde/slack-desc/kimap
+++ b/kde/slack-desc/kimap
@@ -15,5 +15,5 @@ kimap:
kimap:
kimap:
kimap:
-kimap: Home page: http://www.kde.org/
+kimap:
kimap:
diff --git a/kde/slack-desc/kinfocenter b/kde/slack-desc/kinfocenter
index 27610d9..e3230a3 100644
--- a/kde/slack-desc/kinfocenter
+++ b/kde/slack-desc/kinfocenter
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kinfocenter: kinfocenter (provide information about your computer)
+kinfocenter: kinfocenter (info about your computer)
+kinfocenter:
+kinfocenter: KInfocenter gives you a host of information about your hardware and
+kinfocenter: its capabilities.
kinfocenter:
-kinfocenter: KInfocenter gives you a host of information about your
-kinfocenter: hardware and its capabilities.
kinfocenter:
kinfocenter:
kinfocenter:
kinfocenter:
kinfocenter:
kinfocenter:
-kinfocenter: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kinit b/kde/slack-desc/kinit
index cf11155..fa95f06 100644
--- a/kde/slack-desc/kinit
+++ b/kde/slack-desc/kinit
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kinit: kinit (kinit)
+kinit: kinit (startup helper library)
kinit:
+kinit: kdeinit is a process launcher somewhat similar to the famous init used
+kinit: for booting. It launches processes by forking and then loading a
+kinit: dynamic library which should contain a 'kdemain(...)' function. Using
+kinit: kdeinit to launch KDE applications makes starting a typical KDE
+kinit: application 2.5 times faster and reduces memory consumption.
kinit:
kinit:
kinit:
kinit:
-kinit:
-kinit:
-kinit:
-kinit:
-kinit: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kio b/kde/slack-desc/kio
index 1608c7c..a455bfd 100644
--- a/kde/slack-desc/kio
+++ b/kde/slack-desc/kio
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kio: kio (kio)
+kio: kio (network transparent file library)
kio:
+kio: This framework implements almost all the file management functions you
+kio: will ever need. In fact, the KDE file manager (Dolphin) and the KDE
+kio: file dialog also use this to provide network-enabled file management.
+kio: It supports accessing files locally as well as via HTTP and FTP out of
+kio: the box and can be extended by plugins to support other protocols as
+kio: well. There are a variety of plugins available, e.g. to support access
+kio: via SSH.
kio:
kio:
-kio:
-kio:
-kio:
-kio:
-kio:
-kio:
-kio: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kio-extras b/kde/slack-desc/kio-extras
index bc27db3..1b68693 100644
--- a/kde/slack-desc/kio-extras
+++ b/kde/slack-desc/kio-extras
@@ -8,7 +8,8 @@
|-----handy-ruler------------------------------------------------------|
kio-extras: kio-extras (Additional components for KIO)
kio-extras:
-kio-extras: Additional components to increase the functionality of KIO
+kio-extras: Additional components to increase the functionality of KIO.
+kio-extras:
kio-extras:
kio-extras:
kio-extras:
@@ -16,4 +17,3 @@ kio-extras:
kio-extras:
kio-extras:
kio-extras:
-kio-extras: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kipi-plugins b/kde/slack-desc/kipi-plugins
index 7b4f0e1..0807d60 100644
--- a/kde/slack-desc/kipi-plugins
+++ b/kde/slack-desc/kipi-plugins
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kipi-plugins: kipi-plugins (graphics and image plugins)
kipi-plugins:
+kipi-plugins: A collection of plugins extending the KDE graphics and image
+kipi-plugins: applications.
kipi-plugins:
-kipi-plugins: A collection of plugins extending the KDE graphics and
-kipi-plugins: image applications.
+kipi-plugins: Homepage: https://userbase.kde.org/KIPI
kipi-plugins:
kipi-plugins:
kipi-plugins:
kipi-plugins:
-kipi-plugins: Home page: https://userbase.kde.org/KIPI
kipi-plugins:
diff --git a/kde/slack-desc/kirigami-gallery b/kde/slack-desc/kirigami-gallery
index 33b4fbf..5bc01bc 100644
--- a/kde/slack-desc/kirigami-gallery
+++ b/kde/slack-desc/kirigami-gallery
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kirigami-gallery: kirigami-gallery (Gallery application built using Kirigami)
kirigami-gallery:
-kirigami-gallery: Kirigami-gallery is an example gallery application
-kirigami-gallery: built using Kirigami.
+kirigami-gallery: Kirigami-gallery is an example gallery application built using
+kirigami-gallery: Kirigami.
kirigami-gallery:
+kirigami-gallery: Homepage: https://www.kde.org/products/kirigami/
kirigami-gallery:
kirigami-gallery:
kirigami-gallery:
kirigami-gallery:
-kirigami-gallery: Home page: https://www.kde.org/products/kirigami/
kirigami-gallery:
diff --git a/kde/slack-desc/kirigami2 b/kde/slack-desc/kirigami2
index 5a4c4d8..26b733b 100644
--- a/kde/slack-desc/kirigami2
+++ b/kde/slack-desc/kirigami2
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kirigami2: kirigami2 (interface components for QtQuick)
kirigami2:
+kirigami2: Kirigami is a set of user interface components created to enable the
+kirigami2: creation of pleasant, efficient applications by KDE's Plasma team and
+kirigami2: the KDE Visual Design Group.
+kirigami2:
kirigami2:
-kirigami2: Kirigami is a set of user interface components created to enable
-kirigami2: the creation of pleasant, efficient applications,
-kirigami2: by KDE's Plasma team and the KDE Visual Design Group.
kirigami2:
kirigami2:
kirigami2:
-kirigami2: Home page: http://www.kde.org/
kirigami2:
diff --git a/kde/slack-desc/kiriki b/kde/slack-desc/kiriki
index cc09bbf..d9b70fa 100644
--- a/kde/slack-desc/kiriki
+++ b/kde/slack-desc/kiriki
@@ -9,11 +9,11 @@
kiriki: kiriki (yahtzee-like dice game for KDE)
kiriki:
kiriki: Kiriki is an addictive and fun dice game for KDE, designed to be
-kiriki: played by as many as six players. Participants have to collect points
+kiriki: played by as many as six players. Participants have to collect points
kiriki: by rolling five dice for up to three times per single turn.
kiriki:
kiriki:
kiriki:
kiriki:
-kiriki: For more information, visit: http://www.kde.org
+kiriki:
kiriki:
diff --git a/kde/slack-desc/kitemmodels b/kde/slack-desc/kitemmodels
index 74b7bd2..80daba3 100644
--- a/kde/slack-desc/kitemmodels
+++ b/kde/slack-desc/kitemmodels
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kitemmodels: kitemmodels (kitemmodels)
+kitemmodels: kitemmodels (Qt model-view extensions)
kitemmodels:
+kitemmodels: KItemModels is a set of item models extending the Qt model-view
+kitemmodels: framework.
kitemmodels:
kitemmodels:
kitemmodels:
@@ -15,5 +17,3 @@ kitemmodels:
kitemmodels:
kitemmodels:
kitemmodels:
-kitemmodels:
-kitemmodels: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kitemviews b/kde/slack-desc/kitemviews
index 3f2f2e3..1d6ddb5 100644
--- a/kde/slack-desc/kitemviews
+++ b/kde/slack-desc/kitemviews
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kitemviews: kitemviews (kitemviews)
+kitemviews: kitemviews (Qt item-view extensions)
kitemviews:
+kitemviews: KItemViews includes a set of views, which can be used with item
+kitemviews: models. It includes views for categorizing lists and to add search
+kitemviews: filters to flat and hierarchical lists.
kitemviews:
kitemviews:
kitemviews:
kitemviews:
kitemviews:
kitemviews:
-kitemviews:
-kitemviews:
-kitemviews: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kiten b/kde/slack-desc/kiten
index a2a60f4..7af04b3 100644
--- a/kde/slack-desc/kiten
+++ b/kde/slack-desc/kiten
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kiten: kiten (a tool to learn Japanese)
-kiten:
-kiten: Kiten is a tool to learn Japanese.
-kiten:
-kiten: For more information, visit: http://edu.kde.org/
-kiten:
+kiten: kiten (Japanese reference tool)
kiten:
+kiten: Kiten is a Japanese reference tool. Kiten works mainly as a Japanese
+kiten: -> English dictionary, but it works from English -> Japanese too. This
+kiten: means you can write in English, Hiragana, Katakana, or Kanji to search
+kiten: in the dictionaries.
kiten:
+kiten: Homepage: https://www.kde.org/applications/education/kiten
kiten:
kiten:
kiten:
diff --git a/kde/slack-desc/kitinerary b/kde/slack-desc/kitinerary
index b6c9781..e6f9556 100644
--- a/kde/slack-desc/kitinerary
+++ b/kde/slack-desc/kitinerary
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kitinerary: kitinerary (library for itinerary data model/extraction)
+kitinerary: kitinerary (library for itinerary data)
kitinerary:
kitinerary: Data model and extraction system for travel reservation information.
kitinerary:
+kitinerary: Homepage: https://api.kde.org/kdepim/kitinerary/html/index.html
kitinerary:
kitinerary:
kitinerary:
kitinerary:
kitinerary:
-kitinerary: Home page: https://community.kde.org/KDE_PIM
kitinerary:
diff --git a/kde/slack-desc/kjobwidgets b/kde/slack-desc/kjobwidgets
index b775eb1..917f069 100644
--- a/kde/slack-desc/kjobwidgets
+++ b/kde/slack-desc/kjobwidgets
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kjobwidgets: kjobwidgets (kjobwidgets)
+kjobwidgets: kjobwidgets (job progress widgets)
kjobwidgets:
+kjobwidgets: KJobWIdgets provides widgets for showing progress of asynchronous
+kjobwidgets: jobs.
kjobwidgets:
kjobwidgets:
kjobwidgets:
@@ -15,5 +17,3 @@ kjobwidgets:
kjobwidgets:
kjobwidgets:
kjobwidgets:
-kjobwidgets:
-kjobwidgets: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kjots b/kde/slack-desc/kjots
index fed98a0..f5c10e1 100644
--- a/kde/slack-desc/kjots
+++ b/kde/slack-desc/kjots
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kjots: kjots (KDE note-taking application)
kjots:
-kjots: KJots is a note-taking application that used to be part of KDE PIM
-kjots: back in KDE4 times.
-kjots: KJots organises all of your notes into separate books.
+kjots: KJots is a note-taking application that organises all of your notes
+kjots: into separate books.
+kjots:
+kjots: Homepage: https://www.kde.org/applications/utilities/kjots/
kjots:
kjots:
kjots:
kjots:
-kjots: For more information, visit: https://www.kde.org/applications/utilities/kjots/
kjots:
diff --git a/kde/slack-desc/kjs b/kde/slack-desc/kjs
index 57a424d..1c0249a 100644
--- a/kde/slack-desc/kjs
+++ b/kde/slack-desc/kjs
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kjs: kjs (kjs)
+kjs: kjs (Javascript engine)
kjs:
+kjs: The KJS library provides an ECMAScript compatible interpreter. The
+kjs: ECMA standard is based on well known scripting languages such as
+kjs: Mozilla's JavaScript and Microsoft's JScript.
kjs:
kjs:
kjs:
kjs:
kjs:
kjs:
-kjs:
-kjs:
-kjs: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kjsembed b/kde/slack-desc/kjsembed
index a8c3d7a..3344b54 100644
--- a/kde/slack-desc/kjsembed
+++ b/kde/slack-desc/kjsembed
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kjsembed: kjsembed (kjsembed)
+kjsembed: kjsembed (Binding Javascript to QObjects)
kjsembed:
+kjsembed: KSJEmbed provides a method of binding JavaScript objects to QObjects
+kjsembed: so you can script your applications.
kjsembed:
kjsembed:
kjsembed:
@@ -15,5 +17,3 @@ kjsembed:
kjsembed:
kjsembed:
kjsembed:
-kjsembed:
-kjsembed: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kjumpingcube b/kde/slack-desc/kjumpingcube
index e8646f9..3911331 100644
--- a/kde/slack-desc/kjumpingcube
+++ b/kde/slack-desc/kjumpingcube
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kjumpingcube: kjumpingcube (territory capture game)
kjumpingcube:
-kjumpingcube: KJumpingcube is a simple dice driven tactical game.
-kjumpingcube: The playing area consists of squares containing points.
-kjumpingcube: Players move by clicking on either a vacant square,
-kjumpingcube: or on one of their own squares.
+kjumpingcube: KJumpingcube is a simple dice driven tactical game. The playing area
+kjumpingcube: consists of squares containing points. Players move by clicking on
+kjumpingcube: either a vacant square, or on one of their own squares.
+kjumpingcube:
+kjumpingcube:
kjumpingcube:
kjumpingcube:
kjumpingcube:
-kjumpingcube: For more information, visit: http://www.kde.org
kjumpingcube:
diff --git a/kde/slack-desc/kldap b/kde/slack-desc/kldap
index bc98613..e03ccc5 100644
--- a/kde/slack-desc/kldap
+++ b/kde/slack-desc/kldap
@@ -15,5 +15,5 @@ kldap:
kldap:
kldap:
kldap:
-kldap: Home page: http://www.kde.org/
+kldap:
kldap:
diff --git a/kde/slack-desc/kleopatra b/kde/slack-desc/kleopatra
index 0c83801..cbd33bf 100644
--- a/kde/slack-desc/kleopatra
+++ b/kde/slack-desc/kleopatra
@@ -15,5 +15,5 @@ kleopatra:
kleopatra:
kleopatra:
kleopatra:
-kleopatra: Home page: http://www.kde.org/
+kleopatra:
kleopatra:
diff --git a/kde/slack-desc/klettres b/kde/slack-desc/klettres
index d1bb370..c098d4c 100644
--- a/kde/slack-desc/klettres
+++ b/kde/slack-desc/klettres
@@ -9,11 +9,11 @@
klettres: klettres (language learning program)
klettres:
klettres: KLettres aims to help to learn the alphabet and then to read some
-klettres: syllables in different languages.
-klettres: It is meant to help learning the very first sounds of a new language,
-klettres: for children or for adults.
+klettres: syllables in different languages. It is meant to help learning the
+klettres: very first sounds of a new language, for children or for adults.
+klettres:
+klettres: Homepage: http://edu.kde.org/klettres
klettres:
-klettres: For more information, visit: http://edu.kde.org/klettres
klettres:
klettres:
klettres:
diff --git a/kde/slack-desc/klickety b/kde/slack-desc/klickety
index e35b2a3..f58f944 100644
--- a/kde/slack-desc/klickety
+++ b/kde/slack-desc/klickety
@@ -9,11 +9,11 @@
klickety: klickety (strategy game)
klickety:
klickety: Klickety is a strategy game for KDE, an adaption of the Clickomania
-klickety: game.
-klickety: The rules are similar to those of the Same game: your goal is to clear
-klickety: the board by clicking on groups to destroy them.
+klickety: game. The rules are similar to those of the Same game: your goal is to
+klickety: clear the board by clicking on groups to destroy them.
+klickety:
+klickety:
klickety:
klickety:
klickety:
-klickety: For more information, visit: http://www.kde.org
klickety:
diff --git a/kde/slack-desc/klines b/kde/slack-desc/klines
index 193eee1..0e0b9e7 100644
--- a/kde/slack-desc/klines
+++ b/kde/slack-desc/klines
@@ -10,10 +10,10 @@ klines: klines (tactical game for KDE)
klines:
klines: KLines is a simple but highly addictive, one player game for KDE.
klines: KLines has been inspired by well known game of Color Lines, written
-klines: by Olga Demina, Igor Ivkin and Gennady Denisov back in 1992.
-klines: You can also play an online demo version of this game.
+klines: by Olga Demina, Igor Ivkin and Gennady Denisov back in 1992. You can
+klines: also play an online demo version of this game.
+klines:
klines:
klines:
klines:
-klines: For more information, visit: http://www.kde.org
klines:
diff --git a/kde/slack-desc/kmag b/kde/slack-desc/kmag
index b054802..5f85cd6 100644
--- a/kde/slack-desc/kmag
+++ b/kde/slack-desc/kmag
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
kmag: kmag (Screen magnifier)
kmag:
-kmag: Magnifies a part of your screen.
-kmag:
-kmag: For more information, visit: http://www.kde.org
-kmag:
+kmag: KMag is a small utility for Linux to magnify a part of the screen.
+kmag: KMag is very useful for people with visual disabilities and for those
+kmag: working in the fields of image analysis, web development etc.
kmag:
+kmag: Homepage: https://kde.org/applications/utilities/org.kde.kmag
kmag:
kmag:
kmag:
diff --git a/kde/slack-desc/kmahjongg b/kde/slack-desc/kmahjongg
index cd653a9..bb73c98 100644
--- a/kde/slack-desc/kmahjongg
+++ b/kde/slack-desc/kmahjongg
@@ -9,11 +9,11 @@
kmahjongg: kmahjongg (KDE port of Mahjongg game)
kmahjongg:
kmahjongg: KMahjongg is a clone of the well known tile based patience game of
-kmahjongg: the same name. In the game you have to empty a game board filled
-kmahjongg: with pieces, by pairwise removal of pieces of the same type.
+kmahjongg: the same name. In the game you have to empty a game board filled with
+kmahjongg: pieces, by pairwise removal of pieces of the same type.
+kmahjongg:
kmahjongg:
kmahjongg:
kmahjongg:
kmahjongg:
-kmahjongg: For more information, visit: http://www.kde.org
kmahjongg:
diff --git a/kde/slack-desc/kmail b/kde/slack-desc/kmail
index d4f3849..9fa9a89 100644
--- a/kde/slack-desc/kmail
+++ b/kde/slack-desc/kmail
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmail: kmail (KDE mail client)
kmail:
-kmail: KDE e-mail client.
+kmail: KMail is a state-of-the-art email client that integrates well with
+kmail: widely used email providers like GMail. It provides many tools and
+kmail: features to maximize your productivity and makes working with large
+kmail: email accounts easy and fast. KMail supports a large variety of email
+kmail: protocols - POP3, IMAP, Microsoft Exchange (EWS) and more.
+kmail:
+kmail: Homepage: https://kde.org/applications/en/internet/org.kde.kmail2
kmail:
kmail:
-kmail:
-kmail:
-kmail:
-kmail:
-kmail: Home page: http://www.kde.org/
-kmail:
diff --git a/kde/slack-desc/kmail-account-wizard b/kde/slack-desc/kmail-account-wizard
index eeacecb..d7693d4 100644
--- a/kde/slack-desc/kmail-account-wizard
+++ b/kde/slack-desc/kmail-account-wizard
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmail-account-wizard: kmail-account-wizard (KMail account wizard)
kmail-account-wizard:
-kmail-account-wizard: KMail account wizard.
+kmail-account-wizard: This is a setup wizard for KMail that will take you through the
+kmail-account-wizard: process of creating your email accounts.
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
-kmail-account-wizard: Home page: http://www.kde.org/
kmail-account-wizard:
diff --git a/kde/slack-desc/kmailtransport b/kde/slack-desc/kmailtransport
index 644708e..6d5a8c4 100644
--- a/kde/slack-desc/kmailtransport
+++ b/kde/slack-desc/kmailtransport
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmailtransport: kmailtransport (mail transport service)
kmailtransport:
-kmailtransport: Mail Transport Service for KDE.
+kmailtransport: Mail Transport Service for KMail.
+kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
-kmailtransport: Home page: http://www.kde.org/
kmailtransport:
diff --git a/kde/slack-desc/kmbox b/kde/slack-desc/kmbox
index 46f26a5..cea25c1 100644
--- a/kde/slack-desc/kmbox
+++ b/kde/slack-desc/kmbox
@@ -15,5 +15,5 @@ kmbox:
kmbox:
kmbox:
kmbox:
-kmbox: Home page: http://www.kde.org/
+kmbox:
kmbox:
diff --git a/kde/slack-desc/kmediaplayer b/kde/slack-desc/kmediaplayer
index e6e4a37..3aaa39e 100644
--- a/kde/slack-desc/kmediaplayer
+++ b/kde/slack-desc/kmediaplayer
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kmediaplayer: kmediaplayer (kmediaplayer)
+kmediaplayer: kmediaplayer (Interface for media player KParts)
kmediaplayer:
+kmediaplayer: KMediaPlayer builds on the KParts framework to provide a common
+kmediaplayer: interface for KParts that can play media files.
kmediaplayer:
kmediaplayer:
kmediaplayer:
@@ -15,5 +17,3 @@ kmediaplayer:
kmediaplayer:
kmediaplayer:
kmediaplayer:
-kmediaplayer:
-kmediaplayer: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kmenuedit b/kde/slack-desc/kmenuedit
index 97df6b0..5e76543 100644
--- a/kde/slack-desc/kmenuedit
+++ b/kde/slack-desc/kmenuedit
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmenuedit: kmenuedit (XDG menu editor)
kmenuedit:
-kmenuedit: This package provides a menu editor which may be used to
-kmenuedit: edit the KDE Plasma workspaces menu or any other XDG menu.
+kmenuedit: This package provides a menu editor which may be used to edit the KDE
+kmenuedit: Plasma workspaces menu or any other XDG menu.
+kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
-kmenuedit: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kmime b/kde/slack-desc/kmime
index d1ba959..761ff0c 100644
--- a/kde/slack-desc/kmime
+++ b/kde/slack-desc/kmime
@@ -15,5 +15,5 @@ kmime:
kmime:
kmime:
kmime:
-kmime: Home page: http://www.kde.org/
+kmime:
kmime:
diff --git a/kde/slack-desc/kmines b/kde/slack-desc/kmines
index 16981d2..bb7b09a 100644
--- a/kde/slack-desc/kmines
+++ b/kde/slack-desc/kmines
@@ -9,11 +9,11 @@
kmines: kmines (minesweeper clone for KDE)
kmines:
kmines: KMines is the classic Minesweeper game. The idea is to uncover all
-kmines: the squares without blowing up any mines. When a mine is blown up,
+kmines: the squares without blowing up any mines. When a mine is blown up,
kmines: the game is over.
kmines:
kmines:
kmines:
kmines:
-kmines: For more information, visit: http://www.kde.org
+kmines:
kmines:
diff --git a/kde/slack-desc/kmix b/kde/slack-desc/kmix
index 0325cdb..fd0feed 100644
--- a/kde/slack-desc/kmix
+++ b/kde/slack-desc/kmix
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmix: kmix (sound mixer)
kmix:
-kmix: KMix is an application to allow you to change the volume of your
-kmix: sound card. Though small, it is full-featured, and it supports
-kmix: several platforms and sound drivers.
+kmix: KMix is an application to allow you to change the volume of your sound
+kmix: card. Though small, it is full-featured, and it supports several
+kmix: platforms and sound drivers.
+kmix:
kmix:
kmix:
kmix:
kmix:
-kmix: For more information, visit: http://www.kde.org
kmix:
diff --git a/kde/slack-desc/kmousetool b/kde/slack-desc/kmousetool
index 017c312..95ab30e 100644
--- a/kde/slack-desc/kmousetool
+++ b/kde/slack-desc/kmousetool
@@ -10,7 +10,7 @@ kmousetool: kmousetool (Automatic mouse clicks)
kmousetool:
kmousetool: Clicks the mouse for you, reducing hand strain.
kmousetool:
-kmousetool: For more information, visit: http://www.kde.org
+kmousetool:
kmousetool:
kmousetool:
kmousetool:
diff --git a/kde/slack-desc/kmouth b/kde/slack-desc/kmouth
index 8bdac0f..46ed334 100644
--- a/kde/slack-desc/kmouth
+++ b/kde/slack-desc/kmouth
@@ -8,9 +8,9 @@
|-----handy-ruler------------------------------------------------------|
kmouth: kmouth (Speech synthesis frontend)
kmouth:
-kmouth: The computer "speaks" the entered text for talking with people.
+kmouth: The computer speaks the entered text for talking with people.
+kmouth:
kmouth:
-kmouth: For more information, visit: http://www.kde.org
kmouth:
kmouth:
kmouth:
diff --git a/kde/slack-desc/kmplot b/kde/slack-desc/kmplot
index 91472c5..f55995b 100644
--- a/kde/slack-desc/kmplot
+++ b/kde/slack-desc/kmplot
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmplot: kmplot (a mathematical function plotter)
kmplot:
-kmplot: KmPlot is a mathematical function plotter for the KDE-Desktop.
-kmplot: It has a built-in powerful parser. You can plot different functions
+kmplot: KmPlot is a mathematical function plotter for the KDE-Desktop. It has
+kmplot: a built-in powerful parser. You can plot different functions
kmplot: simultaneously and combine them into new functions. KmPlot supports
kmplot: functions with parameters and functions in polar coordinates.
-kmplot: Several grid modes are possible.
-kmplot: Plots may be printed with high precision in correct scale.
+kmplot: Several grid modes are possible. Plots may be printed with high
+kmplot: precision in correct scale.
+kmplot:
kmplot:
-kmplot: For more information, visit: http://edu.kde.org/
kmplot:
diff --git a/kde/slack-desc/kmymoney b/kde/slack-desc/kmymoney
index c71822a..f4cb76d 100644
--- a/kde/slack-desc/kmymoney
+++ b/kde/slack-desc/kmymoney
@@ -9,11 +9,11 @@
kmymoney: kmymoney (personal finance manager)
kmymoney:
kmymoney: KMymoney is a personal finance manager for KDE which operates
-kmymoney: similarly to MS-Money or Quicken.
+kmymoney: similarly to Microsoft Money or Quicken.
kmymoney:
+kmymoney: Home page: https://kmymoney.org/
kmymoney:
kmymoney:
kmymoney:
kmymoney:
-kmymoney: Home page: https://kmymoney.org/
kmymoney:
diff --git a/kde/slack-desc/knavalbattle b/kde/slack-desc/knavalbattle
index a6058c5..5d32bdd 100644
--- a/kde/slack-desc/knavalbattle
+++ b/kde/slack-desc/knavalbattle
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
knavalbattle: knavalbattle (KDE version of battleship game)
knavalbattle:
-knavalbattle: KNavalBattle is a battleship game with built-in game server.
-knavalbattle: Ships are placed on a board which represents the sea. Players try
-knavalbattle: to hit each others ships in turns without knowing where they are
-knavalbattle: placed. The first player to destroy all ships wins the game.
+knavalbattle: KNavalBattle is a battleship game with built-in game server. Ships are
+knavalbattle: placed on a board which represents the sea. Players try to hit each
+knavalbattle: others ships in turns without knowing where they are placed. The first
+knavalbattle: player to destroy all ships wins the game.
+knavalbattle:
knavalbattle:
knavalbattle:
knavalbattle:
-knavalbattle: For more information, visit: http://www.kde.org
knavalbattle:
diff --git a/kde/slack-desc/knetwalk b/kde/slack-desc/knetwalk
index df4b9bb..3b99622 100644
--- a/kde/slack-desc/knetwalk
+++ b/kde/slack-desc/knetwalk
@@ -15,5 +15,5 @@ knetwalk:
knetwalk:
knetwalk:
knetwalk:
-knetwalk: For more information, visit: http://www.kde.org
+knetwalk:
knetwalk:
diff --git a/kde/slack-desc/knewstuff b/kde/slack-desc/knewstuff
index 4fedf07..55f5b4d 100644
--- a/kde/slack-desc/knewstuff
+++ b/kde/slack-desc/knewstuff
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-knewstuff: knewstuff (knewstuff)
+knewstuff: knewstuff (data sharing framework)
knewstuff:
+knewstuff: The KNewStuff library implements collaborative data sharing for
+knewstuff: applications. It uses libattica to support the Open Collaboration
+knewstuff: Services specification.
knewstuff:
knewstuff:
knewstuff:
knewstuff:
knewstuff:
knewstuff:
-knewstuff:
-knewstuff:
-knewstuff: Homepage: http://kde.org/
diff --git a/kde/slack-desc/knights b/kde/slack-desc/knights
index 85ed8b6..0595278 100644
--- a/kde/slack-desc/knights
+++ b/kde/slack-desc/knights
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-knights: knights (Chess board by KDE with XBoard protocol support)
+knights: knights (Chess board with XBoard protocol support)
knights:
-knights: KNights is a chess game. As a player, your goal is to defeat
-knights: your opponent by checkmating their king.
+knights: KNights is a chess game. As a player, your goal is to defeat your
+knights: opponent by checkmating their king.
knights:
+knights: Homepage: https://www.kde.org/applications/games/knights/
knights:
knights:
knights:
knights:
-knights: Home page: https://www.kde.org/applications/games/knights/
knights:
diff --git a/kde/slack-desc/knotes b/kde/slack-desc/knotes
index 5e3b6ae..94be5d5 100644
--- a/kde/slack-desc/knotes
+++ b/kde/slack-desc/knotes
@@ -15,5 +15,5 @@ knotes:
knotes:
knotes:
knotes:
-knotes: Home page: http://www.kde.org/
+knotes:
knotes:
diff --git a/kde/slack-desc/knotifications b/kde/slack-desc/knotifications
index 410e351..351bf41 100644
--- a/kde/slack-desc/knotifications
+++ b/kde/slack-desc/knotifications
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-knotifications: knotifications (knotifications)
+knotifications: knotifications (Desktop notifications)
knotifications:
+knotifications: KNotifications is used to notify the user of an event. It covers
+knotifications: feedback and persistent events.
knotifications:
knotifications:
knotifications:
@@ -15,5 +17,3 @@ knotifications:
knotifications:
knotifications:
knotifications:
-knotifications:
-knotifications: Homepage: http://kde.org/
diff --git a/kde/slack-desc/knotifyconfig b/kde/slack-desc/knotifyconfig
index 477a3bd..dab8ee6 100644
--- a/kde/slack-desc/knotifyconfig
+++ b/kde/slack-desc/knotifyconfig
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-knotifyconfig: knotifyconfig (knotifyconfig)
+knotifyconfig: knotifyconfig (configure notifications)
knotifyconfig:
+knotifyconfig: KNotifyConfig provides a configuration dialog for desktop
+knotifyconfig: notifications which can be embedded in your application.
knotifyconfig:
knotifyconfig:
knotifyconfig:
@@ -15,5 +17,3 @@ knotifyconfig:
knotifyconfig:
knotifyconfig:
knotifyconfig:
-knotifyconfig:
-knotifyconfig: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kolf b/kde/slack-desc/kolf
index a198a8b..f4a235c 100644
--- a/kde/slack-desc/kolf
+++ b/kde/slack-desc/kolf
@@ -9,11 +9,11 @@
kolf: kolf (miniature golf game for KDE)
kolf:
kolf: Kolf is a miniature golf game. The game is played from an overhead
-kolf: view, with a short bar representing the golf club. Kolf features many
+kolf: view, with a short bar representing the golf club. Kolf features many
kolf: different types of objects, such water hazards, slopes, sand traps,
kolf: and black holes (warps), among others.
kolf:
kolf:
kolf:
-kolf: For more information, visit: http://www.kde.org
+kolf:
kolf:
diff --git a/kde/slack-desc/kollision b/kde/slack-desc/kollision
index e0b4a2a..9fa3779 100644
--- a/kde/slack-desc/kollision
+++ b/kde/slack-desc/kollision
@@ -15,5 +15,5 @@ kollision:
kollision:
kollision:
kollision:
-kollision: For more information, visit: http://www.kde.org
+kollision:
kollision:
diff --git a/kde/slack-desc/kolourpaint b/kde/slack-desc/kolourpaint
index 210c649..a692534 100644
--- a/kde/slack-desc/kolourpaint
+++ b/kde/slack-desc/kolourpaint
@@ -16,4 +16,4 @@ kolourpaint: * Image Manipulation - editing screenshots and photos, and
kolourpaint: applying effects
kolourpaint: * Icon Editing - drawing clipart and logos with transparency.
kolourpaint:
-kolourpaint: For more information, visit: http://www.kde.org
+kolourpaint:
diff --git a/kde/slack-desc/kompare b/kde/slack-desc/kompare
index aaa9b3e..6785e92 100644
--- a/kde/slack-desc/kompare
+++ b/kde/slack-desc/kompare
@@ -15,5 +15,5 @@ kompare:
kompare:
kompare:
kompare:
-kompare: For more information, visit: http://www.kde.org
+kompare:
kompare:
diff --git a/kde/slack-desc/konqueror b/kde/slack-desc/konqueror
index 5bb23b3..528e03b 100644
--- a/kde/slack-desc/konqueror
+++ b/kde/slack-desc/konqueror
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-konqueror: konqueror (KDE filemanager and webbrowser)
+konqueror: konqueror (web browser and file manager)
konqueror:
-konqueror: KDE filemanager & webbrowser.
+konqueror: Konqueror is a web browser and file manager that provides web access
+konqueror: and file-viewer functionality for file systems (such as local files,
+konqueror: files on a remote server, and files in a disk image).
konqueror:
+konqueror: Homepage: https://kde.org/applications/internet/org.kde.konqueror
konqueror:
konqueror:
konqueror:
konqueror:
-konqueror:
-konqueror: Home page: http://www.kde.org/
-konqueror:
diff --git a/kde/slack-desc/konquest b/kde/slack-desc/konquest
index e26e474..aa07298 100644
--- a/kde/slack-desc/konquest
+++ b/kde/slack-desc/konquest
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
konquest: konquest (KDE version of Gnu-Lactic Konquest)
konquest:
-konquest: This the KDE version of Gnu-Lactic Konquest, a multi-player
-konquest: strategy game. The goal of the game is to expand your
-konquest: interstellar empire across the galaxy.
+konquest: This the KDE version of Gnu-Lactic Konquest, a multi-player strategy
+konquest: game. The goal of the game is to expand your interstellar empire
+konquest: across the galaxy.
+konquest:
konquest:
konquest:
konquest:
konquest:
-konquest: For more information, visit: http://www.kde.org
konquest:
diff --git a/kde/slack-desc/konsole b/kde/slack-desc/konsole
index 31cfa2c..eca81ed 100644
--- a/kde/slack-desc/konsole
+++ b/kde/slack-desc/konsole
@@ -5,12 +5,12 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
konsole: konsole (KDE's terminal emulator)
konsole:
-konsole: Konsole is KDE's terminal emulator.
+konsole: Konsole is a powerful and customizable terminal emulator.
konsole:
-konsole: Homepage: http://kde.org
+konsole: Homepage: https://konsole.kde.org
konsole:
konsole:
konsole:
diff --git a/kde/slack-desc/kontact b/kde/slack-desc/kontact
index 491345a..06699bc 100644
--- a/kde/slack-desc/kontact
+++ b/kde/slack-desc/kontact
@@ -15,5 +15,5 @@ kontact:
kontact:
kontact:
kontact:
-kontact: Home page: http://www.kde.org/
+kontact:
kontact:
diff --git a/kde/slack-desc/kontactinterface b/kde/slack-desc/kontactinterface
index 427f9f1..ce6c0fe 100644
--- a/kde/slack-desc/kontactinterface
+++ b/kde/slack-desc/kontactinterface
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kontactinterface: kontactinterface (kontact plugin interface library)
kontactinterface:
-kontactinterface: kontactinterface is a library for embedding KParts
-kontactinterface: in a Kontact component.
+kontactinterface: kontactinterface is a library for embedding KParts in a Kontact
+kontactinterface: component.
+kontactinterface:
kontactinterface:
kontactinterface:
kontactinterface:
kontactinterface:
kontactinterface:
-kontactinterface: Home page: http://www.kde.org/
kontactinterface:
diff --git a/kde/slack-desc/kopete b/kde/slack-desc/kopete
index cc7b440..442398b 100644
--- a/kde/slack-desc/kopete
+++ b/kde/slack-desc/kopete
@@ -13,7 +13,7 @@ kopete: use interface between all of their instant messaging systems, but at
kopete: the same time also providing developers with the ease of writing
kopete: plugins to support a new protocol.
kopete:
+kopete: Homepage: http://userbase.kde.org/Kopete
kopete:
kopete:
-kopete: For more information, visit: http://userbase.kde.org/Kopete
kopete:
diff --git a/kde/slack-desc/korganizer b/kde/slack-desc/korganizer
index f270504..2e3733e 100644
--- a/kde/slack-desc/korganizer
+++ b/kde/slack-desc/korganizer
@@ -15,5 +15,5 @@ korganizer:
korganizer:
korganizer:
korganizer:
-korganizer: Home page: http://www.kde.org/
+korganizer:
korganizer:
diff --git a/kde/slack-desc/kpackage b/kde/slack-desc/kpackage
index da3540c..f5ba851 100644
--- a/kde/slack-desc/kpackage
+++ b/kde/slack-desc/kpackage
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kpackage: kpackage (KDE application package manager)
kpackage:
-kpackage: KPackage is a KDE 5 Framework that lets applications manage
-kpackage: user installable packages of non-binary assets.
+kpackage: KPackage is a KDE 5 Framework that lets applications manage user
+kpackage: installable packages of non-binary assets.
+kpackage:
kpackage:
kpackage:
kpackage:
kpackage:
kpackage:
-kpackage: For more information, visit: http://www.kde.org
kpackage:
diff --git a/kde/slack-desc/kparts b/kde/slack-desc/kparts
index 9236154..aa3a28c 100644
--- a/kde/slack-desc/kparts
+++ b/kde/slack-desc/kparts
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kparts: kparts (kparts)
+kparts: kparts (UI framework)
kparts:
+kparts: The KParts library implements the framework for KDE parts, which are
+kparts: elaborate widgets with a user-interface defined in terms of actions
+kparts: (menu items, toolbar icons).
kparts:
kparts:
kparts:
kparts:
kparts:
kparts:
-kparts:
-kparts:
-kparts: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kpat b/kde/slack-desc/kpat
index 08a8439..0d072f3 100644
--- a/kde/slack-desc/kpat
+++ b/kde/slack-desc/kpat
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kpat: kpat (patience card game for KDE)
kpat:
-kpat: KPat (aka KPatience) is a relaxing card sorting game. To win the game
+kpat: KPat (aka KPatience) is a relaxing card sorting game. To win the game
kpat: a player has to arrange a single deck of cards in certain order
kpat: amongst each other.
kpat:
kpat:
kpat:
kpat:
-kpat: For more information, visit: http://www.kde.org
+kpat:
kpat:
diff --git a/kde/slack-desc/kpeople b/kde/slack-desc/kpeople
index eae7067..f4475e7 100644
--- a/kde/slack-desc/kpeople
+++ b/kde/slack-desc/kpeople
@@ -10,10 +10,10 @@ kpeople: kpeople (library providing access to your contacts)
kpeople:
kpeople: KPeople Provides access to all contacts and aggregates them by person.
kpeople: KPeople offers unified access to our contacts from different sources,
-kpeople: grouping them by person while still exposing all the data.
-kpeople: The sources are plugin-based, allowing to easily extend the contacts
-kpeople: collection.
+kpeople: grouping them by person while still exposing all the data. The sources
+kpeople: are plugin-based, allowing to easily extend the contacts collection.
+kpeople:
+kpeople:
kpeople:
kpeople:
-kpeople: For more information, visit: http://www.kpepim.org
kpeople:
diff --git a/kde/slack-desc/kpeoplevcard b/kde/slack-desc/kpeoplevcard
index 2732461..6345754 100644
--- a/kde/slack-desc/kpeoplevcard
+++ b/kde/slack-desc/kpeoplevcard
@@ -15,5 +15,5 @@ kpeoplevcard:
kpeoplevcard:
kpeoplevcard:
kpeoplevcard:
-kpeoplevcard: Home page: http://www.kde.org/
+kpeoplevcard:
kpeoplevcard:
diff --git a/kde/slack-desc/kpimtextedit b/kde/slack-desc/kpimtextedit
index 191317f..dbca188 100644
--- a/kde/slack-desc/kpimtextedit
+++ b/kde/slack-desc/kpimtextedit
@@ -10,10 +10,10 @@ kpimtextedit: kpimtextedit (textedit with PIM-specific features)
kpimtextedit:
kpimtextedit: KPIMTextedit is a library that provides an enchanced text edit class,
kpimtextedit: see TextEdit. This text is highlighted with a EMailQuoteHighlighter.
-kpimtextedit: It also provides so-called rich text builders, that can convert
-kpimtextedit: the formatted text in the text edit to all kinds of markup,
-kpimtextedit: like HTML or BBCODE.
+kpimtextedit: It also provides so-called rich text builders, that can convert the
+kpimtextedit: formatted text in the text edit to all kinds of markup, like HTML or
+kpimtextedit: BBCODE.
+kpimtextedit:
kpimtextedit:
kpimtextedit:
-kpimtextedit: Home page: http://www.kde.org/
kpimtextedit:
diff --git a/kde/slack-desc/kpkpass b/kde/slack-desc/kpkpass
index 7de8e94..42ccece 100644
--- a/kde/slack-desc/kpkpass
+++ b/kde/slack-desc/kpkpass
@@ -15,5 +15,5 @@ kpkpass:
kpkpass:
kpkpass:
kpkpass:
-kpkpass: Home page: https://community.kde.org/KDE_PIM
+kpkpass:
kpkpass:
diff --git a/kde/slack-desc/kplotting b/kde/slack-desc/kplotting
index de8f578..fa040bc 100644
--- a/kde/slack-desc/kplotting
+++ b/kde/slack-desc/kplotting
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kplotting: kplotting (kplotting)
+kplotting: kplotting (Data plotting)
kplotting:
+kplotting: KPlotWidget is a QWidget-derived class that provides a virtual base
+kplotting: class for easy data-plotting. The idea behind KPlotWidget is that you
+kplotting: only have to specify information in data units; i.e., the natural
+kplotting: units of the data being plotted. KPlotWidget automatically converts
+kplotting: everything to screen pixel units. KPlotWidget draws X and Y axes with
+kplotting: tick marks and tick labels, and automatically determines how many tick
+kplotting: marks to use and where they should be, based on the data limits
+kplotting: specified for the plot.
kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kpmcore b/kde/slack-desc/kpmcore
index 44306d8..06e33b3 100644
--- a/kde/slack-desc/kpmcore
+++ b/kde/slack-desc/kpmcore
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler------------------------------------------------|
-kpmcore: kpmcore (KDE partitionmanager core libraries)
+ |-----handy-ruler------------------------------------------------------|
+kpmcore: kpmcore (KDE partitionmanager libraries)
kpmcore:
-kpmcore: kpmcore is a library for managing partitions. It contains
-kpmcore: common code for KDE Partition Manager and other projects.
+kpmcore: kpmcore is a library for managing partitions. It contains common code
+kpmcore: for KDE Partition Manager and other projects.
kpmcore:
+kpmcore: See also:
+kpmcore: https://www.kde.org/applications/system/kdepartitionmanager
kpmcore:
kpmcore:
kpmcore:
-kpmcore: See also:
-kpmcore: https://www.kde.org/applications/system/kdepartitionmanager
kpmcore:
diff --git a/kde/slack-desc/kpty b/kde/slack-desc/kpty
index 47f9460..b8277fa 100644
--- a/kde/slack-desc/kpty
+++ b/kde/slack-desc/kpty
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kpty: kpty (kpty)
+kpty: kpty (pseudo terminal library)
kpty:
+kpty: The KPty library provides primitives to interface with pseudo terminal
+kpty: devices as well as a KProcess derived class for running child
+kpty: processes and communicating with them using a pty.
kpty:
kpty:
kpty:
kpty:
kpty:
kpty:
-kpty:
-kpty:
-kpty: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kqtquickcharts b/kde/slack-desc/kqtquickcharts
index d1ea9ea..f2d3ebe 100644
--- a/kde/slack-desc/kqtquickcharts
+++ b/kde/slack-desc/kqtquickcharts
@@ -6,8 +6,10 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kqtquickcharts: kqtquickcharts (plugin to render interactive graphs)
+kqtquickcharts: kqtquickcharts (chart rendering plugin)
kqtquickcharts:
+kqtquickcharts: kqtquickcharts is a QtQuick plugin to render beautiful and interactive
+kqtquickcharts: charts.
kqtquickcharts:
kqtquickcharts:
kqtquickcharts:
@@ -15,5 +17,3 @@ kqtquickcharts:
kqtquickcharts:
kqtquickcharts:
kqtquickcharts:
-kqtquickcharts: For more information, visit: http://www.kde.org
-kqtquickcharts:
diff --git a/kde/slack-desc/kquickcharts b/kde/slack-desc/kquickcharts
index 0c4e6f8..ed910c0 100644
--- a/kde/slack-desc/kquickcharts
+++ b/kde/slack-desc/kquickcharts
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kquickcharts: kquickcharts (QtQuick module providing high-performance charts)
+kquickcharts: kquickcharts (QtQuick chart module)
kquickcharts:
kquickcharts: The Quick Charts module provides a set of charts that can be used
kquickcharts: from QtQuick applications. They are intended to be used for both
-kquickcharts: simple display of data as well as continuous display of
-kquickcharts: high-volume data (often referred to as plotters).
-kquickcharts: The charts use a system called distance fields for their accelerated
-kquickcharts: rendering, which provides ways of using the GPU for rendering
-kquickcharts: 2D shapes without loss of quality.
+kquickcharts: simple display of data as well as continuous display of high-volume
+kquickcharts: data (often referred to as plotters). The charts use a system called
+kquickcharts: distance fields for their accelerated rendering, which provides ways
+kquickcharts: of using the GPU for rendering 2D shapes without loss of quality.
kquickcharts:
kquickcharts: See: https://api.kde.org/frameworks/kquickcharts/html/index.html
+kquickcharts:
diff --git a/kde/slack-desc/krdc b/kde/slack-desc/krdc
index 3daef06..82768f8 100644
--- a/kde/slack-desc/krdc
+++ b/kde/slack-desc/krdc
@@ -12,8 +12,8 @@ krdc: KRDC is a client application that allows you to view or even control
krdc: the desktop session on another machine that is running a compatible
krdc: server. VNC and RDP is supported.
krdc:
+krdc: Homepage: https://www.kde.org/applications/internet/krdc/
krdc:
krdc:
krdc:
-krdc: More information at: http://www.kde.org/applications/internet/krdc/
krdc:
diff --git a/kde/slack-desc/krename b/kde/slack-desc/krename
index 71fdb64..65323e3 100644
--- a/kde/slack-desc/krename
+++ b/kde/slack-desc/krename
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-krename: krename (powerful batch file rename tool)
+krename: krename (batch file rename tool)
krename:
-krename: KRename is a powerful batch renamer for KDE. It allows you to
-krename: easily rename hundreds or even more files in one go.
-krename: The filenames can be created by parts of the original filename,
-krename: numbering the files or accessing hundreds of informations about
-krename: the file, like creation date or Exif informations of an image.
+krename: KRename is a powerful batch renamer for KDE. It allows you to easily
+krename: rename hundreds or even more files in one go. The filenames can be
+krename: created by parts of the original filename, numbering the files or
+krename: accessing information about the file, like creation date or Exif
+krename: information from an image.
krename:
+krename: Homepage: http://www.krename.net/
krename:
-krename: Home page: http://www.krename.net/
krename:
diff --git a/kde/slack-desc/kreversi b/kde/slack-desc/kreversi
index fb6c5d3..e021ec7 100644
--- a/kde/slack-desc/kreversi
+++ b/kde/slack-desc/kreversi
@@ -9,11 +9,11 @@
kreversi: kreversi (reversi board game for KDE)
kreversi:
kreversi: KReversi is a simple one player strategy game played against the
-kreversi: computer. If a player's piece is captured by an opposing player,
-kreversi: that piece is turned over to reveal the color of that player.
-kreversi: A winner is declared when one player has more pieces of his own color
-kreversi: on the board and there are no more possible moves.
+kreversi: computer. If a player's piece is captured by an opposing player, that
+kreversi: piece is turned over to reveal the color of that player. A winner is
+kreversi: declared when one player has more pieces of his own color on the board
+kreversi: and there are no more possible moves.
+kreversi:
kreversi:
kreversi:
-kreversi: For more information, visit: http://www.kde.org
kreversi:
diff --git a/kde/slack-desc/krfb b/kde/slack-desc/krfb
index e073614..1e15edc 100644
--- a/kde/slack-desc/krfb
+++ b/kde/slack-desc/krfb
@@ -12,8 +12,8 @@ krfb: Krfb Desktop Sharing is a server application that allows you to share
krfb: your current session with a user on another machine, who can use a
krfb: VNC client to view or even control the desktop.
krfb:
+krfb: Homepage: https://www.kde.org/applications/system/krfb/
krfb:
krfb:
krfb:
-krfb: More information at: http://www.kde.org/applications/system/krfb/
krfb:
diff --git a/kde/slack-desc/krita b/kde/slack-desc/krita
index 6d7b41e..b287e03 100644
--- a/kde/slack-desc/krita
+++ b/kde/slack-desc/krita
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
krita: krita (painting program)
krita:
-krita: Krita is a professional FREE and open source painting program.
-krita: It is made by artists that want to see affordable art tools
-krita: for everyone.
+krita: Krita is a professional free and open source painting program. It is
+krita: made by artists that want to see affordable art tools for everyone.
+krita:
+krita: Homepage: http://www.krita.org/
krita:
krita:
krita:
krita:
-krita: Home page: http://www.krita.org/
krita:
diff --git a/kde/slack-desc/kross b/kde/slack-desc/kross
index b161b3b..b8325cf 100644
--- a/kde/slack-desc/kross
+++ b/kde/slack-desc/kross
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kross: kross (kross)
+kross: kross (script embedding)
kross:
+kross: Kross is a scripting bridge to embed scripting functionality into an
+kross: application. It supports QtScript as a scripting interpreter backend.
+kross: Kross is able to optional dynamic load modules which provide
+kross: additional functionality for scripts.
kross:
kross:
kross:
kross:
kross:
-kross:
-kross:
-kross:
-kross: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kross-interpreters b/kde/slack-desc/kross-interpreters
index 27a15fc..04274c2 100644
--- a/kde/slack-desc/kross-interpreters
+++ b/kde/slack-desc/kross-interpreters
@@ -10,7 +10,7 @@ kross-interpreters: kross-interpreters (Kross interpreters)
kross-interpreters:
kross-interpreters: Set of interpreter plugins for the Kross archtecture in KDE.
kross-interpreters:
-kross-interpreters: See also: http://developer.kde.org/language-bindings/
+kross-interpreters:
kross-interpreters:
kross-interpreters:
kross-interpreters:
diff --git a/kde/slack-desc/kruler b/kde/slack-desc/kruler
index 1383667..de6f857 100644
--- a/kde/slack-desc/kruler
+++ b/kde/slack-desc/kruler
@@ -10,7 +10,7 @@ kruler: kruler (a screen ruler for KDE)
kruler:
kruler: A screen ruler and color measurement tool for KDE.
kruler:
-kruler: For more information, visit: http://www.kde.org
+kruler:
kruler:
kruler:
kruler:
diff --git a/kde/slack-desc/krunner b/kde/slack-desc/krunner
index 3688637..e6a5c46 100644
--- a/kde/slack-desc/krunner
+++ b/kde/slack-desc/krunner
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
krunner: krunner (KDE plasma launcher)
krunner:
-krunner: KRunner is the launcher built into the Plasma desktop. While
-krunner: its basic function is to launch programs from a sort of
-krunner: mini-command-line, its functionality can be extended by
-krunner: runners to assist the user to accomplish a lot of tasks.
+krunner: KRunner is the launcher built into the Plasma desktop. While its basic
+krunner: function is to launch programs from a sort of mini-command-line, its
+krunner: functionality can be extended by runners to assist the user to
+krunner: accomplish a lot of tasks.
+krunner:
krunner:
krunner:
krunner:
krunner:
-krunner: Homepage: http://kde.org/
diff --git a/kde/slack-desc/krusader b/kde/slack-desc/krusader
index 9221c43..a3fb4e8 100644
--- a/kde/slack-desc/krusader
+++ b/kde/slack-desc/krusader
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-krusader: krusader (twin panel file management for KDE)
+krusader: krusader (twin panel file manager)
krusader:
-krusader: Krusader is an advanced twin panel (commander style) file manager
-krusader: for KDE and other desktops in the *nix world, similar to Midnight
-krusader: or Total Commander.
-krusader: It provides all the file management features you could possibly want.
+krusader: Krusader is an advanced twin panel (commander style) file manager for
+krusader: KDE and other desktops, similar to Midnight Commander or Total
+krusader: Commander.
+krusader:
+krusader: Homepage: http://krusader.org
krusader:
krusader:
krusader:
-krusader: For more information, visit: http://krusader.org
krusader:
diff --git a/kde/slack-desc/kscreen2 b/kde/slack-desc/kscreen2
index 6b8a606..2250496 100644
--- a/kde/slack-desc/kscreen2
+++ b/kde/slack-desc/kscreen2
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kscreen2: kscreen (KDE screen management)
+kscreen2: kscreen2 (KDE screen management)
kscreen2:
kscreen2: KScreen is the new screen management software for KDE Plasma
-kscreen2: Workspaces which tries to be as magic and automatic as possible
-kscreen2: for users with basic needs and easy to configure for those
-kscreen2: who want special setups.
-kscreen2:
+kscreen2: Workspaces which tries to be as magic and automatic as possible for
+kscreen2: users with basic needs and easy to configure for those who want
+kscreen2: special setups.
kscreen2:
kscreen2: For more information, visit:
kscreen2: http://community.kde.org/Solid/Projects/ScreenManagement
kscreen2:
+kscreen2:
diff --git a/kde/slack-desc/kscreenlocker b/kde/slack-desc/kscreenlocker
index f424643..e8c7866 100644
--- a/kde/slack-desc/kscreenlocker
+++ b/kde/slack-desc/kscreenlocker
@@ -10,10 +10,10 @@ kscreenlocker: kscreenlocker (secure lock screen architecture)
kscreenlocker:
kscreenlocker: Library and components for secure lock screen architecture.
kscreenlocker:
+kscreenlocker: Homepage: https://projects.kde.org/kscreenlocker
kscreenlocker:
kscreenlocker:
kscreenlocker:
kscreenlocker:
kscreenlocker:
-kscreenlocker: For more information, visit: https://projects.kde.org/kscreenlocker
kscreenlocker:
diff --git a/kde/slack-desc/kservice b/kde/slack-desc/kservice
index 8f66361..b7f7191 100644
--- a/kde/slack-desc/kservice
+++ b/kde/slack-desc/kservice
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kservice: kservice (kservice)
+kservice: kservice (desktop services plugin framework)
kservice:
+kservice: KService provides a plugin framework for handling desktop services.
+kservice: Services can be applications or libraries. They can be bound to MIME
+kservice: types or handled by application specific code.
kservice:
kservice:
kservice:
kservice:
kservice:
kservice:
-kservice:
-kservice:
-kservice: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kshisen b/kde/slack-desc/kshisen
index 1af7d35..dc43d05 100644
--- a/kde/slack-desc/kshisen
+++ b/kde/slack-desc/kshisen
@@ -9,11 +9,11 @@
kshisen: kshisen (Shisen-Sho Mahjongg-like tile game)
kshisen:
kshisen: KShisen is a solitaire-like game played using the standard set of
-kshisen: Mahjong tiles. Unlike Mahjong however, KShisen has only one layer
+kshisen: Mahjong tiles. Unlike Mahjong however, KShisen has only one layer
kshisen: of scrambled tiles.
kshisen:
kshisen:
kshisen:
kshisen:
-kshisen: For more information, visit: http://www.kde.org
+kshisen:
kshisen:
diff --git a/kde/slack-desc/ksirk b/kde/slack-desc/ksirk
index 1a0826d..57a17e1 100644
--- a/kde/slack-desc/ksirk
+++ b/kde/slack-desc/ksirk
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-ksirk: ksirk (KDE port of the board game risk)
+ksirk: ksirk (conquer the world board game)
ksirk:
-ksirk: Ksirk is a KDE port of the board game risk.
+ksirk: KsirK is a computerized version of the well known strategic board game
+ksirk: R***. The goal of the game is simply to conquer the world by attacking
+ksirk: your neighbors with your armies.
ksirk:
ksirk:
ksirk:
ksirk:
ksirk:
ksirk:
-ksirk: For more information, visit: http://www.kde.org
-ksirk:
diff --git a/kde/slack-desc/ksmtp b/kde/slack-desc/ksmtp
index c8ab4de..2ad42fa 100644
--- a/kde/slack-desc/ksmtp
+++ b/kde/slack-desc/ksmtp
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-ksmtp: ksmtp (library to send mail through smtp)
+ksmtp: ksmtp (SMTP library)
+ksmtp:
+ksmtp: ksmtp is a job-based library to send email through an SMTP server.
ksmtp:
-ksmtp: ksmtp is a job-based library to send email through an SMTP server,
ksmtp:
ksmtp:
ksmtp:
ksmtp:
ksmtp:
ksmtp:
-ksmtp: Home page: http://www.kde.org/
ksmtp:
diff --git a/kde/slack-desc/ksnakeduel b/kde/slack-desc/ksnakeduel
index 731a772..553a72c 100644
--- a/kde/slack-desc/ksnakeduel
+++ b/kde/slack-desc/ksnakeduel
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-ksnakeduel: ksnakeduel (simple snake duel game for KDE)
+ksnakeduel: ksnakeduel (simple snake duel game)
+ksnakeduel:
+ksnakeduel: KSnakeDuel is a simple snake duel game for KDE. You can play
+ksnakeduel: KSnakeDuel against the computer or a friend. The aim of the game is to
+ksnakeduel: live longer than your opponent. To do that, avoid running into a wall,
+ksnakeduel: your own tail, or that of your opponent.
ksnakeduel:
-ksnakeduel: KSnakeDuel is a simple snake duel game for KDE. You can play
-ksnakeduel: KSnakeDuel against the computer or a friend. The aim of the game is
-ksnakeduel: to live longer than your opponent. To do that, avoid running into
-ksnakeduel: a wall, your own tail and that of your opponent.
ksnakeduel:
ksnakeduel:
ksnakeduel:
-ksnakeduel: For more information, visit: http://www.kde.org
ksnakeduel:
diff --git a/kde/slack-desc/kspaceduel b/kde/slack-desc/kspaceduel
index 8a4435f..7651e26 100644
--- a/kde/slack-desc/kspaceduel
+++ b/kde/slack-desc/kspaceduel
@@ -9,11 +9,11 @@
kspaceduel: kspaceduel (space arcade game)
kspaceduel:
kspaceduel: In KSpaceduel each of two possible players controls a satellite
-kspaceduel: spaceship orbiting the sun. As the game progresses players have to
-kspaceduel: eliminate opponent's spacecraft.
+kspaceduel: spaceship orbiting the sun. As the game progresses players have to
+kspaceduel: eliminate the opponent's spacecraft.
+kspaceduel:
kspaceduel:
kspaceduel:
kspaceduel:
kspaceduel:
-kspaceduel: For more information, visit: http://www.kde.org
kspaceduel:
diff --git a/kde/slack-desc/ksquares b/kde/slack-desc/ksquares
index ed147ff..b3b632f 100644
--- a/kde/slack-desc/ksquares
+++ b/kde/slack-desc/ksquares
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksquares: ksquares (connect the dots to create squares)
ksquares:
-ksquares: KSquares is a fun and exciting game for desktop environment.
-ksquares: The game is modeled after the well known pen and paper based
-ksquares: game of Dots and Boxes.
+ksquares: KSquares is a fun and exciting game for the desktop environment. The
+ksquares: game is modeled after the well known pen and paper based game of Dots
+ksquares: and Boxes.
+ksquares:
ksquares:
ksquares:
ksquares:
ksquares:
-ksquares: For more information, visit: http://www.kde.org
ksquares:
diff --git a/kde/slack-desc/ksshaskpass b/kde/slack-desc/ksshaskpass
index 3c98517..142a5d4 100644
--- a/kde/slack-desc/ksshaskpass
+++ b/kde/slack-desc/ksshaskpass
@@ -15,5 +15,5 @@ ksshaskpass:
ksshaskpass:
ksshaskpass:
ksshaskpass:
-ksshaskpass: For more information, visit: http://www.kde.org
+ksshaskpass:
ksshaskpass:
diff --git a/kde/slack-desc/kstars b/kde/slack-desc/kstars
index 1e0062c..ad680b2 100644
--- a/kde/slack-desc/kstars
+++ b/kde/slack-desc/kstars
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kstars: kstars (a desktop planetarium)
kstars:
-kstars: KStars is a desktop planetarium.
-kstars:
-kstars: For more information, visit: http://edu.kde.org/
-kstars:
-kstars:
-kstars:
-kstars:
-kstars:
+kstars: KStars is free, open source, cross-platform Astronomy Software.
+kstars: It provides an accurate graphical simulation of the night sky, from
+kstars: any location on Earth, at any date and time. The display includes up
+kstars: to 100 million stars, 13,000 deep-sky objects, all 8 planets, the Sun
+kstars: and Moon, and thousands of comets, asteroids, supernovae, and
+kstars: satellites.
+kstars:
+kstars: Homepage: https://edu.kde.org/kstars
kstars:
diff --git a/kde/slack-desc/ksudoku b/kde/slack-desc/ksudoku
index 530f9d7..ded40ae 100644
--- a/kde/slack-desc/ksudoku
+++ b/kde/slack-desc/ksudoku
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksudoku: ksudoku (sudoku game)
ksudoku:
-ksudoku: KSudoku is a logic-based symbol placement puzzle.
-ksudoku: The player has to fill a grid so that each column, row as well as
-ksudoku: each square block on the game field contains only one instance of
-ksudoku: each symbol.
+ksudoku: KSudoku is a logic-based symbol placement puzzle. The player has to
+ksudoku: fill a grid so that each column, row as well as each square block on
+ksudoku: the game field contains only one instance of each symbol.
+ksudoku:
+ksudoku:
ksudoku:
ksudoku:
ksudoku:
-ksudoku: For more information, visit: http://www.kde.org
ksudoku:
diff --git a/kde/slack-desc/ksysguard b/kde/slack-desc/ksysguard
index ee90a10..438dac1 100644
--- a/kde/slack-desc/ksysguard
+++ b/kde/slack-desc/ksysguard
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksysguard: ksysguard (process monitor and system statistics)
ksysguard:
-ksysguard: System Guard allows you to monitor various statistics about
-ksysguard: your system. In addition to monitoring the local system,
-ksysguard: it can connect to remote systems running the System Guard
-ksysguard: Daemon, which is in the 'ksysguardd' package.
+ksysguard: System Guard allows you to monitor various statistics about your
+ksysguard: system. In addition to monitoring the local system, it can connect to
+ksysguard: remote systems running the System Guard Daemon, which is in the
+ksysguard: ksysguardd package.
+ksysguard:
ksysguard:
ksysguard:
ksysguard:
ksysguard:
-ksysguard: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ksystemlog b/kde/slack-desc/ksystemlog
index 60ba7d5..2e5a549 100644
--- a/kde/slack-desc/ksystemlog
+++ b/kde/slack-desc/ksystemlog
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksystemlog: ksystemlog (system log viewer)
ksystemlog:
-ksystemlog: KSystemLog is a system log viewer tool. This program is developed
-ksystemlog: for beginner users, who don't know how to find information about
-ksystemlog: their Linux system, and don't know where log files are.
-ksystemlog: It is also of course designed for advanced users, who quickly want
-ksystemlog: to understand problems of their machine with a more powerful and
-ksystemlog: graphical tool than 'tail -f' and 'less' commands ;-)
+ksystemlog: KSystemLog is a system log viewer tool. This program is developed for
+ksystemlog: beginner users, who don't know how to find information about their
+ksystemlog: Linux system, and don't know where log files are. It is also of course
+ksystemlog: designed for advanced users, who quickly want to understand problems
+ksystemlog: of their machine with a more powerful and graphical tool than
+ksystemlog: 'tail -f' and 'less' commands ;-)
ksystemlog:
-ksystemlog: Visit: http://www.kde.org/applications/system/ksystemlog/
+ksystemlog: Homepage: https://www.kde.org/applications/system/ksystemlog/
ksystemlog:
diff --git a/kde/slack-desc/kteatime b/kde/slack-desc/kteatime
index ee4433f..5c56caf 100644
--- a/kde/slack-desc/kteatime
+++ b/kde/slack-desc/kteatime
@@ -9,11 +9,11 @@
kteatime: kteatime (tea cooker)
kteatime:
kteatime: KTeaTime is a handy timer for steeping tea. No longer will you have
-kteatime: to guess at how long it takes for your tea to be ready.
-kteatime: Simply select the type of tea you have, and it will alert you when
-kteatime: the tea is ready to drink.
+kteatime: to guess at how long it takes for your tea to be ready. Simply select
+kteatime: the type of tea you have, and it will alert you when the tea is ready
+kteatime: to drink.
kteatime:
+kteatime: Homepage: https://www.kde.org/applications/games/kteatime/
kteatime:
kteatime:
-kteatime: More information at http://www.kde.org/applications/games/kteatime/
kteatime:
diff --git a/kde/slack-desc/ktexteditor b/kde/slack-desc/ktexteditor
index cfd6c13..7ec86e5 100644
--- a/kde/slack-desc/ktexteditor
+++ b/kde/slack-desc/ktexteditor
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-ktexteditor: ktexteditor (ktexteditor)
+ktexteditor: ktexteditor (text editor component)
ktexteditor:
+ktexteditor: KTextEditor provides a powerful text editor component that you can
+ktexteditor: embed in your application, either as a KPart or using the
+ktexteditor: KF5::TextEditor library. The text editor component contains many
+ktexteditor: useful features, from syntax highlighting and automatic indentation to
+ktexteditor: advanced scripting support, making it suitable for everything from a
+ktexteditor: simple embedded text-file editor to an advanced IDE.
ktexteditor:
ktexteditor:
ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ktextwidgets b/kde/slack-desc/ktextwidgets
index 0b549e8..d0d5556 100644
--- a/kde/slack-desc/ktextwidgets
+++ b/kde/slack-desc/ktextwidgets
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-ktextwidgets: ktextwidgets (ktextwidgets)
+ktextwidgets: ktextwidgets (text editing widgets)
ktextwidgets:
+ktextwidgets: KTextWidgets provides widgets for displaying and editing text. It
+ktextwidgets: supports rich text as well as plain text.
ktextwidgets:
ktextwidgets:
ktextwidgets:
@@ -15,5 +17,3 @@ ktextwidgets:
ktextwidgets:
ktextwidgets:
ktextwidgets:
-ktextwidgets:
-ktextwidgets: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ktimer b/kde/slack-desc/ktimer
index 45b787c..f3134f3 100644
--- a/kde/slack-desc/ktimer
+++ b/kde/slack-desc/ktimer
@@ -10,7 +10,7 @@ ktimer: ktimer (program scheduler)
ktimer:
ktimer: KTimer is a little tool to execute programs after some time.
ktimer:
-ktimer: ktimer's home page is: http://utils.kde.org/projects/ktimer
+ktimer: Homepage: http://utils.kde.org/projects/ktimer
ktimer:
ktimer:
ktimer:
diff --git a/kde/slack-desc/ktimetracker b/kde/slack-desc/ktimetracker
index 9d5927c..ee8ca88 100644
--- a/kde/slack-desc/ktimetracker
+++ b/kde/slack-desc/ktimetracker
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktimetracker: ktimetracker (personal time tracker)
ktimetracker:
-ktimetracker: KTimeTracker is a personal time tracker for busy people
-ktimetracker: implemented as a Qt5/KF5-based desktop application.
+ktimetracker: KTimeTracker is a personal time tracker for busy people implemented as
+ktimetracker: a Qt5/KF5-based desktop application.
+ktimetracker:
ktimetracker:
ktimetracker:
ktimetracker:
ktimetracker:
ktimetracker:
-ktimetracker: Home page: http://www.kde.org/
ktimetracker:
diff --git a/kde/slack-desc/ktnef b/kde/slack-desc/ktnef
index 078b32d..88cf660 100644
--- a/kde/slack-desc/ktnef
+++ b/kde/slack-desc/ktnef
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktnef: ktnef (API for the handling of TNEF data)
ktnef:
-ktnef: The ktnef library contains an API for the handling of TNEF data.
-ktnef: The API permits access to the actual attachments, the message
-ktnef: properties (TNEF/MAPI), and allows one to view/extract message
-ktnef: formatted text in Rich Text Format format.
+ktnef: The ktnef library contains an API for the handling of TNEF data. The
+ktnef: API permits access to the actual attachments, the message properties
+ktnef: (TNEF/MAPI), and allows one to view/extract message formatted text in
+ktnef: Rich Text Format format.
+ktnef:
ktnef:
ktnef:
ktnef:
-ktnef: Home page: http://www.kde.org/
ktnef:
diff --git a/kde/slack-desc/ktorrent b/kde/slack-desc/ktorrent
index afb3a20..c2ab4f8 100644
--- a/kde/slack-desc/ktorrent
+++ b/kde/slack-desc/ktorrent
@@ -11,9 +11,9 @@ ktorrent:
ktorrent: KTorrent is a BitTorrent program with many features:
ktorrent: Download torrent files (of course :-), upload and download speed
ktorrent: capping, Internet searching, UDP trackers, port forwarding with UPnP,
-ktorrent: IP blocking, importing of partially or fully downloaded files,
-ktorrent: support for distributed hash tables, protocol encryption,
-ktorrent: bandwidth scheduling, and much more.
-ktorrent:
-ktorrent: KTorrent's developers are Joris Guisson and Ivan Vasic.
+ktorrent: IP blocking, importing of partially or fully downloaded files, support
+ktorrent: for distributed hash tables, protocol encryption, bandwidth
+ktorrent: scheduling, and much more. KTorrent's developers are Joris Guisson and
+ktorrent: Ivan Vasic.
ktorrent:
+ktorrent: Homepage: https://kde.org/applications/en/internet/org.kde.ktorrent
diff --git a/kde/slack-desc/ktouch b/kde/slack-desc/ktouch
index 74fdba1..d73b129 100644
--- a/kde/slack-desc/ktouch
+++ b/kde/slack-desc/ktouch
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
ktouch: ktouch (touch typing tutor)
ktouch:
-ktouch: A KDE program that helps you to learn and practice touch typing.
-ktouch:
-ktouch: For more information, visit: http://edu.kde.org/
-ktouch:
+ktouch: KTouch is a typewriter trainer for learning to touch type. It provides
+ktouch: you with text to train on and adjusts to different levels depending on
+ktouch: how good you are.
ktouch:
+ktouch: Homepage: https://kde.org/applications/en/education/org.kde.ktouch
ktouch:
ktouch:
ktouch:
diff --git a/kde/slack-desc/ktp-accounts-kcm b/kde/slack-desc/ktp-accounts-kcm
index d610ed8..2266d67 100644
--- a/kde/slack-desc/ktp-accounts-kcm
+++ b/kde/slack-desc/ktp-accounts-kcm
@@ -14,6 +14,6 @@ ktp-accounts-kcm:
ktp-accounts-kcm:
ktp-accounts-kcm:
ktp-accounts-kcm:
-ktp-accounts-kcm: See also:
-ktp-accounts-kcm: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-accounts-kcm:
+ktp-accounts-kcm:
ktp-accounts-kcm:
diff --git a/kde/slack-desc/ktp-approver b/kde/slack-desc/ktp-approver
index 2f59952..954300a 100644
--- a/kde/slack-desc/ktp-approver
+++ b/kde/slack-desc/ktp-approver
@@ -14,6 +14,6 @@ ktp-approver:
ktp-approver:
ktp-approver:
ktp-approver:
-ktp-approver: See also:
-ktp-approver: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-approver:
+ktp-approver:
ktp-approver:
diff --git a/kde/slack-desc/ktp-auth-handler b/kde/slack-desc/ktp-auth-handler
index 5b0319b..e6d000a 100644
--- a/kde/slack-desc/ktp-auth-handler
+++ b/kde/slack-desc/ktp-auth-handler
@@ -14,6 +14,6 @@ ktp-auth-handler:
ktp-auth-handler:
ktp-auth-handler:
ktp-auth-handler:
-ktp-auth-handler: See also:
-ktp-auth-handler: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-auth-handler:
+ktp-auth-handler:
ktp-auth-handler:
diff --git a/kde/slack-desc/ktp-call-ui b/kde/slack-desc/ktp-call-ui
index 993b4ba..e23371f 100644
--- a/kde/slack-desc/ktp-call-ui
+++ b/kde/slack-desc/ktp-call-ui
@@ -14,6 +14,6 @@ ktp-call-ui:
ktp-call-ui:
ktp-call-ui:
ktp-call-ui:
-ktp-call-ui: See also:
-ktp-call-ui: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-call-ui:
+ktp-call-ui:
ktp-call-ui:
diff --git a/kde/slack-desc/ktp-common-internals b/kde/slack-desc/ktp-common-internals
index 504acb8..5cf8506 100644
--- a/kde/slack-desc/ktp-common-internals
+++ b/kde/slack-desc/ktp-common-internals
@@ -14,6 +14,6 @@ ktp-common-internals:
ktp-common-internals:
ktp-common-internals:
ktp-common-internals:
-ktp-common-internals: See also:
-ktp-common-internals: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-common-internals:
+ktp-common-internals:
ktp-common-internals:
diff --git a/kde/slack-desc/ktp-contact-list b/kde/slack-desc/ktp-contact-list
index cf793ad..fde3ec1 100644
--- a/kde/slack-desc/ktp-contact-list
+++ b/kde/slack-desc/ktp-contact-list
@@ -14,6 +14,6 @@ ktp-contact-list:
ktp-contact-list:
ktp-contact-list:
ktp-contact-list:
-ktp-contact-list: See also:
-ktp-contact-list: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-contact-list:
+ktp-contact-list:
ktp-contact-list:
diff --git a/kde/slack-desc/ktp-contact-runner b/kde/slack-desc/ktp-contact-runner
index db98f64..0d54611 100644
--- a/kde/slack-desc/ktp-contact-runner
+++ b/kde/slack-desc/ktp-contact-runner
@@ -14,6 +14,6 @@ ktp-contact-runner:
ktp-contact-runner:
ktp-contact-runner:
ktp-contact-runner:
-ktp-contact-runner: See also:
-ktp-contact-runner: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-contact-runner:
+ktp-contact-runner:
ktp-contact-runner:
diff --git a/kde/slack-desc/ktp-desktop-applets b/kde/slack-desc/ktp-desktop-applets
index 0a815b5..58839f1 100644
--- a/kde/slack-desc/ktp-desktop-applets
+++ b/kde/slack-desc/ktp-desktop-applets
@@ -9,11 +9,11 @@
ktp-desktop-applets: ktp-desktop-applets (KDE Telepathy desktop applets)
ktp-desktop-applets:
ktp-desktop-applets: KDE Telepathy desktop applets, including:
-ktp-desktop-applets: * contacts
-ktp-desktop-applets: * presence
+ktp-desktop-applets: * contacts
+ktp-desktop-applets: * presence
+ktp-desktop-applets:
+ktp-desktop-applets:
ktp-desktop-applets:
ktp-desktop-applets:
ktp-desktop-applets:
-ktp-desktop-applets: See also:
-ktp-desktop-applets: https://community.kde.org/Real-Time_Communication_and_Collaboration
ktp-desktop-applets:
diff --git a/kde/slack-desc/ktp-filetransfer-handler b/kde/slack-desc/ktp-filetransfer-handler
index 2476f67..902487d 100644
--- a/kde/slack-desc/ktp-filetransfer-handler
+++ b/kde/slack-desc/ktp-filetransfer-handler
@@ -9,11 +9,11 @@
ktp-filetransfer-handler: ktp-filetransfer-handler (Telepathy file transfer handler)
ktp-filetransfer-handler:
ktp-filetransfer-handler: Telepathy-KDE file transfer handler. It basically does two thigs:
-ktp-filetransfer-handler: - Send files to your contact
-ktp-filetransfer-handler: - Receive files from your contact
+ktp-filetransfer-handler: Send files to your contact
+ktp-filetransfer-handler: Receive files from your contact
+ktp-filetransfer-handler:
+ktp-filetransfer-handler:
ktp-filetransfer-handler:
ktp-filetransfer-handler:
ktp-filetransfer-handler:
-ktp-filetransfer-handler: See also:
-ktp-filetransfer-handler: https://community.kde.org/Real-Time_Communication_and_Collaboration
ktp-filetransfer-handler:
diff --git a/kde/slack-desc/ktp-kded-module b/kde/slack-desc/ktp-kded-module
index fbfdb24..20f3c55 100644
--- a/kde/slack-desc/ktp-kded-module
+++ b/kde/slack-desc/ktp-kded-module
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktp-kded-module: ktp-kded-module (KDE integration for telepathy)
ktp-kded-module:
-ktp-kded-module: This module sits in KDED and takes care of various bits of
-ktp-kded-module: system integration like setting user to auto-away or handling
-ktp-kded-module: connection errors.
+ktp-kded-module: This module sits in KDED and takes care of various bits of system
+ktp-kded-module: integration like setting user to auto-away or handling connection
+ktp-kded-module: errors.
+ktp-kded-module:
ktp-kded-module:
ktp-kded-module:
ktp-kded-module:
ktp-kded-module:
-ktp-kded-module: More at: https://userbase.kde.org/Telepathy
ktp-kded-module:
diff --git a/kde/slack-desc/ktp-send-file b/kde/slack-desc/ktp-send-file
index 87170a5..f104dcd 100644
--- a/kde/slack-desc/ktp-send-file
+++ b/kde/slack-desc/ktp-send-file
@@ -14,6 +14,6 @@ ktp-send-file:
ktp-send-file:
ktp-send-file:
ktp-send-file:
-ktp-send-file: See also:
-ktp-send-file: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-send-file:
+ktp-send-file:
ktp-send-file:
diff --git a/kde/slack-desc/ktp-text-ui b/kde/slack-desc/ktp-text-ui
index 2617541..6e47229 100644
--- a/kde/slack-desc/ktp-text-ui
+++ b/kde/slack-desc/ktp-text-ui
@@ -14,6 +14,6 @@ ktp-text-ui:
ktp-text-ui:
ktp-text-ui:
ktp-text-ui:
-ktp-text-ui: See also:
-ktp-text-ui: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-text-ui:
+ktp-text-ui:
ktp-text-ui:
diff --git a/kde/slack-desc/ktuberling b/kde/slack-desc/ktuberling
index b6386d6..46a6137 100644
--- a/kde/slack-desc/ktuberling
+++ b/kde/slack-desc/ktuberling
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktuberling: ktuberling (picture game for children)
ktuberling:
-ktuberling: KTuberling a simple constructor game suitable for children and
-ktuberling: adults alike. The idea of the game is based around a once popular
-ktuberling: doll making concept.
+ktuberling: KTuberling a simple constructor game suitable for children and adults
+ktuberling: alike. The idea of the game is based around a once popular doll making
+ktuberling: concept.
+ktuberling:
ktuberling:
ktuberling:
ktuberling:
ktuberling:
-ktuberling: For more information, visit: http://www.kde.org
ktuberling:
diff --git a/kde/slack-desc/kturtle b/kde/slack-desc/kturtle
index 2fc0d35..a4bead7 100644
--- a/kde/slack-desc/kturtle
+++ b/kde/slack-desc/kturtle
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kturtle: kturtle (Logo programming environment)
-kturtle:
-kturtle: KTurtle is an educational Logo programming environment.
-kturtle:
-kturtle: For more information, visit: http://edu.kde.org/
-kturtle:
-kturtle:
-kturtle:
-kturtle:
+kturtle: kturtle (Logo-like programming environment)
kturtle:
+kturtle: KTurtle is an educational programming environment for learning how to
+kturtle: program. It provides all programming tools from its user interface.
+kturtle: The programming language used is TurtleScript, which is loosely based
+kturtle: on Logo. All commands and messages are translated into the user's
+kturtle: language. KTurtle features an intuitive syntax highlighting, simple
+kturtle: error messages, integrated canvas to make drawings, an integrated
+kturtle: help, slow-motion and step execution.
kturtle:
+kturtle: Homepage: https://kde.org/applications/en/education/org.kde.kturtle
diff --git a/kde/slack-desc/kubrick b/kde/slack-desc/kubrick
index 15bf1df..ed529a7 100644
--- a/kde/slack-desc/kubrick
+++ b/kde/slack-desc/kubrick
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kubrick: kubrick (3-D game based on Rubik's Cube)
kubrick:
-kubrick: Kubrick is a game based on the Rubik's Cube puzzle. The cube sizes
+kubrick: Kubrick is a game based on the Rubik's Cube puzzle. The cube sizes
kubrick: range from 2x2x2 up to 6x6x6, or you can play with irregular "bricks"
-kubrick: such as 5x3x2 or "mats" such as 6x4x1 or 2x2x1.
-kubrick: The game has a selection of puzzles at several levels of difficulty,
-kubrick: as well as demos of pretty patterns and solution moves, or you can
-kubrick: make up your own puzzles.
+kubrick: such as 5x3x2 or "mats" such as 6x4x1 or 2x2x1. The game has a
+kubrick: selection of puzzles at several levels of difficulty, as well as demos
+kubrick: of pretty patterns and solution moves, or you can make up your own
+kubrick: puzzles.
+kubrick:
kubrick:
-kubrick: For more information, visit: http://www.kde.org
kubrick:
diff --git a/kde/slack-desc/kunitconversion b/kde/slack-desc/kunitconversion
index 62ca100..f621c20 100644
--- a/kde/slack-desc/kunitconversion
+++ b/kde/slack-desc/kunitconversion
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kunitconversion: kunitconversion (kunitconversion)
+kunitconversion: kunitconversion (convert physical units)
kunitconversion:
+kunitconversion: KUnitConversion provides functions to convert values in different
+kunitconversion: physical units. It supports converting different prefixes (e.g. kilo,
+kunitconversion: mega, giga) as well as converting between different unit systems (e.g.
+kunitconversion: liters, gallons).
kunitconversion:
kunitconversion:
kunitconversion:
kunitconversion:
kunitconversion:
-kunitconversion:
-kunitconversion:
-kunitconversion:
-kunitconversion: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kuser b/kde/slack-desc/kuser
index c0ac97d..90d56b7 100644
--- a/kde/slack-desc/kuser
+++ b/kde/slack-desc/kuser
@@ -15,5 +15,5 @@ kuser:
kuser:
kuser:
kuser:
-kuser: For more information, visit: http://www.kde.org
+kuser:
kuser:
diff --git a/kde/slack-desc/kwallet b/kde/slack-desc/kwallet
index 64fbcf4..550ce06 100644
--- a/kde/slack-desc/kwallet
+++ b/kde/slack-desc/kwallet
@@ -10,8 +10,8 @@ kwallet: kwallet (KDE wallet manager)
kwallet:
kwallet: KDE Wallet Manager is a tool to manage your passwords under KDE.
kwallet:
-kwallet: kwallet's home page is:
-kwallet: https://projects.kde.org/projects/kde/kdeutils
+kwallet: Homepage: https://projects.kde.org/projects/kde/kdeutils
+kwallet:
kwallet:
kwallet:
kwallet:
diff --git a/kde/slack-desc/kwallet-pam b/kde/slack-desc/kwallet-pam
index dce404f..7f23d5a 100644
--- a/kde/slack-desc/kwallet-pam
+++ b/kde/slack-desc/kwallet-pam
@@ -15,5 +15,5 @@ kwallet-pam:
kwallet-pam:
kwallet-pam:
kwallet-pam:
-kwallet-pam: See https://www.kde.org/workspaces/plasmadesktop/
+kwallet-pam:
kwallet-pam:
diff --git a/kde/slack-desc/kwalletmanager b/kde/slack-desc/kwalletmanager
index 82d055d..634c7af 100644
--- a/kde/slack-desc/kwalletmanager
+++ b/kde/slack-desc/kwalletmanager
@@ -10,8 +10,8 @@ kwalletmanager: kwalletmanager (KDE wallet manager)
kwalletmanager:
kwalletmanager: KDE Wallet Manager is a tool to manage your passwords under KDE.
kwalletmanager:
-kwalletmanager: kwalletmanager's home page is:
-kwalletmanager: https://projects.kde.org/projects/kde/kdeutils
+kwalletmanager: Homepage: https://projects.kde.org/projects/kde/kdeutils
+kwalletmanager:
kwalletmanager:
kwalletmanager:
kwalletmanager:
diff --git a/kde/slack-desc/kwave b/kde/slack-desc/kwave
index 9ee24de..50adf14 100644
--- a/kde/slack-desc/kwave
+++ b/kde/slack-desc/kwave
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwave: kwave (A sound editor for KDE)
kwave:
-kwave: Kwave is a sound editor built on the KDE Frameworks 5.
-kwave: With Kwave you can record, play back, import and edit many sorts of
-kwave: audio files including multi channel files.
-kwave: Kwave includes some plugins to transform audio files in several ways
-kwave: and presents a graphical view with zoom- and scroll capability.
+kwave: Kwave is a sound editor built on the KDE Frameworks 5. With Kwave you
+kwave: can record, play back, import and edit many sorts of audio files
+kwave: including multi channel files. Kwave includes some plugins to
+kwave: transform audio files in several ways and presents a graphical view
+kwave: with zoom and scroll capability.
kwave:
+kwave: Homepage: http://kwave.sourceforge.net
kwave:
-kwave: For more information, visit: http://kwave.sourceforge.net
kwave:
diff --git a/kde/slack-desc/kwayland b/kde/slack-desc/kwayland
index 57b19f5..99bd3bf 100644
--- a/kde/slack-desc/kwayland
+++ b/kde/slack-desc/kwayland
@@ -15,5 +15,5 @@ kwayland:
kwayland:
kwayland:
kwayland:
-kwayland: For more information, visit: http://www.kde.org
+kwayland:
kwayland:
diff --git a/kde/slack-desc/kwayland-integration b/kde/slack-desc/kwayland-integration
index 1959d26..adc0442 100644
--- a/kde/slack-desc/kwayland-integration
+++ b/kde/slack-desc/kwayland-integration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwayland-integration: kwayland-integration (wayland integration plugins for KDE Frameworks)
kwayland-integration:
-kwayland-integration: Kwayland-integration provides integration plugins for various
-kwayland-integration: KDE Frameworks for Wayland.
+kwayland-integration: Kwayland-integration provides integration plugins for various KDE
+kwayland-integration: Frameworks for Wayland.
+kwayland-integration:
kwayland-integration:
kwayland-integration:
kwayland-integration:
kwayland-integration:
kwayland-integration:
-kwayland-integration: For more information, visit: http://www.kde.org
kwayland-integration:
diff --git a/kde/slack-desc/kwayland-server b/kde/slack-desc/kwayland-server
index ca3ee96..41a4890 100644
--- a/kde/slack-desc/kwayland-server
+++ b/kde/slack-desc/kwayland-server
@@ -15,5 +15,5 @@ kwayland-server:
kwayland-server:
kwayland-server:
kwayland-server:
-kwayland-server: Home page: https://kde.org/plasma-desktop
+kwayland-server:
kwayland-server:
diff --git a/kde/slack-desc/kwebkitpart b/kde/slack-desc/kwebkitpart
index 3938c9d..df0c266 100644
--- a/kde/slack-desc/kwebkitpart
+++ b/kde/slack-desc/kwebkitpart
@@ -5,13 +5,13 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kwebkitpart: kwebkitpart (WebKit browser component)
kwebkitpart:
kwebkitpart: KWebKitPart is a web browser component for KDE based on (Qt)WebKit.
kwebkitpart: You can use it for example for browsing the web in Konqueror.
kwebkitpart:
-kwebkitpart: Homepage: http://kde-apps.org/content/show.php?content=127960
+kwebkitpart: Homepage: https://github.com/KDE/kwebkitpart
kwebkitpart:
kwebkitpart:
kwebkitpart:
diff --git a/kde/slack-desc/kwidgetsaddons b/kde/slack-desc/kwidgetsaddons
index fbc3c55..b8610d1 100644
--- a/kde/slack-desc/kwidgetsaddons
+++ b/kde/slack-desc/kwidgetsaddons
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kwidgetsaddons: kwidgetsaddons (kwidgetsaddons)
+kwidgetsaddons: kwidgetsaddons (desktop widgets)
kwidgetsaddons:
+kwidgetsaddons: This repository contains add-on widgets and classes for applications
+kwidgetsaddons: that use the Qt Widgets module. Provided are action classes that can
+kwidgetsaddons: be added to toolbars or menus, a wide range of widgets for selecting
+kwidgetsaddons: characters, fonts, colors, actions, dates and times, or MIME types,
+kwidgetsaddons: as well as platform-aware dialogs for configuration pages, message
+kwidgetsaddons: boxes, and password requests.
kwidgetsaddons:
kwidgetsaddons:
kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kwin b/kde/slack-desc/kwin
index 2b5eecc..17123cc 100644
--- a/kde/slack-desc/kwin
+++ b/kde/slack-desc/kwin
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwin: kwin (KDE window manager)
kwin:
-kwin: KWin is a window manager for the X Window System. It is an
-kwin: integral part, and the default window manager of the Plasma
-kwin: Workspaces, but it can also be used on its own or with other
-kwin: desktop environments.
+kwin: KWin is a window manager for the X Window System. It is an integral
+kwin: part, and the default window manager of the Plasma Workspaces, but it
+kwin: can also be used on its own or with other desktop environments.
+kwin:
+kwin:
kwin:
kwin:
kwin:
kwin:
-kwin: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kwindowsystem b/kde/slack-desc/kwindowsystem
index d42a074..5c19bea 100644
--- a/kde/slack-desc/kwindowsystem
+++ b/kde/slack-desc/kwindowsystem
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kwindowsystem: kwindowsystem (kwindowsystem)
+kwindowsystem: kwindowsystem (windowing system access)
kwindowsystem:
+kwindowsystem: KWindowSystem provides information about the windowing system and
+kwindowsystem: allows interaction with the windowing system. It provides a high level
+kwindowsystem: API which is windowing system independent and has platform specific
+kwindowsystem: implementations. This API is inspired by X11 and thus not all
+kwindowsystem: functionality is available on all windowing systems.
kwindowsystem:
kwindowsystem:
kwindowsystem:
kwindowsystem:
-kwindowsystem:
-kwindowsystem:
-kwindowsystem:
-kwindowsystem:
-kwindowsystem: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kwordquiz b/kde/slack-desc/kwordquiz
index 629395f..5a115aa 100644
--- a/kde/slack-desc/kwordquiz
+++ b/kde/slack-desc/kwordquiz
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kwordquiz: kwordquiz (a general purpose flash card program)
+kwordquiz: kwordquiz (flash card program)
+kwordquiz:
+kwordquiz: KWordQuiz is a general purpose flash card program. It can be used for
+kwordquiz: vocabulary learning and many other subjects.
kwordquiz:
-kwordquiz: KWordQuiz is a general purpose flash card program.
-kwordquiz: It can be used for vocabulary learning and many other subjects.
kwordquiz:
-kwordquiz: For more information, visit: http://edu.kde.org/
kwordquiz:
kwordquiz:
kwordquiz:
diff --git a/kde/slack-desc/kwrited b/kde/slack-desc/kwrited
index 121f1cb..20b6ec2 100644
--- a/kde/slack-desc/kwrited
+++ b/kde/slack-desc/kwrited
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwrited: kwrited (write daemon)
kwrited:
-kwrited: Watch for messages from local users sent with write(1)
-kwrited: or wall(1).
+kwrited: Watch for messages from local users sent with write(1) or wall(1).
+kwrited:
+kwrited:
kwrited:
kwrited:
kwrited:
kwrited:
kwrited:
kwrited:
-kwrited: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kxmlgui b/kde/slack-desc/kxmlgui
index 8607982..1ffc611 100644
--- a/kde/slack-desc/kxmlgui
+++ b/kde/slack-desc/kxmlgui
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kxmlgui: kxmlgui (kxmlgui)
+kxmlgui: kxmlgui (menu and toolbar framework)
kxmlgui:
+kxmlgui: KXMLGUI provides a framework for managing menu and toolbar actions in
+kxmlgui: an abstract way. The actions are configured through an XML description
+kxmlgui: and hooks in the application code. The framework supports merging of
+kxmlgui: multiple description for example for integrating actions from plugins.
kxmlgui:
kxmlgui:
kxmlgui:
kxmlgui:
kxmlgui:
-kxmlgui:
-kxmlgui:
-kxmlgui:
-kxmlgui: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kxmlrpcclient b/kde/slack-desc/kxmlrpcclient
index dbcb137..0ffae41 100644
--- a/kde/slack-desc/kxmlrpcclient
+++ b/kde/slack-desc/kxmlrpcclient
@@ -15,5 +15,5 @@ kxmlrpcclient:
kxmlrpcclient:
kxmlrpcclient:
kxmlrpcclient:
-kxmlrpcclient: For more information, visit: http://www.kde.org
+kxmlrpcclient:
kxmlrpcclient:
diff --git a/kde/slack-desc/labplot b/kde/slack-desc/labplot
index 26daeab..2fd2adb 100644
--- a/kde/slack-desc/labplot
+++ b/kde/slack-desc/labplot
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-labplot: labplot (nteractive graphing and analysis of scientific data)
+labplot: labplot (plot scientific data)
labplot:
-labplot: LabPlot is a KDE-application for interactive graphing and analysis
-labplot: of scientific data.
-labplot: LabPlot provides an easy way to create, manage and edit plots
-labplot: and to perform data analysis.
+labplot: LabPlot is a KDE application for interactive graphing and analysis of
+labplot: scientific data. LabPlot provides an easy way to create, manage and
+labplot: edit plots and to perform data analysis.
+labplot:
+labplot: Homepage: http://labplot.kde.org/
labplot:
labplot:
labplot:
-labplot: Home page: http://labplot.kde.org/
labplot:
diff --git a/kde/slack-desc/latte-dock b/kde/slack-desc/latte-dock
index 0872788..99d6d12 100644
--- a/kde/slack-desc/latte-dock
+++ b/kde/slack-desc/latte-dock
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
latte-dock: latte-dock (alternative dock for Plasma5)
latte-dock:
-latte-dock: Latte is a dock based on plasma frameworks providing an elegant
-latte-dock: and intuitive experience for your tasks and plasmoids.
-latte-dock: It animates its contents by using parabolic zoom effect and
-latte-dock: tries to be there only when it is needed.
-latte-dock: "Art in Coffee"
+latte-dock: Latte is a dock based on Plasma Frameworks providing an elegant and
+latte-dock: intuitive experience for your tasks and plasmoids. It animates its
+latte-dock: contents by using parabolic zoom effect and tries to be there only
+latte-dock: when it is needed. "Art in Coffee"
+latte-dock:
+latte-dock: Homepage: https://github.com/KDE/latte-dock
latte-dock:
latte-dock:
-latte-dock: Home page: https://github.com/KDE/latte-dock
latte-dock:
diff --git a/kde/slack-desc/libgravatar b/kde/slack-desc/libgravatar
index dbe14f9..c806332 100644
--- a/kde/slack-desc/libgravatar
+++ b/kde/slack-desc/libgravatar
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libgravatar: libgravatar (KDE PIM library providing Gravatar support)
+libgravatar: libgravatar (Gravatar support library)
libgravatar:
libgravatar: libgravatar is a KDE PIM library providing Gravatar support.
libgravatar:
@@ -15,5 +15,5 @@ libgravatar:
libgravatar:
libgravatar:
libgravatar:
-libgravatar: Home page: http://www.kde.org/
+libgravatar:
libgravatar:
diff --git a/kde/slack-desc/libkcddb b/kde/slack-desc/libkcddb
index 40f2950..2b2abc3 100644
--- a/kde/slack-desc/libkcddb
+++ b/kde/slack-desc/libkcddb
@@ -15,5 +15,5 @@ libkcddb:
libkcddb:
libkcddb:
libkcddb:
-libkcddb: For more information, visit: http://www.kde.org
+libkcddb:
libkcddb:
diff --git a/kde/slack-desc/libkcompactdisc b/kde/slack-desc/libkcompactdisc
index 67ce9c9..32565e4 100644
--- a/kde/slack-desc/libkcompactdisc
+++ b/kde/slack-desc/libkcompactdisc
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkcompactdisc: libkcompactdisc (KDE library for playing & ripping CDs)
+libkcompactdisc: libkcompactdisc (CD playing/ripping library)
+libkcompactdisc:
+libkcompactdisc: A KDE library for playing and ripping CDs.
libkcompactdisc:
-libkcompactdisc: A KDE library for playing & ripping CDs.
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
-libkcompactdisc: For more information, visit: http://www.kde.org
libkcompactdisc:
diff --git a/kde/slack-desc/libkdcraw b/kde/slack-desc/libkdcraw
index 4cf8dee..98de517 100644
--- a/kde/slack-desc/libkdcraw
+++ b/kde/slack-desc/libkdcraw
@@ -8,10 +8,10 @@
|-----handy-ruler------------------------------------------------------|
libkdcraw: libkdcraw (library wrapper around dcraw)
libkdcraw:
-libkdcraw: Libkdcraw is a C++ interface around the dcraw binary program, used
-libkdcraw: to decode RAW picture files.
+libkdcraw: Libkdcraw is a C++ interface around the dcraw binary program, used to
+libkdcraw: decode RAW picture files.
+libkdcraw:
libkdcraw:
-libkdcraw: For more information, visit: http://www.kipi-plugins.org/
libkdcraw:
libkdcraw:
libkdcraw:
diff --git a/kde/slack-desc/libkdegames b/kde/slack-desc/libkdegames
index d383885..5081771 100644
--- a/kde/slack-desc/libkdegames
+++ b/kde/slack-desc/libkdegames
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkdegames: libkdegames (common code and data for many KDE games)
+libkdegames: libkdegames (KDE game library)
libkdegames:
libkdegames: Libkdegames contains common code and data for many KDE games.
libkdegames:
@@ -15,5 +15,5 @@ libkdegames:
libkdegames:
libkdegames:
libkdegames:
-libkdegames: For more information, visit: http://www.kde.org
+libkdegames:
libkdegames:
diff --git a/kde/slack-desc/libkdepim b/kde/slack-desc/libkdepim
index ad7eaf8..c7deb47 100644
--- a/kde/slack-desc/libkdepim
+++ b/kde/slack-desc/libkdepim
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkdepim: libkdepim (libraries for KDE PIM applications)
+libkdepim: libkdepim (KDE PIM libraries)
libkdepim:
libkdepim: The package contains libraries for KDE PIM applications.
libkdepim:
@@ -15,5 +15,5 @@ libkdepim:
libkdepim:
libkdepim:
libkdepim:
-libkdepim: Home page: http://www.kde.org/
+libkdepim:
libkdepim:
diff --git a/kde/slack-desc/libkeduvocdocument b/kde/slack-desc/libkeduvocdocument
index 7269da2..bdfdd85 100644
--- a/kde/slack-desc/libkeduvocdocument
+++ b/kde/slack-desc/libkeduvocdocument
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkeduvocdocument: libkeduvocdocument (library to read and write KVTML files)
+libkeduvocdocument: libkeduvocdocument (KVTML library)
+libkeduvocdocument:
+libkeduvocdocument: A library (formerly part of kdeedu) for reading from/writing to the
+libkeduvocdocument: KVTML format (and others too).
+libkeduvocdocument:
libkeduvocdocument:
-libkeduvocdocument: A library (formerly part of kdeedu) for reading from/writing to
-libkeduvocdocument: the KVTML format (and others too).
-libkeduvocdocument: Currently used by: kanagram, khangman, parley, kwordquiz.
libkeduvocdocument:
libkeduvocdocument:
libkeduvocdocument:
libkeduvocdocument:
-libkeduvocdocument: For more information, visit: http://www.kde.org
libkeduvocdocument:
diff --git a/kde/slack-desc/libkexiv2 b/kde/slack-desc/libkexiv2
index 7a20619..106fc2e 100644
--- a/kde/slack-desc/libkexiv2
+++ b/kde/slack-desc/libkexiv2
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkexiv2: libkexiv2 (wrapper library for exiv2 library)
+libkexiv2: libkexiv2 (wrapper library for exiv2)
libkexiv2:
libkexiv2: Libkexiv2 is a KDE wrapper around the Exiv2 library to manipulate
-libkexiv2: pictures' metadata.
+libkexiv2: image metadata.
+libkexiv2:
libkexiv2:
-libkexiv2: For more information, visit: http://www.kipi-plugins.org/
libkexiv2:
libkexiv2:
libkexiv2:
diff --git a/kde/slack-desc/libkgapi b/kde/slack-desc/libkgapi
index 1ad6f96..7d0f76c 100644
--- a/kde/slack-desc/libkgapi
+++ b/kde/slack-desc/libkgapi
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkgapi: libkgapi (library for interacting with Google service API)
+libkgapi: libkgapi (Google service API library)
+libkgapi:
+libkgapi: A KDE-based library for accessing various Google services via their
+libkgapi: public API.
libkgapi:
-libkgapi: A KDE-based library for accessing various Google services
-libkgapi: via their public API.
libkgapi:
libkgapi:
libkgapi:
libkgapi:
libkgapi:
-libkgapi: For more information, visit: http://www.kde.org
libkgapi:
diff --git a/kde/slack-desc/libkgeomap b/kde/slack-desc/libkgeomap
index 2480a7f..47b48fc 100644
--- a/kde/slack-desc/libkgeomap
+++ b/kde/slack-desc/libkgeomap
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkgeomap: libkgeomap (library for world map components)
+libkgeomap: libkgeomap (world map library)
libkgeomap:
-libkgeomap: A wrapper around world map components like marble, openstreetmap
-libkgeomap: and googlemap, for browsing and arranging photos on a map.
+libkgeomap: Libkgeomap is a wrapper around world map components as Marble,
+libkgeomap: OpenstreetMap and GoogleMap, for browsing and arranging photos on a
+libkgeomap: map.
libkgeomap:
+libkgeomap: Homepage: https://github.com/KDE/libkgeomap
libkgeomap:
libkgeomap:
libkgeomap:
libkgeomap:
-libkgeomap: For more information, visit: http://www.digikam.org
-libkgeomap:
diff --git a/kde/slack-desc/libkipi b/kde/slack-desc/libkipi
index c1098f9..c883824 100644
--- a/kde/slack-desc/libkipi
+++ b/kde/slack-desc/libkipi
@@ -6,13 +6,13 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkipi: libKipi (KDE Image Plugin Interface)
+libkipi: libkipi (KDE Image Plugin Interface)
libkipi:
libkipi: This package provides a generic KDE Image Plug-in Interface used by
-libkipi: some KDE image applications.
-libkipi: Plug-ins for this interface are in the kipi-plugins package.
+libkipi: some KDE image applications. Plug-ins for this interface are in the
+libkipi: kipi-plugins package.
libkipi:
-libkipi: For more info, visit: http://www.kipi-plugins.org/
+libkipi: Homepage: https://github.com/KDE/libkipi
libkipi:
libkipi:
libkipi:
diff --git a/kde/slack-desc/libkleo b/kde/slack-desc/libkleo
index 3b0dc39..657216f 100644
--- a/kde/slack-desc/libkleo
+++ b/kde/slack-desc/libkleo
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkleo: libkleo (KDE PIM cryptographic library)
+libkleo: libkleo (KDE key manager library)
libkleo:
-libkleo: libkleo is a KDE PIM cryptographic library.
+libkleo: This is libkleo, a library used by KDE PIM applications to handle
+libkleo: cryptographic key and certificate management.
libkleo:
libkleo:
libkleo:
libkleo:
libkleo:
libkleo:
-libkleo: Home page: http://www.kde.org/
libkleo:
diff --git a/kde/slack-desc/libkmahjongg b/kde/slack-desc/libkmahjongg
index 8851a3c..ac33822 100644
--- a/kde/slack-desc/libkmahjongg
+++ b/kde/slack-desc/libkmahjongg
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkmahjongg: libkmahjongg (library for rendering of Mahjongg tilesets)
+libkmahjongg: libkmahjongg (Mahjongg tilesets library)
+libkmahjongg:
+libkmahjongg: libkmahjongg is a library used by several KDE games for loading and
+libkmahjongg: rendering of Mahjongg tilesets.
libkmahjongg:
-libkmahjongg: libkmahjongg is a library used by several KDE games for loading
-libkmahjongg: and rendering of Mahjongg tilesets.
libkmahjongg:
libkmahjongg:
libkmahjongg:
libkmahjongg:
libkmahjongg:
-libkmahjongg: For more information, visit: http://www.kde.org
libkmahjongg:
diff --git a/kde/slack-desc/libkomparediff2 b/kde/slack-desc/libkomparediff2
index 6faddf7..4bb3e87 100644
--- a/kde/slack-desc/libkomparediff2
+++ b/kde/slack-desc/libkomparediff2
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkomparediff2: libkomparediff2 (library to compare files and strings)
+libkomparediff2: libkomparediff2 (file comparison library)
+libkomparediff2:
+libkomparediff2: libkomparediff2 is a shared library to compare files and strings using
+libkomparediff2: kdelibs and GNU diff, used in Kompare and KDevelop.
+libkomparediff2:
libkomparediff2:
-libkomparediff2: libkomparediff2 is a shared library to compare files
-libkomparediff2: and strings using kdelibs and GNU diff, used in Kompare
-libkomparediff2: and KDevelop.
libkomparediff2:
libkomparediff2:
libkomparediff2:
libkomparediff2:
-libkomparediff2: For more information, visit: http://www.kde.org
libkomparediff2:
diff --git a/kde/slack-desc/libksane b/kde/slack-desc/libksane
index 2146c3c..4399db5 100644
--- a/kde/slack-desc/libksane
+++ b/kde/slack-desc/libksane
@@ -6,11 +6,11 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libksane: libksane (KDE scan support interface)
+libksane: libksane (KDE scanner library)
libksane:
libksane: Libksane is a library to add scan support to KDE applications.
libksane:
-libksane: For more information, visit: http://www.kde.org
+libksane:
libksane:
libksane:
libksane:
diff --git a/kde/slack-desc/libkscreen2 b/kde/slack-desc/libkscreen2
index 4882728..1d59b7a 100644
--- a/kde/slack-desc/libkscreen2
+++ b/kde/slack-desc/libkscreen2
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkscreen2: libkscreen2 (KDE screen management library)
+libkscreen2: libkscreen2 (screen management library)
+libkscreen2:
+libkscreen2: LibKScreen2 is a library that provides access to current configuration
+libkscreen2: of connected displays and ways to change the configuration.
+libkscreen2:
+libkscreen2:
libkscreen2:
-libkscreen2: LibKScreen2 is a library that provides access to current
-libkscreen2: configuration of connected displays and ways to change
-libkscreen2: the configuration.
libkscreen2:
libkscreen2:
libkscreen2:
-libkscreen2: For more information, visit:
-libkscreen2: http://community.kde.org/Solid/Projects/ScreenManagement
libkscreen2:
diff --git a/kde/slack-desc/libksieve b/kde/slack-desc/libksieve
index 440ab06..c1fbbe5 100644
--- a/kde/slack-desc/libksieve
+++ b/kde/slack-desc/libksieve
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libksieve: libksieve (KDE PIM library for managing sieve mailfilters)
+libksieve: libksieve (sieve mailfilter library)
libksieve:
libksieve: libksieve is a KDE PIM library for managing sieve mailfilters.
libksieve:
@@ -15,5 +15,5 @@ libksieve:
libksieve:
libksieve:
libksieve:
-libksieve: Home page: http://www.kde.org/
+libksieve:
libksieve:
diff --git a/kde/slack-desc/libksysguard b/kde/slack-desc/libksysguard
index 1d65883..b34700d 100644
--- a/kde/slack-desc/libksysguard
+++ b/kde/slack-desc/libksysguard
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-libksysguard: libksysguard (libksysguard)
+libksysguard: libksysguard (system information library)
libksysguard:
+libksysguard: Library to retrieve information on the current status of your computer
+libksysguard: hardware.
libksysguard:
libksysguard:
libksysguard:
@@ -15,5 +17,3 @@ libksysguard:
libksysguard:
libksysguard:
libksysguard:
-libksysguard:
-libksysguard: Homepage: http://kde.org/
diff --git a/kde/slack-desc/libktorrent b/kde/slack-desc/libktorrent
index 5bc41f8..401a21b 100644
--- a/kde/slack-desc/libktorrent
+++ b/kde/slack-desc/libktorrent
@@ -5,15 +5,15 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler------------------------------------------------------|
-libktorrent: libktorrent (Protocol library for the KDE BitTorrent program)
+ |-----handy-ruler------------------------------------------------------|
+libktorrent: libktorrent (KDE BitTorrent library)
libktorrent:
libktorrent: Libktorrent is the BitTorrent protocol library for ktorrent, which
-libktorrent: contains all the torrent downloading code. Although it is closely
-libktorrent: to ktorrent, the goal is to make libktorrent an independent
+libktorrent: contains all the torrent downloading code. Although it is closely
+libktorrent: related to ktorrent, the goal is to make libktorrent an independent
libktorrent: library which can be used by other applications.
libktorrent:
-libktorrent: Homepage: http://ktorrent.org
+libktorrent: Homepage: https://kde.org/applications/en/internet/org.kde.ktorrent
libktorrent:
libktorrent:
libktorrent:
diff --git a/kde/slack-desc/lokalize b/kde/slack-desc/lokalize
index dc143f7..43f8bf5 100644
--- a/kde/slack-desc/lokalize
+++ b/kde/slack-desc/lokalize
@@ -15,5 +15,5 @@ lokalize: merging (synchronization) capability. It is primarily targeted for
lokalize: software translation and also integrates external conversion tools
lokalize: for freelance office document translation.
lokalize:
-lokalize: Home: http://www.kde.org/applications/development/lokalize/
+lokalize: Homepage: https://www.kde.org/applications/development/lokalize/
lokalize:
diff --git a/kde/slack-desc/lskat b/kde/slack-desc/lskat
index cccb871..93005eb 100644
--- a/kde/slack-desc/lskat
+++ b/kde/slack-desc/lskat
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-lskat: lskat (Lieutenant Skat card game for KDE)
+lskat: lskat (Lieutenant Skat card game)
lskat:
lskat: Lieutenant Skat (from German "Offiziersskat") is a fun and engaging
lskat: card game for two players, where the second player is either live
@@ -15,5 +15,5 @@ lskat:
lskat:
lskat:
lskat:
-lskat: For more information, visit: http://www.kde.org
+lskat:
lskat:
diff --git a/kde/slack-desc/mailcommon b/kde/slack-desc/mailcommon
index 4442708..ea23e59 100644
--- a/kde/slack-desc/mailcommon
+++ b/kde/slack-desc/mailcommon
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-mailcommon: mailcommon (KDE PIM library support for mail applications)
+mailcommon: mailcommon (mail application library)
mailcommon:
mailcommon: KDE PIM library providing support for mail applications.
mailcommon:
@@ -15,5 +15,5 @@ mailcommon:
mailcommon:
mailcommon:
mailcommon:
-mailcommon: Home page: http://www.kde.org/
+mailcommon:
mailcommon:
diff --git a/kde/slack-desc/mailimporter b/kde/slack-desc/mailimporter
index f8a248a..20a129c 100644
--- a/kde/slack-desc/mailimporter
+++ b/kde/slack-desc/mailimporter
@@ -15,5 +15,5 @@ mailimporter:
mailimporter:
mailimporter:
mailimporter:
-mailimporter: Home page: http://www.kde.org/
+mailimporter:
mailimporter:
diff --git a/kde/slack-desc/marble b/kde/slack-desc/marble
index 06e3e8e..d018d65 100644
--- a/kde/slack-desc/marble
+++ b/kde/slack-desc/marble
@@ -8,13 +8,12 @@
|-----handy-ruler------------------------------------------------------|
marble: marble (virtual globe)
marble:
-marble: Marble is a virtual globe with advanced routing capabilities. You can
+marble: Marble is a virtual globe with advanced routing capabilities. You can
marble: download maps from a variety of themes and explore the surroundings.
-marble: Record your trip and share it with your friends.
-marble: Features: online and offline routing, GPS tracking and recording,
-marble: themable maps (OpenStreetMap, Satellite Map and more), support for
-marble: different projections (globe, flat map, ...) and other planets,
-marble: download of maps and route data for offline usage.
+marble: Record your trip and share it with your friends. Features online and
+marble: offline routing, GPS tracking and recording, themable maps
+marble: (OpenStreetMap, Satellite Map and more), support for different
+marble: projections (globe, flat map, ...) and other planets, and download of
+marble: maps and route data for offline usage.
+marble:
marble:
-marble: For more information, visit: http://edu.kde.org/
-
diff --git a/kde/slack-desc/mbox-importer b/kde/slack-desc/mbox-importer
index 96e34f8..e16a125 100644
--- a/kde/slack-desc/mbox-importer
+++ b/kde/slack-desc/mbox-importer
@@ -15,5 +15,5 @@ mbox-importer:
mbox-importer:
mbox-importer:
mbox-importer:
-mbox-importer: Home page: http://www.kde.org/
+mbox-importer:
mbox-importer:
diff --git a/kde/slack-desc/messagelib b/kde/slack-desc/messagelib
index 36f958a..623a691 100644
--- a/kde/slack-desc/messagelib
+++ b/kde/slack-desc/messagelib
@@ -15,5 +15,5 @@ messagelib:
messagelib:
messagelib:
messagelib:
-messagelib: Home page: http://www.kde.org/
+messagelib:
messagelib:
diff --git a/kde/slack-desc/milou b/kde/slack-desc/milou
index 0d4dc65..4e52896 100644
--- a/kde/slack-desc/milou
+++ b/kde/slack-desc/milou
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
milou: milou (Plasma search applet)
milou:
-milou: A Plasma applet that can search files, emails, contacts,
-milou: events and more data indexed by KDE Desktop Search.
+milou: A Plasma applet that can search files, emails, contacts, events and
+milou: more data indexed by KDE Desktop Search.
+milou:
milou:
milou:
milou:
milou:
milou:
milou:
-milou: Homepage: http://kde.org/
diff --git a/kde/slack-desc/minuet b/kde/slack-desc/minuet
index 45eeaee..fb97760 100644
--- a/kde/slack-desc/minuet
+++ b/kde/slack-desc/minuet
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
minuet: minuet (software for music education)
minuet:
-minuet: Minuet: the KDE software for music education, such as ear training,
+minuet: Minuet is the KDE software for music education, such as ear training,
minuet: first-sight reading, solfa, scales, rhythm, harmony, and
-minuet: improvisation.
-minuet: Minuet makes extensive use of MIDI capabilities.
+minuet: improvisation. Minuet makes extensive use of MIDI capabilities.
+minuet:
+minuet:
minuet:
minuet:
minuet:
-minuet: For more information, visit: http://www.kde.org
minuet:
diff --git a/kde/slack-desc/modemmanager-qt b/kde/slack-desc/modemmanager-qt
index d515c01..ce9a1f6 100644
--- a/kde/slack-desc/modemmanager-qt
+++ b/kde/slack-desc/modemmanager-qt
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
modemmanager-qt: modemmanager-qt (ModemManager Qt5 bindings)
modemmanager-qt:
-modemmanager-qt: modemmanager-qt is a Tier 1 KDE Frameworks module
-modemmanager-qt: wrapping ModemManager DBus API.
+modemmanager-qt: modemmanager-qt is a Tier 1 KDE Frameworks module wrapping the
+modemmanager-qt: ModemManager DBus API.
+modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
-modemmanager-qt: For more information, visit: http://www.kde.org
modemmanager-qt:
diff --git a/kde/slack-desc/networkmanager-qt b/kde/slack-desc/networkmanager-qt
index 45c6ba5..5c0ce54 100644
--- a/kde/slack-desc/networkmanager-qt
+++ b/kde/slack-desc/networkmanager-qt
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-networkmanager-qt: libnm-qt (NetworkManager Qt bindings)
+networkmanager-qt: networkmanager-qt (NetworkManager Qt bindings)
networkmanager-qt:
networkmanager-qt: This package contains Qt bindings for NetworkManager.
networkmanager-qt:
@@ -15,5 +15,5 @@ networkmanager-qt:
networkmanager-qt:
networkmanager-qt:
networkmanager-qt:
-networkmanager-qt: For more information, visit: http://www.kde.org
+networkmanager-qt:
networkmanager-qt:
diff --git a/kde/slack-desc/okteta b/kde/slack-desc/okteta
index acc83d2..23c1c6b 100644
--- a/kde/slack-desc/okteta
+++ b/kde/slack-desc/okteta
@@ -15,5 +15,5 @@ okteta:
okteta:
okteta:
okteta:
-okteta: For more information, visit: http://www.kde.org
+okteta:
okteta:
diff --git a/kde/slack-desc/okular b/kde/slack-desc/okular
index 333d94f..9bf4c4b 100644
--- a/kde/slack-desc/okular
+++ b/kde/slack-desc/okular
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
okular: okular (a document viewer)
okular:
-okular: Okular is a document viewer for KDE.
-okular:
-okular: For more information, visit: http://www.kde.org
-okular:
-okular:
+okular: Okular is the unified document viewer for KDE. Okular combines
+okular: excellent functionalities with the versatility of supporting different
+okular: kinds of documents, like PDF, Postscript, DjVu, CHM, XPS, ePub, and
+okular: others.
okular:
+okular: Homepage: https://okular.kde.org
okular:
okular:
okular:
diff --git a/kde/slack-desc/oxygen b/kde/slack-desc/oxygen
index 3e090ef..8b323f3 100644
--- a/kde/slack-desc/oxygen
+++ b/kde/slack-desc/oxygen
@@ -8,7 +8,8 @@
|-----handy-ruler------------------------------------------------------|
oxygen: oxygen (KDE window manager theme)
oxygen:
-oxygen: KDE window manager theme.
+oxygen: Oxygen KDE window manager theme.
+oxygen:
oxygen:
oxygen:
oxygen:
@@ -16,4 +17,3 @@ oxygen:
oxygen:
oxygen:
oxygen:
-oxygen: Homepage: http://kde.org/
diff --git a/kde/slack-desc/oxygen-fonts b/kde/slack-desc/oxygen-fonts
index aae2124..1aae695 100644
--- a/kde/slack-desc/oxygen-fonts
+++ b/kde/slack-desc/oxygen-fonts
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
oxygen-fonts: oxygen-fonts (KDE desktop fonts)
oxygen-fonts:
-oxygen-fonts: Desktop/GUI font family for integrated use with the
-oxygen-fonts: KDE desktop.
+oxygen-fonts: Desktop/GUI font family for integrated use with the KDE desktop.
+oxygen-fonts:
+oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
-oxygen-fonts: Homepage: http://kde.org/
diff --git a/kde/slack-desc/oxygen-gtk2 b/kde/slack-desc/oxygen-gtk2
index 9398d8d..3e7d4f5 100644
--- a/kde/slack-desc/oxygen-gtk2
+++ b/kde/slack-desc/oxygen-gtk2
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
oxygen-gtk2: oxygen-gtk2 (Oxygen GTK+ engine)
oxygen-gtk2:
-oxygen-gtk2: Oxygen-Gtk2 is a port of the KDE widget theme Oxygen, to GTK+.
-oxygen-gtk2: It's primary goal is to ensure visual consistency between GTK+ and
-oxygen-gtk2: qt-based applications running under kde. A secondary objective is
-oxygen-gtk2: to also have a stand-alone nice looking GTK+ theme that would behave
-oxygen-gtk2: well on other Desktop Environments.
-oxygen-gtk2: Unlike other attempts made to port the kde oxygen theme to GTK+, this
-oxygen-gtk2: attempt does not depend on Qt.
+oxygen-gtk2: Oxygen-Gtk2 is a port of the KDE widget theme Oxygen, to GTK+. Its
+oxygen-gtk2: primary goal is to ensure visual consistency between GTK+ and qt-based
+oxygen-gtk2: applications running under KDE. A secondary objective is to also have
+oxygen-gtk2: a stand-alone nice looking GTK+ theme that would behave well on other
+oxygen-gtk2: desktop environments. Unlike other attempts made to port the KDE
+oxygen-gtk2: oxygen theme to GTK+, this attempt does not depend on Qt.
oxygen-gtk2:
oxygen-gtk2: See: http://projects.kde.org/projects/playground/artwork/oxygen-gtk
+oxygen-gtk2:
diff --git a/kde/slack-desc/oxygen-icons5 b/kde/slack-desc/oxygen-icons5
index fab6fec..bbb2f1d 100644
--- a/kde/slack-desc/oxygen-icons5
+++ b/kde/slack-desc/oxygen-icons5
@@ -6,11 +6,11 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-oxygen-icons5: oxygen-icons5 (Oxygen theme for the KDE Plasma Desktop)
+oxygen-icons5: oxygen-icons5 (Oxygen theme for KDE)
oxygen-icons5:
oxygen-icons5: Oxygen provides a complete and modern icon theme for KDE.
oxygen-icons5:
-oxygen-icons5: Visit the Oxygen project online: http://www.oxygen-icons5.org
+oxygen-icons5:
oxygen-icons5:
oxygen-icons5:
oxygen-icons5:
diff --git a/kde/slack-desc/palapeli b/kde/slack-desc/palapeli
index f0d2e85..99cc7ba 100644
--- a/kde/slack-desc/palapeli
+++ b/kde/slack-desc/palapeli
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
palapeli: palapeli (jigsaw puzzle game)
palapeli:
-palapeli: Palapeli is a single-player jigsaw puzzle game.
-palapeli: Unlike other games in that genre, you are not limited to aligning
-palapeli: pieces on imaginary grids. The pieces are freely moveable.
-palapeli: Also, Palapeli features real persistency, i.e. everything you do
-palapeli: is saved on your disk immediately.
+palapeli: Palapeli is a single-player jigsaw puzzle game. Unlike other games in
+palapeli: that genre, you are not limited to aligning pieces on imaginary grids.
+palapeli: The pieces are freely moveable. Also, Palapeli features real
+palapeli: persistency, i.e. everything you do is saved immediately.
+palapeli:
+palapeli:
palapeli:
palapeli:
-palapeli: For more information, visit: http://www.kde.org
palapeli:
diff --git a/kde/slack-desc/parley b/kde/slack-desc/parley
index c4c08e9..765c0a7 100644
--- a/kde/slack-desc/parley
+++ b/kde/slack-desc/parley
@@ -10,7 +10,7 @@ parley: parley (vocabulary trainer)
parley:
parley: Parley is a vocabulary trainer for KDE.
parley:
-parley: For more information, visit: http://edu.kde.org/
+parley:
parley:
parley:
parley:
diff --git a/kde/slack-desc/partitionmanager b/kde/slack-desc/partitionmanager
index 37dbe49..846bfe4 100644
--- a/kde/slack-desc/partitionmanager
+++ b/kde/slack-desc/partitionmanager
@@ -5,12 +5,12 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler------------------------------------------------|
-partitionmanager: partitionmanager (Graphical partition manager for KDE)
+ |-----handy-ruler------------------------------------------------------|
+partitionmanager: partitionmanager (Graphical partition manager)
+partitionmanager:
+partitionmanager: Easily manage disks, partitions and filesystems on your KDE desktop.
+partitionmanager: Create, resize, move, copy, back up, restore or delete partitions.
partitionmanager:
-partitionmanager: Easily manage disks, partitions and filesystems on your KDE
-partitionmanager: desktop. Create, resize, move, copy, back up, restore or
-partitionmanager: delete partitions.
partitionmanager:
partitionmanager:
partitionmanager:
diff --git a/kde/slack-desc/picmi b/kde/slack-desc/picmi
index bc23ac6..4d01048 100644
--- a/kde/slack-desc/picmi
+++ b/kde/slack-desc/picmi
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
picmi: picmi (logic puzzle game)
picmi:
-picmi: Picmi is a single player logic-based puzzle game.
-picmi: The goal is to color cells according to numbers given at the side
-picmi: of the board in order to uncover a hidden pattern or picture.
+picmi: Picmi is a single player logic-based puzzle game. The goal is to color
+picmi: cells according to numbers given at the side of the board in order to
+picmi: uncover a hidden pattern or picture.
+picmi:
picmi:
picmi:
picmi:
picmi:
-picmi: For more information, visit: http://www.kde.org
picmi:
diff --git a/kde/slack-desc/pim-data-exporter b/kde/slack-desc/pim-data-exporter
index 6094dde..e4d4135 100644
--- a/kde/slack-desc/pim-data-exporter
+++ b/kde/slack-desc/pim-data-exporter
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-pim-data-exporter: pim-data-exporter (import and export KDE PIM settings)
+pim-data-exporter: pim-data-exporter (export KDE PIM settings)
pim-data-exporter:
pim-data-exporter: Import and export KDE PIM settings.
pim-data-exporter:
@@ -15,5 +15,5 @@ pim-data-exporter:
pim-data-exporter:
pim-data-exporter:
pim-data-exporter:
-pim-data-exporter: Home page: http://www.kde.org/
+pim-data-exporter:
pim-data-exporter:
diff --git a/kde/slack-desc/pim-sieve-editor b/kde/slack-desc/pim-sieve-editor
index ea1e912..423ba8f 100644
--- a/kde/slack-desc/pim-sieve-editor
+++ b/kde/slack-desc/pim-sieve-editor
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-pim-sieve-editor: pim-sieve-editor (mail sieve editor)
+pim-sieve-editor: pim-sieve-editor (Sieve script editor)
pim-sieve-editor:
-pim-sieve-editor: Mail sieve editor.
+pim-sieve-editor: pim-sieve-editor is an editor for Sieve scripts used for email
+pim-sieve-editor: filtering on a mail server.
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
-pim-sieve-editor: Home page: http://www.kde.org/
pim-sieve-editor:
diff --git a/kde/slack-desc/pimcommon b/kde/slack-desc/pimcommon
index 3279604..699738a 100644
--- a/kde/slack-desc/pimcommon
+++ b/kde/slack-desc/pimcommon
@@ -15,5 +15,5 @@ pimcommon:
pimcommon:
pimcommon:
pimcommon:
-pimcommon: Home page: http://www.kde.org/
+pimcommon:
pimcommon:
diff --git a/kde/slack-desc/plasma-browser-integration b/kde/slack-desc/plasma-browser-integration
index 97d3468..2097608 100644
--- a/kde/slack-desc/plasma-browser-integration
+++ b/kde/slack-desc/plasma-browser-integration
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-browser-integration: plasma-browser-integration (integrate browsers into the Plasma desktop)
+plasma-browser-integration: plasma-browser-integration (integrate browsers into Plasma)
+plasma-browser-integration:
+plasma-browser-integration: The plasma-browser-integration package contains components necessary
+plasma-browser-integration: to integrate browsers into the Plasma Desktop
plasma-browser-integration:
-plasma-browser-integration: The plasma-browser-integration package contains
-plasma-browser-integration: omponents necessary to integrate browsers into the Plasma Desktop
plasma-browser-integration:
plasma-browser-integration:
plasma-browser-integration:
plasma-browser-integration:
plasma-browser-integration:
-plasma-browser-integration: Home page: https://www.kde.org/plasma-desktop
plasma-browser-integration:
diff --git a/kde/slack-desc/plasma-desktop b/kde/slack-desc/plasma-desktop
index c978f4b..ea48427 100644
--- a/kde/slack-desc/plasma-desktop
+++ b/kde/slack-desc/plasma-desktop
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
plasma-desktop: plasma-desktop (KDE Plasma Desktop)
plasma-desktop:
-plasma-desktop: Provides the environment for running and managing
-plasma-desktop: applications and integrating interaction of
-plasma-desktop: applications. It is designed as generic environment
-plasma-desktop: for all kinds of desktop applications, not only
-plasma-desktop: applications built on the KDE Platform. It integrates
-plasma-desktop: best with applications following the standards used
-plasma-desktop: by the KDE Platform.
+plasma-desktop: Provides the environment for running and managing applications and
+plasma-desktop: integrating interaction of applications. It is designed as a generic
+plasma-desktop: environment for all kinds of desktop applications, not only
+plasma-desktop: applications built on the KDE Platform. It integrates best with
+plasma-desktop: applications following the standards used by the KDE Platform.
+plasma-desktop:
+plasma-desktop:
+plasma-desktop:
plasma-desktop:
-plasma-desktop: Homepage: http://kde.org/
diff --git a/kde/slack-desc/plasma-framework b/kde/slack-desc/plasma-framework
index 8eab3dc..25f0612 100644
--- a/kde/slack-desc/plasma-framework
+++ b/kde/slack-desc/plasma-framework
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-plasma-framework: plasma-framework (Plasma libraries and runtime components)
+plasma-framework: plasma-framework (Plasma libraries and components)
+plasma-framework:
+plasma-framework: This package contains Plasma libraries and runtime components such as
+plasma-framework: QML support for Plasma.
plasma-framework:
-plasma-framework: This package contains Plasma libraries and runtime
-plasma-framework: components such as QML support for Plasma.
plasma-framework:
plasma-framework:
plasma-framework:
plasma-framework:
plasma-framework:
plasma-framework:
-plasma-framework: Homepage: http://kde.org/
diff --git a/kde/slack-desc/plasma-integration b/kde/slack-desc/plasma-integration
index ff92725..0a075a6 100644
--- a/kde/slack-desc/plasma-integration
+++ b/kde/slack-desc/plasma-integration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
plasma-integration: plasma-integration (Plasma theme integration plugins)
plasma-integration:
-plasma-integration: Qt Platform Theme integration plugins for the Plasma workspaces
+plasma-integration: Plasma Integration is a set of plugins responsible for better
+plasma-integration: integration of Qt applications when running on a KDE Plasma workspace.
+plasma-integration:
plasma-integration:
plasma-integration:
plasma-integration:
plasma-integration:
plasma-integration:
-plasma-integration: For more information, visit:
-plasma-integration: https://projects.kde.org/plasma-integration
plasma-integration:
diff --git a/kde/slack-desc/plasma-pa b/kde/slack-desc/plasma-pa
index 9ad039c..21bcb68 100644
--- a/kde/slack-desc/plasma-pa
+++ b/kde/slack-desc/plasma-pa
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-pa: plasma-pa (KDE audio volume manager using PA)
+plasma-pa: plasma-pa (Plasma PA volume applet)
plasma-pa:
plasma-pa: Plasma applet for audio volume management using PulseAudio.
plasma-pa:
@@ -15,5 +15,5 @@ plasma-pa:
plasma-pa:
plasma-pa:
plasma-pa:
-plasma-pa: For more information, visit: https://projects.kde.org/plasma-pa
+plasma-pa:
plasma-pa:
diff --git a/kde/slack-desc/plasma-sdk b/kde/slack-desc/plasma-sdk
index 5da3248..21d29bd 100644
--- a/kde/slack-desc/plasma-sdk
+++ b/kde/slack-desc/plasma-sdk
@@ -15,5 +15,5 @@ plasma-sdk:
plasma-sdk:
plasma-sdk:
plasma-sdk:
-plasma-sdk: For more information, visit: http://www.kde.org
+plasma-sdk:
plasma-sdk:
diff --git a/kde/slack-desc/plasma-vault b/kde/slack-desc/plasma-vault
index 32a8ac5..8747156 100644
--- a/kde/slack-desc/plasma-vault
+++ b/kde/slack-desc/plasma-vault
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-vault: plasma-vault (create encrypted vaults in plasma5 desktop)
+plasma-vault: plasma-vault (create encrypted vaults)
plasma-vault:
-plasma-vault: Plasma applet and services for creating encrypted vaults.
-plasma-vault: Plasma Vault offers strong encryption features presented in
-plasma-vault: a user-friendly way. Lock and encrypt documents and hide them
-plasma-vault: when the user is logged in.
+plasma-vault: Plasma applet and services for creating encrypted vaults. Plasma Vault
+plasma-vault: offers strong encryption features presented in a user-friendly way.
+plasma-vault: Lock and encrypt documents and hide them when the user is logged in.
plasma-vault: These 'vaults' can be decrypted and opened easily.
plasma-vault:
plasma-vault:
-plasma-vault: Home page: http://www.kde.org/
+plasma-vault:
+plasma-vault:
plasma-vault:
diff --git a/kde/slack-desc/plasma-wayland-protocols b/kde/slack-desc/plasma-wayland-protocols
index 6d568bc..8c597c4 100644
--- a/kde/slack-desc/plasma-wayland-protocols
+++ b/kde/slack-desc/plasma-wayland-protocols
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-wayland-protocols: plasma-wayland-protocols (plasma specific protocols for wayland)
+plasma-wayland-protocols: plasma-wayland-protocols (Plasma protocols for Wayland)
plasma-wayland-protocols:
-plasma-wayland-protocols: Plasma specific protocols for Wayland.
+plasma-wayland-protocols: This project contains xml files of non-standard Wayland protocols used
+plasma-wayland-protocols: by Plasma.
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
-plasma-wayland-protocols: Home page: https://kde.org/plasma-desktop
plasma-wayland-protocols:
diff --git a/kde/slack-desc/plasma-workspace b/kde/slack-desc/plasma-workspace
index 7003c84..512a2b8 100644
--- a/kde/slack-desc/plasma-workspace
+++ b/kde/slack-desc/plasma-workspace
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
plasma-workspace: plasma-workspace (KDE Plasma Workspace)
plasma-workspace:
+plasma-workspace: The Plasma Workspace provides support for KDE Plasma Widgets,
+plasma-workspace: integrated search, hardware management, and a high degree of
+plasma-workspace: customizability.
plasma-workspace:
plasma-workspace:
plasma-workspace:
plasma-workspace:
plasma-workspace:
plasma-workspace:
-plasma-workspace:
-plasma-workspace:
-plasma-workspace: Homepage: http://kde.org/
diff --git a/kde/slack-desc/plasma-workspace-wallpapers b/kde/slack-desc/plasma-workspace-wallpapers
index 113df69..6dc16da 100644
--- a/kde/slack-desc/plasma-workspace-wallpapers
+++ b/kde/slack-desc/plasma-workspace-wallpapers
@@ -5,10 +5,10 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler-------------------------------------------------|
-plasma-workspace-wallpapers: plasma-workspace-wallpapers (Wallpapers for KDE Plasma Workspace)
+ |-----handy-ruler------------------------------------------------------|
+plasma-workspace-wallpapers: plasma-workspace-wallpapers (Wallpapers for Plasma)
plasma-workspace-wallpapers:
-plasma-workspace-wallpapers: Additional wallpapers for KDE.
+plasma-workspace-wallpapers: Additional wallpapers for the KDE Plasma Workspace.
plasma-workspace-wallpapers:
plasma-workspace-wallpapers:
plasma-workspace-wallpapers:
diff --git a/kde/slack-desc/plasma5-nm b/kde/slack-desc/plasma5-nm
index 1c2dab3..8d638eb 100644
--- a/kde/slack-desc/plasma5-nm
+++ b/kde/slack-desc/plasma5-nm
@@ -9,11 +9,11 @@
plasma5-nm: plasma5-nm (KDE networkmanagement applet)
plasma5-nm:
plasma5-nm: This package contains the KDE networkmanagement applet for Plasma 5.
-plasma5-nm: This applet is written in QML and replacing the old widget based
-plasma5-nm: networkmanagement applet.
plasma5-nm:
plasma5-nm:
plasma5-nm:
plasma5-nm:
-plasma5-nm: For more information, visit: http://www.kde.org
+plasma5-nm:
+plasma5-nm:
+plasma5-nm:
plasma5-nm:
diff --git a/kde/slack-desc/polkit-kde-framework b/kde/slack-desc/polkit-kde-framework
index 9d62204..5846763 100644
--- a/kde/slack-desc/polkit-kde-framework
+++ b/kde/slack-desc/polkit-kde-framework
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
polkit-kde-framework: polkit-kde-framework (KDE polkit authenticator)
polkit-kde-framework:
polkit-kde-framework: This daemon provides a polkit authenticator UI for KDE.
polkit-kde-framework:
+polkit-kde-framework: See also:
+polkit-kde-framework: https://projects.kde.org/projects/kde/workspace/polkit-kde-agent-1
polkit-kde-framework:
polkit-kde-framework:
polkit-kde-framework:
polkit-kde-framework:
-polkit-kde-framework: See also:
-polkit-kde-framework: https://projects.kde.org/projects/kde/workspace/polkit-kde-agent-1
polkit-kde-framework:
diff --git a/kde/slack-desc/polkit-kde-kcmodules-framework b/kde/slack-desc/polkit-kde-kcmodules-framework
index 91a3207..cf66c65 100644
--- a/kde/slack-desc/polkit-kde-kcmodules-framework
+++ b/kde/slack-desc/polkit-kde-kcmodules-framework
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
polkit-kde-kcmodules-framework: polkit-kde-kcmodules-framework (KDE polkit kcmodules)
polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework: This package contains the kcm_polkit modules for KDE.
@@ -16,3 +16,4 @@ polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework:
+polkit-kde-kcmodules-framework:
diff --git a/kde/slack-desc/powerdevil b/kde/slack-desc/powerdevil
index 23dd81d..87d9937 100644
--- a/kde/slack-desc/powerdevil
+++ b/kde/slack-desc/powerdevil
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
powerdevil: powerdevil (power management tool)
powerdevil:
-powerdevil: PowerDevil is a KDE utility for Laptop Powermanagement.
+powerdevil: PowerDevil is a is a configuration tool for Power Management in
+powerdevil: Plasma. Through this module, you can define your computer's behavior
+powerdevil: in various situations, allowing you to save as much energy as
+powerdevil: possible.
powerdevil:
powerdevil:
powerdevil:
powerdevil:
powerdevil:
-powerdevil:
-powerdevil:
-powerdevil: Homepage: http://kde.org/
diff --git a/kde/slack-desc/poxml b/kde/slack-desc/poxml
index f01885d..222570b 100644
--- a/kde/slack-desc/poxml
+++ b/kde/slack-desc/poxml
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-poxml: poxml (translate DocBook XML files using gettext po files)
+poxml: poxml (translate DocBook XML files)
poxml:
poxml: This is a collection of tools that facilitate translating DocBook XML
-poxml: files using Gettext message files (PO files).
-poxml: Also included are several command-line utilities for manipulating
-poxml: DocBook XML files, PO files and PO template files.
+poxml: files using Gettext message files (PO files). Also included are
+poxml: several command-line utilities for manipulating DocBook XML files, PO
+poxml: files and PO template files.
+poxml:
poxml:
poxml:
poxml:
-poxml: For more information, visit: http://www.kde.org
poxml:
diff --git a/kde/slack-desc/print-manager b/kde/slack-desc/print-manager
index 623c0bc..4e25da1 100644
--- a/kde/slack-desc/print-manager
+++ b/kde/slack-desc/print-manager
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-print-manager: print-manager (tool for managing print jobs and printers)
+print-manager: print-manager (manage print jobs and printers)
print-manager:
-print-manager: Print Manager (formerly printer-applet) is a system tray utility
-print-manager: that shows current print jobs, printer warnings, and errors.
+print-manager: Print Manager is a system tray utility that shows current print jobs,
+print-manager: printer warnings, and errors.
+print-manager:
+print-manager: Homepage: https://projects.kde.org/projects/kde/kdeutils/print-manager
print-manager:
print-manager:
print-manager:
print-manager:
-print-manager: Homepage:
-print-manager: https://projects.kde.org/projects/kde/kdeutils/print-manager
print-manager:
diff --git a/kde/slack-desc/prison b/kde/slack-desc/prison
index aa99009..101b27f 100644
--- a/kde/slack-desc/prison
+++ b/kde/slack-desc/prison
@@ -5,13 +5,13 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
prison: prison (Qt based Barcode API)
prison:
-prison: Prison is a barcode API currently offering a Qt API to produce
-prison: QRCode barcodes and DotMatrix barcodes.
+prison: Prison is a barcode API currently offering a Qt API to produce QRCode
+prison: barcodes and DotMatrix barcodes.
prison:
-prison: git clone git://anongit.kde.org/prison
+prison: Homepage: http://anongit.kde.org/prison
prison:
prison:
prison:
diff --git a/kde/slack-desc/pulseaudio-qt b/kde/slack-desc/pulseaudio-qt
index 499cdae..bc6608b 100644
--- a/kde/slack-desc/pulseaudio-qt
+++ b/kde/slack-desc/pulseaudio-qt
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-pulseaudio-qt: pulseaudio-qt (PulseAudio Qt Bindings)
+pulseaudio-qt: pulseaudio-qt (PulseAudio Qt bindings)
pulseaudio-qt:
-pulseaudio-qt: PulseaudioQt allows programs using the Qt library to control
-pulseaudio-qt: volume and react to changes on systems which use PulseAudio.
+pulseaudio-qt: PulseaudioQt allows programs using the Qt library to control volume
+pulseaudio-qt: and react to changes on systems which use PulseAudio.
pulseaudio-qt:
+pulseaudio-qt: Homepage: https://cgit.kde.org/pulseaudio-qt.git/
pulseaudio-qt:
pulseaudio-qt:
pulseaudio-qt:
pulseaudio-qt:
-pulseaudio-qt: pulseaudio-qt home: https://cgit.kde.org/pulseaudio-qt.git/
pulseaudio-qt:
diff --git a/kde/slack-desc/purpose b/kde/slack-desc/purpose
index 880883a..b2f0d70 100644
--- a/kde/slack-desc/purpose
+++ b/kde/slack-desc/purpose
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-purpose: purpose (offers available actions for a specific purpose)
+purpose: purpose (offers actions for a specific purpose)
+purpose:
+purpose: This framework offers the possibility to create integrate services and
+purpose: actions on any application without having to implement them
+purpose: specifically. Purpose will offer them mechanisms to list the different
+purpose: alternatives to execute given the requested action type and will
+purpose: facilitate components so that all the plugins can receive all the
+purpose: information they need.
+purpose:
purpose:
-purpose: This framework offers the possibility to create integrate services
-purpose: and actions on any application without having to implement them
-purpose: specifically.
-purpose: Purpose will offer them mechanisms to list the different alternatives
-purpose: to execute given the requested action type and will facilitate
-purpose: components so that all the plugins can receive all the information
-purpose: they need.
purpose:
-purpose: Home page: http://www.kde.org/
diff --git a/kde/slack-desc/qqc2-desktop-style b/kde/slack-desc/qqc2-desktop-style
index f128b48..0d27525 100644
--- a/kde/slack-desc/qqc2-desktop-style
+++ b/kde/slack-desc/qqc2-desktop-style
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-qqc2-desktop-style: qqc2-desktop-style (desktop integration for qt quick controls 2)
+qqc2-desktop-style: qqc2-desktop-style (desktop integration for Qt Quick Controls 2)
+qqc2-desktop-style:
+qqc2-desktop-style: QQC2-Desktop-Style is a style for Qt Quick Controls 2 (QQC2) which
+qqc2-desktop-style: uses QStyle to paint the controls in order to give them a native look
+qqc2-desktop-style: and feel.
+qqc2-desktop-style:
+qqc2-desktop-style: Homepage: https://api.kde.org/frameworks/qqc2-desktop-style/html/
qqc2-desktop-style:
-qqc2-desktop-style: This is a style for QtQuick Controls 2 which is using QStyle to paint
-qqc2-desktop-style: controls in order to give them a native look & feel on the desktop.
-qqc2-desktop-style: It will be used when te environment variable
-qqc2-desktop-style: QT_QUICK_CONTROLS_STYLE=org.kde.desktop is exported,
-qqc2-desktop-style: or directly in C++ code.
qqc2-desktop-style:
qqc2-desktop-style:
-qqc2-desktop-style: Home page: https://api.kde.org/frameworks/qqc2-desktop-style/html/
qqc2-desktop-style:
diff --git a/kde/slack-desc/rocs b/kde/slack-desc/rocs
index 8ba31c9..954525d 100644
--- a/kde/slack-desc/rocs
+++ b/kde/slack-desc/rocs
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
rocs: rocs (graph theory IDE)
rocs:
-rocs: Rocs is a Graph Theory IDE for professors and students.
-rocs:
-rocs: For more information, visit: http://edu.kde.org/
-rocs:
-rocs:
-rocs:
+rocs: Rocs is a Graph Theory IDE for everybody interested in designing and
+rocs: analyzing graph algorithms (e.g., lecturers, students, researchers).
+rocs: For all these users, Rocs provides an easy to use visual data
+rocs: structure editor and a powerful scripting engine to execute
+rocs: algorithms. Algorithms are specified in JavaScript.
rocs:
+rocs: Homepage: https://www.kde.org/applications/education/rocs
rocs:
rocs:
diff --git a/kde/slack-desc/sddm-kcm b/kde/slack-desc/sddm-kcm
index 53c6907..deb646c 100644
--- a/kde/slack-desc/sddm-kcm
+++ b/kde/slack-desc/sddm-kcm
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-sddm-kcm: sddm-kcm (configure sddm in kde)
+sddm-kcm: sddm-kcm (configure SDDM in kde)
sddm-kcm:
-sddm-kcm: KCM module for SDDM.
-sddm-kcm: This module allows for configuring SDDM for KDE System Settings.
+sddm-kcm: KCM module for SDDM. This module allows for configuring SDDM in the
+sddm-kcm: KDE System Settings.
sddm-kcm:
+sddm-kcm: Homepage: https://github.com/sddm/sddm-kcm
sddm-kcm:
sddm-kcm:
sddm-kcm:
sddm-kcm:
-sddm-kcm: For more information, visit: https://github.com/sddm/sddm-kcm
sddm-kcm:
diff --git a/kde/slack-desc/sddm-qt5 b/kde/slack-desc/sddm-qt5
index 3de2a15..89e461a 100644
--- a/kde/slack-desc/sddm-qt5
+++ b/kde/slack-desc/sddm-qt5
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
sddm-qt5: sddm-qt5 (QML based X11 display manager)
sddm-qt5:
-sddm-qt5: SDDM is a modern display manager for X11 aiming to be fast, simple
-sddm-qt5: and beatiful. It uses modern technologies like QtQuick, which in turn
+sddm-qt5: SDDM is a modern display manager for X11 aiming to be fast, simple and
+sddm-qt5: beautiful. It uses modern technologies like QtQuick, which in turn
sddm-qt5: gives the designer the ability to create smooth, animated user
-sddm-qt5: interfaces. SDDM is extremely themeable.
-sddm-qt5: There are a few sample themes distributed with SDDM. They can be used
-sddm-qt5: as a starting point for new themes.
+sddm-qt5: interfaces. SDDM is extremely themeable. There are a few sample themes
+sddm-qt5: distributed with SDDM. They can be used as a starting point for new
+sddm-qt5: themes.
sddm-qt5:
-sddm-qt5: See https://github.com/sddm/
+sddm-qt5: Homepage: https://github.com/sddm/
sddm-qt5:
diff --git a/kde/slack-desc/signon-kwallet-extension b/kde/slack-desc/signon-kwallet-extension
index 7956369..a2d071b 100644
--- a/kde/slack-desc/signon-kwallet-extension
+++ b/kde/slack-desc/signon-kwallet-extension
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-signon-kwallet-extension: signon-kwallet-extension (KWallet signon extension)
+signon-kwallet-extension: signon-kwallet-extension (KWallet SignOn extension)
+signon-kwallet-extension:
+signon-kwallet-extension: KWallet integration for the SignOn framework.
signon-kwallet-extension:
-signon-kwallet-extension: KWallet signon extension.
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
-signon-kwallet-extension: For more information, visit: http://www.kde.org/
signon-kwallet-extension:
diff --git a/kde/slack-desc/skanlite b/kde/slack-desc/skanlite
index b4e994d..b3048d7 100644
--- a/kde/slack-desc/skanlite
+++ b/kde/slack-desc/skanlite
@@ -6,9 +6,9 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-skanlite: skanlite (a scanning program)
+skanlite: skanlite (scanning program)
skanlite:
-skanlite: Skanlite is a light-weight scanning application based on libksane.
+skanlite: Skanlite is a lightweight scanning application based on libksane.
skanlite:
skanlite:
skanlite:
diff --git a/kde/slack-desc/solid b/kde/slack-desc/solid
index 7b64d7d..6224dc2 100644
--- a/kde/slack-desc/solid
+++ b/kde/slack-desc/solid
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-solid: solid (solid)
+solid: solid (Desktop hardware abstraction)
solid:
+solid: Solid is a device integration framework. It provides a way of querying
+solid: and interacting with hardware independently of the underlying
+solid: operating system. It provides hardware discovery, power management,
+solid: and network management features.
solid:
+solid: Homepage: https://api.kde.org/frameworks/solid/html/
solid:
solid:
solid:
-solid:
-solid:
-solid:
-solid:
-solid: Homepage: http://kde.org/
diff --git a/kde/slack-desc/sonnet b/kde/slack-desc/sonnet
index 3c7db52..16c9405 100644
--- a/kde/slack-desc/sonnet
+++ b/kde/slack-desc/sonnet
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-sonnet: sonnet (sonnet)
+sonnet: sonnet (Multi-language spell checker)
sonnet:
+sonnet: Sonnet is a plugin-based spell checking library for Qt-based
+sonnet: applications. It supports several different plugins, including HSpell,
+sonnet: Enchant, ASpell and HUNSPELL. It also supports automated language
+sonnet: detection, based on a combination of different algorithms.
sonnet:
sonnet:
sonnet:
sonnet:
sonnet:
-sonnet:
-sonnet:
-sonnet:
-sonnet: Homepage: http://kde.org/
diff --git a/kde/slack-desc/spectacle b/kde/slack-desc/spectacle
index bb7532b..bbc99f0 100644
--- a/kde/slack-desc/spectacle
+++ b/kde/slack-desc/spectacle
@@ -8,9 +8,9 @@
|-----handy-ruler------------------------------------------------------|
spectacle: spectacle (screen capture program)
spectacle:
-spectacle: A screenshot utility for KDE.
+spectacle: Spectacle is screenshot taking utility for the KDE desktop. Spectacle
+spectacle: can also be used in non-KDE X11 desktop environments.
spectacle:
-spectacle: For more information, visit: http://www.kde.org
spectacle:
spectacle:
spectacle:
diff --git a/kde/slack-desc/step b/kde/slack-desc/step
index 6b3c8bf..1ae9f99 100644
--- a/kde/slack-desc/step
+++ b/kde/slack-desc/step
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
step: step (interactive physics simulator)
step:
-step: Step is an interactive physical simulator.
-step: It works like this: you place some bodies on the scene, add some
-step: forces such as gravity or springs, then click "Simulate" and Step
-step: shows you how your scene will evolve according to the laws of physics.
-step: With Step you can not only learn but feel how physics works !
+step: Step is an interactive physical simulator. It works like this: you
+step: place some bodies on the scene, add some forces such as gravity or
+step: springs, then click "Simulate" and Step shows you how your scene will
+step: evolve according to the laws of physics. With Step you can not only
+step: learn but feel how physics works!
+step:
step:
-step: For more information, visit: http://edu.kde.org/
step:
step:
diff --git a/kde/slack-desc/svgpart b/kde/slack-desc/svgpart
index dbee48b..ef95b6c 100644
--- a/kde/slack-desc/svgpart
+++ b/kde/slack-desc/svgpart
@@ -10,7 +10,7 @@ svgpart: svgpart (SVG plugin for KDE)
svgpart:
svgpart: KPart for viewing SVG files in KDE.
svgpart:
-svgpart: For more information, visit: http://www.kde.org
+svgpart:
svgpart:
svgpart:
svgpart:
diff --git a/kde/slack-desc/sweeper b/kde/slack-desc/sweeper
index b0ae9f3..ecf38e2 100644
--- a/kde/slack-desc/sweeper
+++ b/kde/slack-desc/sweeper
@@ -10,7 +10,7 @@ sweeper: sweeper (remove traces of your activities)
sweeper:
sweeper: Sweeper helps to clean unwanted traces the user leaves on the system.
sweeper:
-sweeper: Home page: https://projects.kde.org/projects/kde/kdeutils/sweeper
+sweeper: Homepage: https://projects.kde.org/projects/kde/kdeutils/sweeper
sweeper:
sweeper:
sweeper:
diff --git a/kde/slack-desc/syndication b/kde/slack-desc/syndication
index 2156c72..7360bdf 100644
--- a/kde/slack-desc/syndication
+++ b/kde/slack-desc/syndication
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
syndication: syndication (RSS/Atom parser library)
syndication:
-syndication: syndication contains a RSS/Atom parser library.
+syndication: Syndication is a RSS/Atom parser library supporting RSS (0.9/1.0,
+syndication: 0.91..2.0) and Atom (0.3 and 1.0) feeds. Syndication offers a unified,
+syndication: format-agnostic view on the parsed feed, so that the using application
+syndication: does not need to distinguish between feed formats.
syndication:
syndication:
syndication:
syndication:
syndication:
-syndication:
-syndication: Home page: http://www.kde.org/
-syndication:
diff --git a/kde/slack-desc/syntax-highlighting b/kde/slack-desc/syntax-highlighting
index c821b5f..ff92343 100644
--- a/kde/slack-desc/syntax-highlighting
+++ b/kde/slack-desc/syntax-highlighting
@@ -15,5 +15,5 @@ syntax-highlighting:
syntax-highlighting:
syntax-highlighting:
syntax-highlighting:
-syntax-highlighting: See http://kde.org
+syntax-highlighting:
syntax-highlighting:
diff --git a/kde/slack-desc/systemsettings b/kde/slack-desc/systemsettings
index 4ee9c5d..1d9f89f 100644
--- a/kde/slack-desc/systemsettings
+++ b/kde/slack-desc/systemsettings
@@ -16,4 +16,4 @@ systemsettings:
systemsettings:
systemsettings:
systemsettings:
-systemsettings: Homepage: http://kde.org/
+systemsettings:
diff --git a/kde/slack-desc/threadweaver b/kde/slack-desc/threadweaver
index 0bdd4d8..c9b9bc0 100644
--- a/kde/slack-desc/threadweaver
+++ b/kde/slack-desc/threadweaver
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-threadweaver: threadweaver (threadweaver)
+threadweaver: threadweaver (threaded programming helper)
threadweaver:
+threadweaver: ThreadWeaver is a helper for multithreaded programming. It uses a job-
+threadweaver: based interface to queue tasks and execute them in an efficient way.
+threadweaver: You simply divide the workload into jobs, state the dependencies
+threadweaver: between the jobs and ThreadWeaver will work out the most efficient way
+threadweaver: of dividing the work between threads within a set of resource limits.
threadweaver:
threadweaver:
threadweaver:
threadweaver:
-threadweaver:
-threadweaver:
-threadweaver:
-threadweaver:
-threadweaver: Homepage: http://kde.org/
diff --git a/kde/slack-desc/umbrello b/kde/slack-desc/umbrello
index bf23672..a5fa2e1 100644
--- a/kde/slack-desc/umbrello
+++ b/kde/slack-desc/umbrello
@@ -15,5 +15,5 @@ umbrello:
umbrello:
umbrello:
umbrello:
-umbrello: For more information, visit: http://www.kde.org
+umbrello:
umbrello:
diff --git a/kde/slack-desc/user-manager b/kde/slack-desc/user-manager
index b84f0ad..4c8cf3b 100644
--- a/kde/slack-desc/user-manager
+++ b/kde/slack-desc/user-manager
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
user-manager: user-manager (manage the users of your system)
user-manager:
-user-manager: USer-manager is a system settings module to manage the users
-user-manager: of your system.
+user-manager: User-manager is a system settings module to manage the users of your
+user-manager: system.
+user-manager:
user-manager:
user-manager:
user-manager:
user-manager:
user-manager:
-user-manager: See also: https://cgit.kde.org/user-manager.git
user-manager:
diff --git a/kde/slack-desc/wacomtablet b/kde/slack-desc/wacomtablet
index c54cf87..a383543 100644
--- a/kde/slack-desc/wacomtablet
+++ b/kde/slack-desc/wacomtablet
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
wacomtablet: wacomtablet (kcm for Wacom tablets)
wacomtablet:
-wacomtablet: This module implements a GUI for the Wacom Linux Drivers
-wacomtablet: and extends it with profile support to handle different
-wacomtablet: button / pen layouts per profile.
+wacomtablet: This module implements a GUI for the Wacom Linux Drivers and extends
+wacomtablet: it with profile support to handle different button / pen layouts per
+wacomtablet: profile.
wacomtablet:
+wacomtablet: Homepage: https://github.com/KDE/wacomtablet
wacomtablet:
wacomtablet:
wacomtablet:
-wacomtablet: Home page: https://github.com/KDE/wacomtablet
wacomtablet:
diff --git a/kde/slack-desc/xdg-desktop-portal-kde b/kde/slack-desc/xdg-desktop-portal-kde
index 35b443b..e436c5e 100644
--- a/kde/slack-desc/xdg-desktop-portal-kde
+++ b/kde/slack-desc/xdg-desktop-portal-kde
@@ -15,5 +15,5 @@ xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
-xdg-desktop-portal-kde: Home page: http://www.kde.org/
+xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
diff --git a/kde/slack-desc/yakuake b/kde/slack-desc/yakuake
index ce21172..66cd817 100644
--- a/kde/slack-desc/yakuake
+++ b/kde/slack-desc/yakuake
@@ -9,11 +9,11 @@
yakuake: yakuake (drop-down terminal)
yakuake:
yakuake: Yakuake is a drop-down terminal emulator based on KDE Konsole.
-yakuake: Features:
-yakuake: + Smoothly rolls down from the top of your screen
-yakuake: + Tabbed, skinnable interface
-yakuake: + Configurable dimensions and animation speed
-yakuake: + Sophisticated D-Bus interface
yakuake:
-yakuake: Home page: http://www.kde.org/
+yakuake: Some of the features of Yakuake include:
+yakuake: Smoothly rolls down from the top of your screen
+yakuake: Tabbed, skinnable interface
+yakuake: Configurable dimensions and animation speed
+yakuake: Sophisticated D-Bus interface
+yakuake:
yakuake:
diff --git a/kde/slack-desc/zeroconf-ioslave b/kde/slack-desc/zeroconf-ioslave
index a406d55..b823aea 100644
--- a/kde/slack-desc/zeroconf-ioslave
+++ b/kde/slack-desc/zeroconf-ioslave
@@ -15,5 +15,5 @@ zeroconf-ioslave:
zeroconf-ioslave:
zeroconf-ioslave:
zeroconf-ioslave:
-zeroconf-ioslave: For more information, visit: http://www.kde.org
+zeroconf-ioslave:
zeroconf-ioslave:
diff --git a/kde/src/applications-extra/fetch-krita.sh b/kde/src/applications-extra/fetch-krita.sh
new file mode 100755
index 0000000..0072059
--- /dev/null
+++ b/kde/src/applications-extra/fetch-krita.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Copyright 2019, 2020 Patrick J. Volkerding, Sebeka, Minnesota, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+
+PKGNAM=krita
+
+# Pull a stable branch + patches
+BRANCH=${1:-master}
+
+# Clear download area:
+rm -rf ${PKGNAM}
+
+# Clone repository:
+git clone https://github.com/KDE/${PKGNAM}
+
+# checkout $BRANCH:
+( cd ${PKGNAM}
+ git checkout $BRANCH || exit 1
+)
+
+HEADISAT="$( cd ${PKGNAM} && git log -1 --format=%h )"
+DATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%Y%m%d )"
+LONGDATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%c )"
+# Cleanup. We're not packing up the whole git repo.
+( cd ${PKGNAM} && find . -type d -name ".git*" -exec rm -rf {} \; 2> /dev/null )
+mv ${PKGNAM} ${PKGNAM}-${DATE}_${HEADISAT}
+tar cf ${PKGNAM}-${DATE}_${HEADISAT}.tar ${PKGNAM}-${DATE}_${HEADISAT}
+plzip -9 -f ${PKGNAM}-${DATE}_${HEADISAT}.tar
+rm -rf ${PKGNAM}-${DATE}_${HEADISAT}
+touch -d "$LONGDATE" ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz
+echo
+echo "${PKGNAM} branch $BRANCH with HEAD at $HEADISAT packaged as ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz"
+echo
diff --git a/kde/src/plasma-extra/fetch-wacomtablet.sh b/kde/src/plasma-extra/fetch-wacomtablet.sh
new file mode 100755
index 0000000..f75dbc5
--- /dev/null
+++ b/kde/src/plasma-extra/fetch-wacomtablet.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Copyright 2019, 2020 Patrick J. Volkerding, Sebeka, Minnesota, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+
+PKGNAM=wacomtablet
+
+# Pull a stable branch + patches
+BRANCH=${1:-master}
+
+# Clear download area:
+rm -rf ${PKGNAM}
+
+# Clone repository:
+git clone https://github.com/KDE/${PKGNAM}
+
+# checkout $BRANCH:
+( cd ${PKGNAM}
+ git checkout $BRANCH || exit 1
+)
+
+HEADISAT="$( cd ${PKGNAM} && git log -1 --format=%h )"
+DATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%Y%m%d )"
+LONGDATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%c )"
+# Cleanup. We're not packing up the whole git repo.
+( cd ${PKGNAM} && find . -type d -name ".git*" -exec rm -rf {} \; 2> /dev/null )
+mv ${PKGNAM} ${PKGNAM}-${DATE}_${HEADISAT}
+tar cf ${PKGNAM}-${DATE}_${HEADISAT}.tar ${PKGNAM}-${DATE}_${HEADISAT}
+plzip -9 -f ${PKGNAM}-${DATE}_${HEADISAT}.tar
+rm -rf ${PKGNAM}-${DATE}_${HEADISAT}
+touch -d "$LONGDATE" ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz
+echo
+echo "${PKGNAM} branch $BRANCH with HEAD at $HEADISAT packaged as ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz"
+echo