summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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