dvratil pushed to kscreen (f22). "Upstream patch for RHBZ#1211881"
notifications at fedoraproject.org
notifications at fedoraproject.org
Wed Apr 15 21:02:24 UTC 2015
>From 4c6e35b90658ed8bef2d35884d11c70d15bc9dcd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dan=20Vr=C3=A1til?= <dvratil at redhat.com>
Date: Wed, 15 Apr 2015 23:01:53 +0200
Subject: Upstream patch for RHBZ#1211881
diff --git a/kscreen-5.3-rhbz1211881.patch b/kscreen-5.3-rhbz1211881.patch
new file mode 100644
index 0000000..060af62
--- /dev/null
+++ b/kscreen-5.3-rhbz1211881.patch
@@ -0,0 +1,549 @@
+commit 716a12529ec92a2ed03fcf00940a8ce890d1b6e8
+Author: Dan Vrátil <dvratil at redhat.com>
+Date: Wed Apr 15 22:38:16 2015 +0200
+
+ Serializer: calculate screen size needed for the loaded config
+
+ When the configuration we apply from Serializer needs bigger XRandR Screen then
+ the currently set, we need to update the screen size as well. This can happen for
+ example when one of the screens in the loaded config is rotated by 90 degrees,
+ which means that it requires higher XRandR screen then currently available.
+ Without this the content of the output would be weirdly cropped.
+
+ BUG: 346239
+ FIXED-IN: 5.3.0
+
+ Conflicts:
+ kded/serializer.cpp
+ kded/serializer.h
+ tests/kded/CMakeLists.txt
+
+diff --git a/kded/serializer.cpp b/kded/serializer.cpp
+index 325c90a..5d96891 100644
+--- a/kded/serializer.cpp
++++ b/kded/serializer.cpp
+@@ -27,6 +27,8 @@
+ #include <QtCore/QVariantList>
+ #include <QtCore/QVariantMap>
+ #include <QtCore/QStandardPaths>
++#include <QtCore/QRect>
++#include <QtCore/QStringBuilder>
+ #include <QJsonDocument>
+ #include <QDir>
+ #include <QLoggingCategory>
+@@ -35,6 +37,16 @@
+ #include <kscreen/output.h>
+ #include <kscreen/edid.h>
+
++QString Serializer::sConfigPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) % QStringLiteral("/kscreen/");
++
++void Serializer::setConfigPath(const QString &path)
++{
++ sConfigPath = path;
++ if (!sConfigPath.endsWith(QLatin1Char('/'))) {
++ sConfigPath += QLatin1Char('/');
++ }
++}
++
+ QString Serializer::configId(const KScreen::ConfigPtr ¤tConfig)
+ {
+ KScreen::OutputList outputs = currentConfig->outputs();
+@@ -65,15 +77,14 @@ bool Serializer::configExists(const KScreen::ConfigPtr &config)
+
+ bool Serializer::configExists(const QString& id)
+ {
+- QString path(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/kscreen/") + id);
+- return QFile::exists(path);
++ return QFile::exists(sConfigPath % id);
+ }
+
+ KScreen::ConfigPtr Serializer::config(const KScreen::ConfigPtr ¤tConfig, const QString& id)
+ {
+ KScreen::ConfigPtr config = currentConfig->clone();
+
+- QFile file(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/kscreen/") + id);
++ QFile file(sConfigPath % id);
+ if (!file.open(QIODevice::ReadOnly))
+ return KScreen::ConfigPtr();
+
+@@ -86,16 +97,29 @@ KScreen::ConfigPtr Serializer::config(const KScreen::ConfigPtr ¤tConfig, c
+ }
+ }
+
++ QSize screenSize;
+ Q_FOREACH(const QVariant &info, outputs) {
+ KScreen::OutputPtr output = Serializer::findOutput(config, info.toMap());
+ if (!output) {
+ continue;
+ }
+
++ if (output->isEnabled()) {
++ const QRect geom = output->geometry();
++ if (geom.x() + geom.width() > screenSize.width()) {
++ screenSize.setWidth(geom.x() + geom.width());
++ }
++ if (geom.y() + geom.height() > screenSize.height()) {
++ screenSize.setHeight(geom.y() + geom.height());
++ }
++ }
++
+ outputList.remove(output->id());
+ outputList.insert(output->id(), output);
+ }
+ config->setOutputs(outputList);
++ config->screen()->setCurrentSize(screenSize);
++
+
+ return config;
+ }
+@@ -145,10 +169,9 @@ bool Serializer::saveConfig(const KScreen::ConfigPtr &config)
+ outputList.append(info);
+ }
+
+- const QString directory = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/kscreen/");
+- bool b = QDir().mkpath(directory);
++ bool b = QDir().mkpath(sConfigPath);
+ Q_ASSERT(b);
+- QString filePath = directory + Serializer::configId(config);
++ QString filePath = sConfigPath + Serializer::configId(config);
+ QFile file(filePath);
+ b = file.open(QIODevice::WriteOnly);
+ Q_ASSERT(b);
+diff --git a/kded/serializer.h b/kded/serializer.h
+index ac590af..7e58862 100644
+--- a/kded/serializer.h
++++ b/kded/serializer.h
+@@ -36,6 +36,10 @@ class Serializer
+ static KScreen::OutputPtr findOutput(const KScreen::ConfigPtr &config, const QVariantMap &info);
+ static QString outputId(const KScreen::OutputPtr &output);
+ static QVariantMap metadata(const KScreen::OutputPtr &output);
++
++ static void setConfigPath(const QString &path);
++ private:
++ static QString sConfigPath;
+ };
+
+ #endif //KDED_SERIALIZER_H
+diff --git a/tests/kded/CMakeLists.txt b/tests/kded/CMakeLists.txt
+index 28cb003..e2ff0f0 100644
+--- a/tests/kded/CMakeLists.txt
++++ b/tests/kded/CMakeLists.txt
+@@ -9,6 +9,7 @@ macro(ADD_KDED_TEST testname)
+ ${CMAKE_SOURCE_DIR}/kded/generator.cpp
+ ${CMAKE_SOURCE_DIR}/kded/device.cpp
+ ${CMAKE_SOURCE_DIR}/kded/debug.cpp
++ ${CMAKE_SOURCE_DIR}/kded/serializer.cpp
+ #${CMAKE_SOURCE_DIR}/kded/daemon.cpp
+ )
+
+@@ -18,11 +19,13 @@ macro(ADD_KDED_TEST testname)
+ )
+
+ add_executable(${testname} ${test_SRCS})
+- target_compile_definitions(${testname} PRIVATE "-DTEST_DATA=\"${CMAKE_CURRENT_SOURCE_DIR}/configs/\"")
++ add_dependencies(${testname} kded_kscreen) # make sure the dbus interfaces are generated
++ target_compile_definitions(${testname} PRIVATE "-DTEST_DATA=\"${CMAKE_CURRENT_SOURCE_DIR}/\"")
+ target_link_libraries(${testname} Qt5::Test Qt5::DBus Qt5::Gui KF5::Screen)
+ add_test(kscreen-kded-${testname} ${testname})
+ ecm_mark_as_test(${testname})
+ endmacro()
+
+ add_kded_test(testgenerator)
++add_kded_test(serializertest)
+ #add_kded_test(testdaemon)
+diff --git a/tests/kded/serializerdata/disabledScreenConfig.json b/tests/kded/serializerdata/disabledScreenConfig.json
+new file mode 100644
+index 0000000..ca6504b
+--- /dev/null
++++ b/tests/kded/serializerdata/disabledScreenConfig.json
+@@ -0,0 +1,36 @@
++[
++ {
++ "enabled": true,
++ "id": "OUTPUT-1",
++ "metadata": {
++ "name": "OUTPUT-1"
++ },
++ "mode": {
++ "refresh": 60.0,
++ "size": {
++ "height": 1080,
++ "width": 1920
++ }
++ },
++ "pos": {
++ "x": 0,
++ "y": 0
++ },
++ "primary": true,
++ "rotation": 1
++ },
++ {
++ "enabled": false,
++ "id": "OUTPUT-2",
++ "metadata": {
++ "name": "OUTPUT-2"
++ },
++ "pos": {
++ "x": 0,
++ "y": 0
++ },
++ "primary": false,
++ "rotation": 1
++ }
++]
++
+diff --git a/tests/kded/serializerdata/rotatedScreenConfig.json b/tests/kded/serializerdata/rotatedScreenConfig.json
+new file mode 100644
+index 0000000..a063080
+--- /dev/null
++++ b/tests/kded/serializerdata/rotatedScreenConfig.json
+@@ -0,0 +1,43 @@
++[
++ {
++ "enabled": true,
++ "id": "OUTPUT-1",
++ "metadata": {
++ "name": "OUTPUT-1"
++ },
++ "mode": {
++ "refresh": 60.0,
++ "size": {
++ "height": 1080,
++ "width": 1920
++ }
++ },
++ "pos": {
++ "x": 0,
++ "y": 0
++ },
++ "primary": true,
++ "rotation": 1
++ },
++ {
++ "enabled": true,
++ "id": "OUTPUT-2",
++ "metadata": {
++ "name": "OUTPUT-2"
++ },
++ "mode": {
++ "refresh": 60,
++ "size": {
++ "height": 1024,
++ "width": 1280
++ }
++ },
++ "pos": {
++ "x": 1920,
++ "y": 0
++ },
++ "primary": false,
++ "rotation": 2
++ }
++]
++
+diff --git a/tests/kded/serializerdata/simpleConfig.json b/tests/kded/serializerdata/simpleConfig.json
+new file mode 100644
+index 0000000..54503bb
+--- /dev/null
++++ b/tests/kded/serializerdata/simpleConfig.json
+@@ -0,0 +1,22 @@
++[
++ {
++ "enabled": true,
++ "id": "OUTPUT-1",
++ "metadata": {
++ "name": "OUTPUT-1"
++ },
++ "mode": {
++ "refresh": 60.0,
++ "size": {
++ "height": 1280,
++ "width": 1920
++ }
++ },
++ "pos": {
++ "x": 0,
++ "y": 0
++ },
++ "primary": true,
++ "rotation": 1
++ }
++]
+diff --git a/tests/kded/serializerdata/twoScreenConfig.json b/tests/kded/serializerdata/twoScreenConfig.json
+new file mode 100644
+index 0000000..b80a710
+--- /dev/null
++++ b/tests/kded/serializerdata/twoScreenConfig.json
+@@ -0,0 +1,42 @@
++[
++ {
++ "enabled": true,
++ "id": "OUTPUT-1",
++ "metadata": {
++ "name": "OUTPUT-1"
++ },
++ "mode": {
++ "refresh": 60.0,
++ "size": {
++ "height": 1080,
++ "width": 1920
++ }
++ },
++ "pos": {
++ "x": 0,
++ "y": 0
++ },
++ "primary": true,
++ "rotation": 1
++ },
++ {
++ "enabled": true,
++ "id": "OUTPUT-2",
++ "metadata": {
++ "name": "OUTPUT-2"
++ },
++ "mode": {
++ "refresh": 60,
++ "size": {
++ "height": 1024,
++ "width": 1280
++ }
++ },
++ "pos": {
++ "x": 1920,
++ "y": 0
++ },
++ "primary": false,
++ "rotation": 1
++ }
++]
+diff --git a/tests/kded/serializertest.cpp b/tests/kded/serializertest.cpp
+new file mode 100644
+index 0000000..e90ddcf
+--- /dev/null
++++ b/tests/kded/serializertest.cpp
+@@ -0,0 +1,206 @@
++/*************************************************************************************
++ * Copyright (C) 2015 by Daniel Vrátil <dvratil at redhat.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 *
++ * of the License, or (at your option) any later version. *
++ * *
++ * This program is distributed in the hope that it will be useful, *
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
++ * GNU General Public License for more details. *
++ * *
++ * You should have received a copy of the GNU General Public License *
++ * along with this program; if not, write to the Free Software *
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA *
++ *************************************************************************************/
++
++#include "../../kded/serializer.h"
++
++#include <QtTest>
++#include <QtCore/QObject>
++
++#include <KScreen/Config>
++#include <KScreen/Screen>
++#include <KScreen/Mode>
++#include <KScreen/Output>
++
++using namespace KScreen;
++
++class TestSerializer : public QObject
++{
++ Q_OBJECT
++
++private Q_SLOTS:
++ void initTestCase();
++
++ void testSimpleConfig();
++ void testTwoScreenConfig();
++ void testRotatedScreenConfig();
++ void testDisabledScreenConfig();
++
++private:
++ KScreen::ConfigPtr createConfig(bool output1Connected, bool output2Conected);
++};
++
++ConfigPtr TestSerializer::createConfig(bool output1Connected, bool output2Connected)
++{
++ KScreen::ScreenPtr screen = KScreen::ScreenPtr::create();
++ screen->setCurrentSize(QSize(1920, 1080));
++ screen->setMaxSize(QSize(32768, 32768));
++ screen->setMinSize(QSize(8, 8));
++
++ QList<QSize> sizes({ QSize(320, 240), QSize(640, 480), QSize(1024, 768), QSize(1280, 1024), QSize(1920, 1280) });
++ KScreen::ModeList modes;
++ for (int i = 0; i < sizes.count(); ++i) {
++ const QSize &size = sizes[i];
++ KScreen::ModePtr mode = KScreen::ModePtr::create();
++ mode->setId(QString::fromLatin1("MODE-%1").arg(i));
++ mode->setName(QString::fromLatin1("%1x%2").arg(size.width()).arg(size.height()));
++ mode->setSize(size);
++ mode->setRefreshRate(60.0);
++ modes.insert(mode->id(), mode);
++ }
++
++ KScreen::OutputPtr output1 = KScreen::OutputPtr::create();
++ output1->setId(1);
++ output1->setName(QLatin1String("OUTPUT-1"));
++ output1->setPos(QPoint(0, 0));
++ output1->setConnected(output1Connected);
++ output1->setEnabled(output1Connected);
++ if (output1Connected) {
++ output1->setModes(modes);
++ }
++
++ KScreen::OutputPtr output2 = KScreen::OutputPtr::create();
++ output2->setId(2);
++ output2->setName(QLatin1String("OUTPUT-2"));
++ output2->setPos(QPoint(0, 0));
++ output2->setConnected(output2Connected);
++ if (output2Connected) {
++ output2->setModes(modes);
++ }
++
++ KScreen::ConfigPtr config = KScreen::ConfigPtr::create();
++ config->setScreen(screen);
++ config->addOutput(output1);
++ config->addOutput(output2);
++
++ return config;
++}
++
++void TestSerializer::initTestCase()
++{
++ Serializer::setConfigPath(QLatin1String(TEST_DATA "/serializerdata/"));
++}
++
++void TestSerializer::testSimpleConfig()
++{
++ KScreen::ConfigPtr config = createConfig(true, false);
++ config = Serializer::config(config, QLatin1String("simpleConfig.json"));
++ QVERIFY(config);
++
++ QCOMPARE(config->connectedOutputs().count(), 1);
++
++ auto output = config->connectedOutputs().first();
++ QCOMPARE(output->name(), QLatin1String("OUTPUT-1"));
++ QCOMPARE(output->currentModeId(), QLatin1String("MODE-4"));
++ QCOMPARE(output->currentMode()->size(), QSize(1920, 1280));
++ QCOMPARE(output->isEnabled(), true);
++ QCOMPARE(output->rotation(), KScreen::Output::None);
++ QCOMPARE(output->pos(), QPoint(0, 0));
++ QCOMPARE(output->isPrimary(), true);
++
++ auto screen = config->screen();
++ QCOMPARE(screen->currentSize(), QSize(1920, 1280));
++}
++
++void TestSerializer::testTwoScreenConfig()
++{
++ KScreen::ConfigPtr config = createConfig(true, true);
++ config = Serializer::config(config, QLatin1String("twoScreenConfig.json"));
++ QVERIFY(config);
++
++ QCOMPARE(config->connectedOutputs().count(), 2);
++
++ auto output = config->connectedOutputs().first();
++ QCOMPARE(output->name(), QLatin1String("OUTPUT-1"));
++ QCOMPARE(output->currentModeId(), QLatin1String("MODE-4"));
++ QCOMPARE(output->currentMode()->size(), QSize(1920, 1280));
++ QCOMPARE(output->isEnabled(), true);
++ QCOMPARE(output->rotation(), KScreen::Output::None);
++ QCOMPARE(output->pos(), QPoint(0, 0));
++ QCOMPARE(output->isPrimary(), true);
++
++ output = config->connectedOutputs().last();
++ QCOMPARE(output->name(), QLatin1String("OUTPUT-2"));
++ QCOMPARE(output->currentModeId(), QLatin1String("MODE-3"));
++ QCOMPARE(output->currentMode()->size(), QSize(1280, 1024));
++ QCOMPARE(output->isEnabled(), true);
++ QCOMPARE(output->rotation(), KScreen::Output::None);
++ QCOMPARE(output->pos(), QPoint(1920, 0));
++ QCOMPARE(output->isPrimary(), false);
++
++ auto screen = config->screen();
++ QCOMPARE(screen->currentSize(), QSize(3200, 1280));
++}
++
++void TestSerializer::testRotatedScreenConfig()
++{
++ KScreen::ConfigPtr config = createConfig(true, true);
++ config = Serializer::config(config, QLatin1String("rotatedScreenConfig.json"));
++ QVERIFY(config);
++
++ QCOMPARE(config->connectedOutputs().count(), 2);
++
++ auto output = config->connectedOutputs().first();
++ QCOMPARE(output->name(), QLatin1String("OUTPUT-1"));
++ QCOMPARE(output->currentModeId(), QLatin1String("MODE-4"));
++ QCOMPARE(output->currentMode()->size(), QSize(1920, 1280));
++ QCOMPARE(output->isEnabled(), true);
++ QCOMPARE(output->rotation(), KScreen::Output::None);
++ QCOMPARE(output->pos(), QPoint(0, 0));
++ QCOMPARE(output->isPrimary(), true);
++
++ output = config->connectedOutputs().last();
++ QCOMPARE(output->name(), QLatin1String("OUTPUT-2"));
++ QCOMPARE(output->currentModeId(), QLatin1String("MODE-3"));
++ QCOMPARE(output->currentMode()->size(), QSize(1280, 1024));
++ QCOMPARE(output->isEnabled(), true);
++ QCOMPARE(output->rotation(), KScreen::Output::Left);
++ QCOMPARE(output->pos(), QPoint(1920, 0));
++ QCOMPARE(output->isPrimary(), false);
++
++ auto screen = config->screen();
++ QCOMPARE(screen->currentSize(), QSize(2944, 1280));
++}
++
++void TestSerializer::testDisabledScreenConfig()
++{
++ KScreen::ConfigPtr config = createConfig(true, true);
++ config = Serializer::config(config, QLatin1String("disabledScreenConfig.json"));
++ QVERIFY(config);
++
++ QCOMPARE(config->connectedOutputs().count(), 2);
++
++ auto output = config->connectedOutputs().first();
++ QCOMPARE(output->name(), QLatin1String("OUTPUT-1"));
++ QCOMPARE(output->currentModeId(), QLatin1String("MODE-4"));
++ QCOMPARE(output->currentMode()->size(), QSize(1920, 1280));
++ QCOMPARE(output->isEnabled(), true);
++ QCOMPARE(output->rotation(), KScreen::Output::None);
++ QCOMPARE(output->pos(), QPoint(0, 0));
++ QCOMPARE(output->isPrimary(), true);
++
++ output = config->connectedOutputs().last();
++ QCOMPARE(output->name(), QLatin1String("OUTPUT-2"));
++ QCOMPARE(output->isEnabled(), false);
++
++ auto screen = config->screen();
++ QCOMPARE(screen->currentSize(), QSize(1920, 1280));
++}
++
++QTEST_MAIN(TestSerializer)
++
++#include "serializertest.moc"
+\ No newline at end of file
+diff --git a/tests/kded/testgenerator.cpp b/tests/kded/testgenerator.cpp
+index 3eaad78..a796c70 100644
+--- a/tests/kded/testgenerator.cpp
++++ b/tests/kded/testgenerator.cpp
+@@ -59,9 +59,8 @@ KScreen::ConfigPtr testScreenConfig::loadConfig(const QByteArray& fileName)
+ {
+ KScreen::BackendManager::instance()->shutdownBackend();
+
+- QByteArray path(TEST_DATA);
+- path.append("/" + fileName);
+- setenv("TEST_DATA", path, 1);
++ QByteArray path(TEST_DATA "configs/" + fileName);
++ qputenv("TEST_DATA", path);
+ qDebug() << path;
+
+ KScreen::GetConfigOperation *op = new KScreen::GetConfigOperation;
diff --git a/kscreen.spec b/kscreen.spec
index 8695d40..9a68c50 100644
--- a/kscreen.spec
+++ b/kscreen.spec
@@ -4,7 +4,7 @@
Name: kscreen
Epoch: 1
Version: 5.2.2
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: KDE Display Management software
# KDE e.V. may determine that future GPL versions are accepted
@@ -23,6 +23,9 @@ Source0: http://download.kde.org/%{stable}/plasma/%{version}/%{name}-%{ve
# --output=kscreen-%{git_version}.tar.gz %{git_version}
#Source0: kscreen-%{git_version}.tar.gz
+# Upstream patches
+Patch10: kscreen-5.3-rhbz1211881.patch
+
BuildRequires: extra-cmake-modules
BuildRequires: kf5-rpm-macros
BuildRequires: qt5-qtbase-devel
@@ -46,7 +49,7 @@ KCM and KDED modules for managing displays in KDE.
%prep
-%setup -q -n %{name}-%{version}
+%autosetup -p1 -n %{name}-%{version}
%build
@@ -86,6 +89,9 @@ fi
%changelog
+* Wed Apr 15 2015 Daniel Vrátil <dvratil at redhat.com> - 5.2.2-2
+- add upstream fix for RHBZ#1211881
+
* Fri Mar 20 2015 Daniel Vrátil <dvratil at redhat.com> - 5.2.2-1
- Plasma 5.2.2
--
cgit v0.10.2
http://pkgs.fedoraproject.org/cgit/kscreen.git/commit/?h=f22&id=4c6e35b90658ed8bef2d35884d11c70d15bc9dcd
More information about the scm-commits
mailing list