[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#984468: Pre-approval for uploading KDE Apps 20.12.3



Package: release.debian.org
Severity: normal
X-Debbugs-Cc: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>

Dear Release Team,

KDE Apps 20.12.3 will be released tomorrow and a preliminary
changelog is available at [1].
I’d like to get a pre-aproval for uploading the packages listed below as
they will not have migrated to testing before the hard freeze.

I’m listing the change log first then the code diffs, excluding
translation updates and version changes in xml metadata files.

Juk has a couple of trivial packaging changes pending and other packages
would be uploaded as is with just the new upstream version.

Feel free to ask for the changes in any other form if it makes the review
easier for you.

[1] https://phabricator.kde.org/P672


Thanks,
--
Aurélien

================
== change log ==
================

==== elisa-player ====
- fix sort by duration to not use string sort

==== gwenview ====
- Switch from QGLWidget to QOpenGLWidget
- Use Quality level when saving JPEG images

==== juk ====
- filerenamer: Prevent creating track name folders

==== kdeconnect-kde ====
- Don't escape notification title text

==== konsole ====
- Delete client builder before d-pointer of KXMLGUIClient is killed

=== kpmcore ===
- Fix out of bounds read when parsing fstab.
- Add initial support for dosfstools 4.2.

==== krdc ====
- Fix low quality connections
- VNC: accept the wheel event
- Unpress modifiers on focusOutEvent in VncView

==== marble ====
- Fix GeoNames web service URL, is now api.geonames.org (#432598)
- Provide BUILD_TOUCH option to force install of touch variant

==== okular ====
- presentation: Show better the status of the "playing" button
- pdf: Fix InPlace text annotations being loaded as linked

==== palapeli ====
- Make the cache work

==== kde-spectacle ====
- Fix compression quality range


===========
== diffs ==
===========

==== elisa-player ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 10078c21..17f34229 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@ cmake_minimum_required(VERSION 3.8)
 # KDE Applications version, managed by release script.
 set(RELEASE_SERVICE_VERSION_MAJOR "20")
 set(RELEASE_SERVICE_VERSION_MINOR "12")
-set(RELEASE_SERVICE_VERSION_MICRO "2")
+set(RELEASE_SERVICE_VERSION_MICRO "3")
 set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 project(elisa
diff --git a/src/models/datamodel.cpp b/src/models/datamodel.cpp
index 69d71397..7559c0e5 100644
--- a/src/models/datamodel.cpp
+++ b/src/models/datamodel.cpp
@@ -87,7 +87,7 @@ QHash<int, QByteArray> DataModel::roleNames() const
 
     roles[static_cast<int>(DataTypes::ColumnsRoles::AlbumRole)] = "album";
     roles[static_cast<int>(DataTypes::ColumnsRoles::AlbumArtistRole)] = "albumArtist";
-    roles[static_cast<int>(DataTypes::ColumnsRoles::DurationRole)] = "duration";
+    roles[static_cast<int>(DataTypes::ColumnsRoles::StringDurationRole)] = "duration";
     roles[static_cast<int>(DataTypes::ColumnsRoles::TrackNumberRole)] = "trackNumber";
     roles[static_cast<int>(DataTypes::ColumnsRoles::DiscNumberRole)] = "discNumber";
     roles[static_cast<int>(DataTypes::ColumnsRoles::RatingRole)] = "rating";
@@ -156,7 +156,7 @@ QVariant DataModel::data(const QModelIndex &index, int role) const
             break;
         }
         break;
-    case DataTypes::ColumnsRoles::DurationRole:
+    case DataTypes::ColumnsRoles::StringDurationRole:
     {
         switch (d->mModelType)
         {

==== gwenview ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 25adb69b..c34f4108 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,7 @@ cmake_minimum_required (VERSION 3.0 FATAL_ERROR)
 # KDE Application Version, managed by release script
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "1")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 project(gwenview VERSION ${RELEASE_SERVICE_VERSION})
@@ -51,7 +51,7 @@ else()
     set(GWENVIEW_SEMANTICINFO_BACKEND_BALOO ON)
 endif()
 
-find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core Widgets Concurrent Svg OpenGL PrintSupport)
+find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core Widgets Concurrent Svg PrintSupport)
 find_package(Qt5DBus ${QT_MIN_VERSION} CONFIG QUIET)
 set(HAVE_QTDBUS ${Qt5DBus_FOUND})
 
diff --git a/app/gvcore.cpp b/app/gvcore.cpp
index 9f400059..4008e19c 100644
--- a/app/gvcore.cpp
+++ b/app/gvcore.cpp
@@ -425,8 +425,10 @@ void GvCore::saveAs(const QUrl &url)
     } else {
         // Regardless of job result, reset JPEG config value if it was changed by
         // the Save As dialog
-        if (GwenviewConfig::jPEGQuality() != d->configFileJPEGQualityValue)
-            GwenviewConfig::setJPEGQuality(d->configFileJPEGQualityValue);
+        connect(job, &KJob::result, [=]() {
+            if (GwenviewConfig::jPEGQuality() != d->configFileJPEGQualityValue)
+                GwenviewConfig::setJPEGQuality(d->configFileJPEGQualityValue);
+        });
         connect(job, SIGNAL(result(KJob*)), SLOT(slotSaveResult(KJob*)));
     }
 }
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 36f28a46..05e34388 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -262,7 +262,6 @@ endif()
 target_link_libraries(gwenviewlib
    Qt5::Concurrent
    Qt5::Svg
-   Qt5::OpenGL
    Qt5::PrintSupport
    KF5::KIOCore
    KF5::KIOWidgets
diff --git a/lib/documentview/documentviewcontainer.cpp b/lib/documentview/documentviewcontainer.cpp
index 44895485..9a87c4d1 100644
--- a/lib/documentview/documentviewcontainer.cpp
+++ b/lib/documentview/documentviewcontainer.cpp
@@ -29,7 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
 // KDE
 
 // Qt
-#include <QGLWidget>
+#include <QOpenGLWidget>
 #include <QGraphicsScene>
 #include <QPropertyAnimation>
 #include <QTimer>
@@ -87,13 +87,8 @@ DocumentViewContainer::DocumentViewContainer(QWidget* parent)
     d->q = this;
     d->mScene = new QGraphicsScene(this);
     if (GwenviewConfig::animationMethod() == DocumentView::GLAnimation) {
-        QGLWidget* glWidget = new QGLWidget;
-        if (glWidget->isValid()) {
-            setViewport(glWidget);
-        } else {
-            qCWarning(GWENVIEW_LIB_LOG) << "Failed to initialize OpenGL support!";
-            delete glWidget;
-        }
+        QOpenGLWidget* glWidget = new QOpenGLWidget;
+        setViewport(glWidget);
     }
     setScene(d->mScene);
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@@ -304,10 +299,10 @@ void DocumentViewContainer::slotFadeInFinished(DocumentView* view)
 
 void DocumentViewContainer::slotConfigChanged()
 {
-    bool currentlyGL = qobject_cast<QGLWidget*>(viewport());
+    bool currentlyGL = qobject_cast<QOpenGLWidget*>(viewport());
     bool wantGL = GwenviewConfig::animationMethod() == DocumentView::GLAnimation;
     if (currentlyGL != wantGL) {
-        setViewport(wantGL ? new QGLWidget() : new QWidget());
+        setViewport(wantGL ? new QOpenGLWidget() : new QWidget());
     }
 }
 
diff --git a/lib/documentview/rasterimageview.cpp b/lib/documentview/rasterimageview.cpp
index 18832aaf..4a64f427 100644
--- a/lib/documentview/rasterimageview.cpp
+++ b/lib/documentview/rasterimageview.cpp
@@ -163,7 +163,7 @@ struct RasterImageViewPrivate
         mAlternateBuffer = QPixmap();
     }
 
-    void drawAlphaBackground(QPainter* painter, const QRect& viewportRect, const QPoint& zoomedImageTopLeft, const QPixmap &texture)
+    void drawAlphaBackground(QPainter* painter, const QRectF& viewportRect, const QPoint& zoomedImageTopLeft, const QPixmap &texture)
     {
         switch (mAlphaBackgroundMode) {
             case AbstractImageView::AlphaBackgroundNone:
@@ -353,11 +353,11 @@ void RasterImageView::updateFromScaler(int zoomedImageLeft, int zoomedImageTop,
         QPainter painter(&d->mCurrentBuffer);
         painter.setCompositionMode(QPainter::CompositionMode_Source);
         if (document()->hasAlphaChannel()) {
-            d->drawAlphaBackground(
-                &painter, QRect(viewportLeft, viewportTop, image.width(), image.height()),
-                QPoint(zoomedImageLeft, zoomedImageTop),
-                alphaBackgroundTexture()
-            );
+            const QRectF viewportRect(QPointF(viewportLeft, viewportTop),
+                                      QSizeF(image.size()) / devicePixelRatio());
+            d->drawAlphaBackground(&painter, viewportRect,
+                                   QPoint(zoomedImageLeft, zoomedImageTop),
+                                   alphaBackgroundTexture());
             // This is required so transparent pixels don't replace our background
             painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
         }
diff --git a/lib/jpegcontent.cpp b/lib/jpegcontent.cpp
index 6ced0e31..89b3761e 100644
--- a/lib/jpegcontent.cpp
+++ b/lib/jpegcontent.cpp
@@ -687,8 +687,14 @@ bool JpegContent::save(QIODevice* device)
     d->mRawData.resize(io.size());
     io.read((unsigned char*)d->mRawData.data(), io.size());
 
-    QDataStream stream(device);
-    stream.writeRawData(d->mRawData.data(), d->mRawData.size());
+    QImage _image;
+    _image.loadFromData(d->mRawData);
+    QImageWriter writer(device, "jpeg");
+    writer.setQuality(GwenviewConfig::jPEGQuality());
+    if (!writer.write(_image)) {
+        d->mErrorString = writer.errorString();
+        return false;
+    }
 
     // Make sure we are up to date
     loadFromData(d->mRawData);


==== juk ====
diff --git a/debian/changelog b/debian/changelog
index 6de86d8..c2b1a17 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+juk (4:20.12.0-2) UNRELEASED; urgency=medium
+
+  * Refresh copyright information.
+  * Refresh upstream metadata.
+  * Update project homepage.
+  * Removed Maximiliano Curia from the uploaders, thanks for your work
+    on the package!
+
+ -- Aurélien COUDERC <coucouf@debian.org>  Sat, 02 Jan 2021 15:10:32 +0100
+
 juk (4:20.12.0-1) unstable; urgency=medium
 
   * New upstream release (20.12.0).
diff --git a/debian/control b/debian/control
index aae8c78..5837d21 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,6 @@ Priority: optional
 Maintainer: Debian/Kubuntu Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
 Uploaders: Pino Toscano <pino@debian.org>,
            Sune Vuorela <sune@debian.org>,
-           Maximiliano Curia <maxy@debian.org>
 Build-Depends: cmake,
                debhelper-compat (= 13),
                extra-cmake-modules (>= 5.35.0~),
@@ -35,7 +34,7 @@ Build-Depends: cmake,
                pkg-kde-tools (>= 0.15.16),
                qtbase5-dev (>= 5.10.0~),
 Standards-Version: 4.5.1
-Homepage: https://apps.kde.org/en/juk
+Homepage: https://juk.kde.org/
 Vcs-Browser: https://salsa.debian.org/qt-kde-team/kde/juk
 Vcs-Git: https://salsa.debian.org/qt-kde-team/kde/juk.git
 Rules-Requires-Root: no
diff --git a/debian/copyright b/debian/copyright
index 162444a..ce00a87 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,7 +1,7 @@
 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Upstream-Name: JuK
 Upstream-Contact: kde-multimedia@kde.org
-Source: https://download.kde.org/
+Source: https://invent.kde.org/multimedia/juk
 
 Files: *
 Copyright: 2002, Daniel Molkentin <molkentin@kde.org>
diff --git a/debian/upstream/metadata b/debian/upstream/metadata
index 8eb85e9..e1a5ba4 100644
--- a/debian/upstream/metadata
+++ b/debian/upstream/metadata
@@ -1,6 +1,6 @@
 Bug-Database: https://bugs.kde.org/buglist.cgi?product=juk&resolution=---
 Bug-Submit: https://bugs.kde.org/enter_bug.cgi?format=guided&product=juk
-Changelog: https://invent.kde.org/multimedia/juk/-/commits/
+Changelog: https://kde.org/announcements/
 Donation: https://www.kde.org/community/donations/
 Repository: https://invent.kde.org/multimedia/juk.git
 Repository-Browse: https://invent.kde.org/multimedia/juk
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2de94b6c..12bb7ad5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
 # https://community.kde.org/Guidelines_and_HOWTOs/Application_Versioning
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "0")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 project(juk VERSION ${RELEASE_SERVICE_VERSION})
diff --git a/filerenamer.cpp b/filerenamer.cpp
index a13c3c98..4cebc0f0 100644
--- a/filerenamer.cpp
+++ b/filerenamer.cpp
@@ -916,7 +916,7 @@ bool FileRenamer::moveFile(const QString &src, const QString &dest)
     if(!srcURL.isValid() || !dstURL.isValid() || srcURL == dstURL)
         return false;
 
-    QUrl dir = dstURL.resolved(QUrl::fromUserInput(".")); // resolves to path w/out filename
+    QUrl dir = dstURL.adjusted(QUrl::RemoveFilename); // resolves to path w/out filename
     if(!QDir().mkpath(dir.path())) {
         qCCritical(JUK_LOG) << "Unable to create directory " << dir.path();
         return false;

==== kdeconnect-kde ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 26f93c87..a3d69dfc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.0)
 # KDE Release Service Version, managed by release script
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "2")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 project(kdeconnect VERSION ${RELEASE_SERVICE_VERSION})
diff --git a/plugins/notifications/notification.cpp b/plugins/notifications/notification.cpp
index e5206b9e..0baf0001 100644
--- a/plugins/notifications/notification.cpp
+++ b/plugins/notifications/notification.cpp
@@ -88,15 +88,16 @@ void Notification::createKNotification(const NetworkPacket& np)
     }
 
     QString escapedTitle = m_title.toHtmlEscaped();
+    // notification title text does not have markup, but in some cases below it is used in body text so we escape it
     QString escapedText = m_text.toHtmlEscaped();
     QString escapedTicker = m_ticker.toHtmlEscaped();
 
     if (NotificationServerInfo::instance().supportedHints().testFlag(NotificationServerInfo::X_KDE_DISPLAY_APPNAME)) {
-        m_notification->setTitle(escapedTitle);
+        m_notification->setTitle(m_title);
         m_notification->setText(escapedText);
         m_notification->setHint(QStringLiteral("x-kde-display-appname"), m_appName.toHtmlEscaped());
     } else {
-        m_notification->setTitle(m_appName.toHtmlEscaped());
+        m_notification->setTitle(m_appName);
 
         if (m_title.isEmpty() && m_text.isEmpty()) {
             m_notification->setText(escapedTicker);

==== konsole ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4e4969f8..52bb91e5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
 # KDE Application Version, managed by release script
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "2")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 # minimal requirements
diff --git a/src/session/SessionController.cpp b/src/session/SessionController.cpp
index bb4ba395..28c176c1 100644
--- a/src/session/SessionController.cpp
+++ b/src/session/SessionController.cpp
@@ -1766,10 +1766,9 @@ void SessionController::showDisplayContextMenu(const QPoint& position)
     // application did not merge our GUI.
     if (factory() == nullptr) {
         if (clientBuilder() == nullptr) {
-            setClientBuilder(new KXMLGUIBuilder(_sessionDisplayConnection->view()));
-
-            // Client builder does not get deleted automatically
-            connect(this, &QObject::destroyed, this, [this]{ delete clientBuilder(); });
+            // Client builder does not get deleted automatically, we handle this
+            _clientBuilder.reset(new KXMLGUIBuilder(_sessionDisplayConnection->view()));
+            setClientBuilder(_clientBuilder.get());
         }
 
         auto factory = new KXMLGUIFactory(clientBuilder(), _sessionDisplayConnection->view());
diff --git a/src/session/SessionController.h b/src/session/SessionController.h
index 2ef32fb2..239cc6f2 100644
--- a/src/session/SessionController.h
+++ b/src/session/SessionController.h
@@ -30,6 +30,8 @@
 // KDE
 #include <KXMLGUIClient>
 
+#include <memory>
+
 // Konsole
 #include "SessionDisplayConnection.h"
 #include "ViewProperties.h"
@@ -368,6 +370,7 @@ private:
     bool _monitorProcessFinish;
     EscapeSequenceUrlFilter *_escapedUrlFilter;
 
+    std::unique_ptr<KXMLGUIBuilder> _clientBuilder;
 };
 
 }

=== kpmcore ===
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cbec8a6..2286ef2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
 # KDE Application Version, managed by release script
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "2")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 project(kpmcore VERSION ${RELEASE_SERVICE_VERSION})
 
diff --git a/src/core/fstab.cpp b/src/core/fstab.cpp
index 8f1f36e..d6ff5c3 100644
--- a/src/core/fstab.cpp
+++ b/src/core/fstab.cpp
@@ -91,7 +91,8 @@ FstabEntryList readFstabEntries( const QString& fstabPath )
             auto fsSpec = splitLine.at(0);
             auto mountPoint = unescapeSpaces(splitLine.at(1));
             auto fsType = splitLine.at(2);
-            auto options = splitLine.at(3);
+            // Options may be omitted in some rare cases like NixOS generated fstab.
+            auto options = splitLine.length() >= 4 ? splitLine.at(3) : QString::fromLatin1("defaults");
 
             switch (splitLine.length()) {
                 case 4:
diff --git a/src/fs/fat12.cpp b/src/fs/fat12.cpp
index 32a7e92..60b7dc4 100644
--- a/src/fs/fat12.cpp
+++ b/src/fs/fat12.cpp
@@ -140,7 +140,9 @@ bool fat12::writeLabel(Report& report, const QString& deviceNode, const QString&
 {
     report.line() << xi18nc("@info:progress", "Setting label for partition <filename>%1</filename> to %2", deviceNode, newLabel.toUpper());
 
-    ExternalCommand cmd(report, QStringLiteral("fatlabel"), { deviceNode, newLabel.toUpper() });
+    // This is needed to support new dosfstool 4.2. Later we can drop dosfstools 4.1 and add -r flag.
+    const QString label = newLabel.isEmpty() ? QStringLiteral("NO_LABEL") : newLabel;
+    ExternalCommand cmd(report, QStringLiteral("fatlabel"), { deviceNode, label.toUpper() });
     return cmd.run(-1) && cmd.exitCode() == 0;
 }
 
==== krdc ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 57fdee0..e286a33 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
 
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "0")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
diff --git a/vnc/vncclientthread.cpp b/vnc/vncclientthread.cpp
index ba5f96d..802f81d 100644
--- a/vnc/vncclientthread.cpp
+++ b/vnc/vncclientthread.cpp
@@ -208,7 +208,8 @@ rfbBool VncClientThread::newclient()
     case RemoteView::Low:
     case RemoteView::Unknown:
     default:
-        cl->appData.encodingsString = "copyrect tight zrle ultra zlib hextile corre rre raw";
+        // bpp8 and tight encoding is not supported in libvnc
+        cl->appData.encodingsString = "copyrect zrle ultra zlib hextile corre rre raw";
         cl->appData.compressLevel = 9;
         cl->appData.qualityLevel = 1;
     }
diff --git a/vnc/vncview.cpp b/vnc/vncview.cpp
index 7779889..d767183 100644
--- a/vnc/vncview.cpp
+++ b/vnc/vncview.cpp
@@ -654,6 +654,8 @@ void VncView::wheelEventHandler(QWheelEvent *event)
 
     vncThread.mouseEvent(x, y, eb | m_buttonMask);
     vncThread.mouseEvent(x, y, m_buttonMask);
+
+    event->accept();
 }
 
 #ifdef LIBSSH_FOUND
@@ -686,7 +688,8 @@ void VncView::keyEventHandler(QKeyEvent *e)
     const bool pressed = (e->type() == QEvent::KeyPress);
 
     // handle modifiers
-    if (k == XK_Shift_L || k == XK_Control_L || k == XK_Meta_L || k == XK_Alt_L) {
+    if (k == XK_Shift_L || k == XK_Control_L || k == XK_Meta_L || k == XK_Alt_L || XK_Super_L || XK_Hyper_L ||
+        k == XK_Shift_R || k == XK_Control_R || k == XK_Meta_R || k == XK_Alt_R || XK_Super_R || XK_Hyper_R) {
         if (pressed) {
             m_mods[k] = true;
         } else if (m_mods.contains(k)) {
@@ -706,6 +709,7 @@ void VncView::unpressModifiers()
     const QList<unsigned int> keys = m_mods.keys();
     QList<unsigned int>::const_iterator it = keys.constBegin();
     while (it != keys.end()) {
+        qCDebug(KRDC) << "VncView::unpressModifiers key=" << (*it);
         vncThread.keyEvent(*it, false);
         it++;
     }
@@ -725,4 +729,12 @@ void VncView::clipboardDataChanged()
     vncThread.clientCut(text);
 }
 
+void VncView::focusOutEvent(QFocusEvent *event)
+{
+    qCDebug(KRDC) << "VncView::focusOutEvent";
+    unpressModifiers();
+
+    RemoteView::focusOutEvent(event);
+}
+
 #include "moc_vncview.cpp"
diff --git a/vnc/vncview.h b/vnc/vncview.h
index d0106f3..897b141 100644
--- a/vnc/vncview.h
+++ b/vnc/vncview.h
@@ -81,6 +81,7 @@ protected:
     bool event(QEvent *event) override;
     void resizeEvent(QResizeEvent *event) override;
     bool eventFilter(QObject *obj, QEvent *event) override;
+    void focusOutEvent(QFocusEvent *event) override;
 
 private:
     VncClientThread vncThread;

==== marble ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 550882eb3..0a2227bd0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -77,6 +77,10 @@ include( MarbleMacros )
 # if this option is set, srtm.jpg will not be installed but the generated tiles instead
 option(MOBILE "Create a Marble version optimized for handheld devices")
 
+####################################################
+# Provide opt-in switch for mobile variant, which is not only useful for Android.
+option(BUILD_TOUCH "Build touch-friendly Marble version (on Android this option is bypassed)" OFF)
+
 ####################################################
 # Build a D-Bus interface for the Marble widget
 # This is disabled by default for all win32, apple and Android
diff --git a/src/apps/marble-maps/CMakeLists.txt b/src/apps/marble-maps/CMakeLists.txt
index 3ecb48b4d..6ba8b8915 100644
--- a/src/apps/marble-maps/CMakeLists.txt
+++ b/src/apps/marble-maps/CMakeLists.txt
@@ -39,6 +39,10 @@ target_link_libraries (
     marble-maps
     marbledeclarative
 )
-
-FILE(GLOB QML_FILES *.qml)
-add_custom_target(marble-maps_resources ALL SOURCES ${QML_FILES} package/AndroidManifest.xml)
+if(ANDROID)
+    FILE(GLOB QML_FILES *.qml)
+    add_custom_target(marble-maps_resources ALL SOURCES ${QML_FILES} package/AndroidManifest.xml)
+elseif(BUILD_TOUCH)
+    install(TARGETS marble-maps RUNTIME DESTINATION bin)
+    install(PROGRAMS org.kde.marble.maps.desktop DESTINATION ${KDE_INSTALL_APPDIR})
+endif()
diff --git a/src/plugins/render/earthquake/EarthquakeModel.cpp b/src/plugins/render/earthquake/EarthquakeModel.cpp
index 92afb9e2b..66bdb42cd 100644
--- a/src/plugins/render/earthquake/EarthquakeModel.cpp
+++ b/src/plugins/render/earthquake/EarthquakeModel.cpp
@@ -60,7 +60,7 @@ void EarthquakeModel::getAdditionalItems( const GeoDataLatLonAltBox& box, qint32
         return;
     }
 
-    const QString geonamesUrl( QLatin1String("http://ws.geonames.org/earthquakesJSON";) +
+    const QString geonamesUrl( QLatin1String("http://api.geonames.org/earthquakesJSON";) +
         QLatin1String("?north=")   + QString::number(box.north() * RAD2DEG) +
         QLatin1String("&south=")   + QString::number(box.south() * RAD2DEG) +
         QLatin1String("&east=")    + QString::number(box.east() * RAD2DEG) +
diff --git a/src/plugins/render/postalcode/PostalCodeModel.cpp b/src/plugins/render/postalcode/PostalCodeModel.cpp
index cf15a7ea7..47c15c1a4 100644
--- a/src/plugins/render/postalcode/PostalCodeModel.cpp
+++ b/src/plugins/render/postalcode/PostalCodeModel.cpp
@@ -52,7 +52,7 @@ void PostalCodeModel::getAdditionalItems( const GeoDataLatLonAltBox& box,
     double const lon = box.center().longitude( GeoDataCoordinates::Degree );
     double const radius = qMin<double>( 30.0, box.height() * marbleModel()->planet()->radius() * METER2KM );
 
-    QUrl geonamesUrl( "http://ws.geonames.org/findNearbyPostalCodesJSON"; );
+    QUrl geonamesUrl( "http://api.geonames.org/findNearbyPostalCodesJSON"; );
     QUrlQuery urlQuery;
     urlQuery.addQueryItem( "lat", QString::number( lat ) );
     urlQuery.addQueryItem( "lng", QString::number( lon ) );
diff --git a/src/plugins/render/weather/GeoNamesWeatherService.cpp b/src/plugins/render/weather/GeoNamesWeatherService.cpp
index d691dd262..7fc3a91df 100644
--- a/src/plugins/render/weather/GeoNamesWeatherService.cpp
+++ b/src/plugins/render/weather/GeoNamesWeatherService.cpp
@@ -47,7 +47,7 @@ void GeoNamesWeatherService::getAdditionalItems( const GeoDataLatLonAltBox& box,
         return;
     }
 
-    QUrl geonamesUrl( "http://ws.geonames.org/weatherJSON"; );
+    QUrl geonamesUrl( "http://api.geonames.org/weatherJSON"; );
     QUrlQuery urlQuery;
     urlQuery.addQueryItem( "north", QString::number( box.north( GeoDataCoordinates::Degree ) ) );
     urlQuery.addQueryItem( "south", QString::number( box.south( GeoDataCoordinates::Degree ) ) );
@@ -67,7 +67,7 @@ void GeoNamesWeatherService::getItem( const QString &id )
     }
 
     if ( id.startsWith(QLatin1String("geonames_") ) ) {
-        QUrl geonamesUrl( "http://ws.geonames.org/weatherIcaoJSON"; );
+        QUrl geonamesUrl( "http://api.geonames.org/weatherIcaoJSON"; );
         QUrlQuery urlQuery;
         urlQuery.addQueryItem( "ICAO", id.mid( 9 ) );
         urlQuery.addQueryItem( "username", "marble" );
diff --git a/src/plugins/render/wikipedia/WikipediaModel.cpp b/src/plugins/render/wikipedia/WikipediaModel.cpp
index ad03c2f6a..c6813a913 100644
--- a/src/plugins/render/wikipedia/WikipediaModel.cpp
+++ b/src/plugins/render/wikipedia/WikipediaModel.cpp
@@ -59,7 +59,7 @@ void WikipediaModel::getAdditionalItems( const GeoDataLatLonAltBox& box,
         return;
     }
         
-    QUrl geonamesUrl( "http://ws.geonames.org/wikipediaBoundingBox"; );
+    QUrl geonamesUrl( "http://api.geonames.org/wikipediaBoundingBox"; );
     QUrlQuery urlQuery;
     urlQuery.addQueryItem( "north", QString::number( box.north( GeoDataCoordinates::Degree ) ) );
     urlQuery.addQueryItem( "south", QString::number( box.south( GeoDataCoordinates::Degree ) ) );

==== okular ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7cdff0c94..7ff37a1c7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.16)
 # KDE Application Version, managed by release script
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "2")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 project(okular VERSION ${RELEASE_SERVICE_VERSION})
diff --git a/part/presentationwidget.cpp b/part/presentationwidget.cpp
index 2ad2414b6..e225e4715 100644
--- a/part/presentationwidget.cpp
+++ b/part/presentationwidget.cpp
@@ -199,7 +199,6 @@ PresentationWidget::PresentationWidget(QWidget *parent, Okular::Document *doc, D
     playPauseAct->setEnabled(true);
     connect(playPauseAct, &QAction::triggered, this, &PresentationWidget::slotTogglePlayPause);
     m_topBar->addAction(playPauseAct);
-    setPlayPauseIcon();
     addAction(playPauseAct);
     m_topBar->addSeparator();
 
@@ -257,6 +256,7 @@ PresentationWidget::PresentationWidget(QWidget *parent, Okular::Document *doc, D
     m_nextPageTimer = new QTimer(this);
     m_nextPageTimer->setSingleShot(true);
     connect(m_nextPageTimer, &QTimer::timeout, this, &PresentationWidget::slotNextPage);
+    setPlayPauseIcon();
 
     connect(m_document, &Okular::Document::processMovieAction, this, &PresentationWidget::slotProcessMovieAction);
     connect(m_document, &Okular::Document::processRenditionAction, this, &PresentationWidget::slotProcessRenditionAction);
@@ -500,7 +500,7 @@ void PresentationWidget::setupActions()
 void PresentationWidget::setPlayPauseIcon()
 {
     QAction *playPauseAction = m_ac->action(QStringLiteral("presentation_play_pause"));
-    if (m_advanceSlides) {
+    if (m_nextPageTimer->isActive()) {
         playPauseAction->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-pause")));
         playPauseAction->setToolTip(i18nc("For Presentation", "Pause"));
     } else {
@@ -1339,6 +1339,7 @@ void PresentationWidget::startAutoChangeTimer()
 
         m_nextPageTimer->start((int)(secs * 1000));
     }
+    setPlayPauseIcon();
 }
 
 QScreen *PresentationWidget::defaultScreen() const
@@ -2229,12 +2230,13 @@ void PresentationWidget::slotProcessRenditionAction(const Okular::RenditionActio
 
 void PresentationWidget::slotTogglePlayPause()
 {
-    m_advanceSlides = !m_advanceSlides;
-    setPlayPauseIcon();
-    if (m_advanceSlides) {
+    if (!m_nextPageTimer->isActive()) {
+        m_advanceSlides = true;
         startAutoChangeTimer();
     } else {
         m_nextPageTimer->stop();
+        m_advanceSlides = false;
+        setPlayPauseIcon();
     }
 }
 
==== palapeli ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b0b961c..c6d49b0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 3.5 FATAL_ERROR)
 
 set (RELEASE_SERVICE_VERSION_MAJOR "20")
 set (RELEASE_SERVICE_VERSION_MINOR "12")
-set (RELEASE_SERVICE_VERSION_MICRO "1")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 set (RELEASE_SERVICE_COMPACT_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}${RELEASE_SERVICE_VERSION_MINOR}${RELEASE_SERVICE_VERSION_MICRO}")
 
diff --git a/src/file-io/components-collectionstorage.cpp b/src/file-io/components-collectionstorage.cpp
index 2915d2d..89bab4c 100644
--- a/src/file-io/components-collectionstorage.cpp
+++ b/src/file-io/components-collectionstorage.cpp
@@ -47,7 +47,7 @@ Palapeli::PuzzleComponent* Palapeli::CollectionStorageComponent::cast(Type type)
 	//try to serve metadata from cache
 	const QDateTime mtime = QFileInfo(file).lastModified();
 	m_groupMutex->lock();
-	if (m_group->readEntry("ModifyDateTime", QDateTime()) == mtime)
+	if (m_group->readEntry("ModifyDateTime", QString()) == mtime.toString())
 	{
 		//cache is up-to-date
 		Palapeli::PuzzleMetadata metadata;
@@ -56,7 +56,8 @@ Palapeli::PuzzleComponent* Palapeli::CollectionStorageComponent::cast(Type type)
 		metadata.author = m_group->readEntry("Author", QString());
 		metadata.pieceCount = m_group->readEntry("PieceCount", 0);
 		metadata.modifyProtection = m_group->readEntry("ModifyProtection", false);
-		metadata.thumbnail.loadFromData(m_group->readEntry("Thumbnail", QByteArray()));
+		QByteArray ar = m_group->readEntry("Thumbnail", QByteArray());
+		metadata.thumbnail.loadFromData(QByteArray::fromBase64 (ar));
 		m_groupMutex->unlock();
 		return new Palapeli::MetadataComponent(metadata);
 	}
@@ -81,8 +82,8 @@ Palapeli::PuzzleComponent* Palapeli::CollectionStorageComponent::cast(Type type)
 		m_group->writeEntry("Author", metadata.author);
 		m_group->writeEntry("PieceCount", metadata.pieceCount);
 		m_group->writeEntry("ModifyProtection", metadata.modifyProtection);
-		m_group->writeEntry("ModifyDateTime", mtime);
-		m_group->writeEntry("Thumbnail", buffer.data());
+		m_group->writeEntry("ModifyDateTime", mtime.toString());
+		m_group->writeEntry("Thumbnail", buffer.data().toBase64 ());
 		m_group->sync();
 		m_groupMutex->unlock();
 		return cMetadata;

==== kde-spectacle ====
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 50995e0..2cc6d12 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@
 # KDE Application Version, managed by release script
 set(RELEASE_SERVICE_VERSION_MAJOR "20")
 set(RELEASE_SERVICE_VERSION_MINOR "12")
-set(RELEASE_SERVICE_VERSION_MICRO "2")
+set(RELEASE_SERVICE_VERSION_MICRO "3")
 set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 set(SPECTACLE_VERSION ${RELEASE_SERVICE_VERSION})
 # minimum requirements
diff --git a/src/Gui/SettingsDialog/SaveOptions.ui b/src/Gui/SettingsDialog/SaveOptions.ui
index dfe4dd5..b4fb34f 100644
--- a/src/Gui/SettingsDialog/SaveOptions.ui
+++ b/src/Gui/SettingsDialog/SaveOptions.ui
@@ -63,6 +63,9 @@
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
+         <property name="maximum">
+          <number>100</number>
+         </property>
         </widget>
        </item>
        <debian/4%20.12.0-1item>

Reply to: