2eb876743c
A new implementation of the Screens interface is added which uses XRandR directly instead of relying on QDesktopWidget. The implementation is provided in a new implementation file screens_xrandr.cpp. XRandRScreens comes with a unit test. Unfortunately it's rather difficult to provide a proper unit test against XRandR. Xvfb (which is obviously used on the CI system) doesn't provide the XRandR extension. Also on a "normal" developer system one would not want to just execute the test as the results are not predictable (number of available outputs?) and the test would mess up the setup resulting in nobody wanting to execute the test. As a solution to both problems the unit test starts Xephyr as a nested X server. This allows to have at least some limited tests against XRandR. Nevertheless there are a few things which I was not able to test: * multiple outputs * no output at all The nested X Server approach makes the interaction rather complex. Qt opens it's connection against the main X Server thus QX11Info provides a wrong connection and also KWin::connection() which is heavily used by xcbutils and thus all the RandR wrappers have the wrong connection. To circumvent this problem the test is GUILESS. In case it would call into any code using QX11Info, it would probably either runtime fail or crash. REVIEW: 117614
56 lines
1.6 KiB
C++
56 lines
1.6 KiB
C++
/********************************************************************
|
|
KWin - the KDE window manager
|
|
This file is part of the KDE project.
|
|
|
|
Copyright (C) 2014 Martin Gräßlin <mgraesslin@kde.org>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*********************************************************************/
|
|
#ifndef KWIN_SCREENS_XRANDR_H
|
|
#define KWIN_SCREENS_XRANDR_H
|
|
// kwin
|
|
#include "screens.h"
|
|
#include "x11eventfilter.h"
|
|
// Qt
|
|
#include <QVector>
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
class XRandRScreens : public Screens, public X11EventFilter
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
XRandRScreens(QObject *parent);
|
|
virtual ~XRandRScreens();
|
|
void init() override;
|
|
QRect geometry(int screen) const override;
|
|
int number(const QPoint& pos) const override;
|
|
QSize size(int screen) const override;
|
|
|
|
using QObject::event;
|
|
bool event(xcb_generic_event_t *event) override;
|
|
|
|
protected Q_SLOTS:
|
|
void updateCount() override;
|
|
|
|
private:
|
|
template <typename T>
|
|
void update();
|
|
QVector<QRect> m_geometries;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif
|