kwin/plugins/platforms/wayland/wayland_output.h
Roman Gilg f013a4369c [platforms/wayland] Create output devices
Summary:
Since all Wayland session backends now use the same structure of
AbstractWaylandOutput we can create output devices like in the DRM backend.

First let us do this for Wayland nested sessions.

Test Plan: Manually with output-count 1 and 2. Outputs are correctly shown in KScreen.

Reviewers: #kwin

Subscribers: zzag, kwin

Tags: #kwin

Maniphest Tasks: T11140, T11459

Differential Revision: https://phabricator.kde.org/D23473
2019-08-27 12:20:25 +02:00

137 lines
3.4 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright 2019 Roman Gilg <subdiff@gmail.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, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_WAYLAND_OUTPUT_H
#define KWIN_WAYLAND_OUTPUT_H
#include "abstract_wayland_output.h"
#include <KWayland/Client/xdgshell.h>
#include <QObject>
namespace KWayland
{
namespace Client
{
class Surface;
class Shell;
class ShellSurface;
class Pointer;
class LockedPointer;
}
}
namespace KWin
{
namespace Wayland
{
class WaylandBackend;
class WaylandOutput : public AbstractWaylandOutput
{
Q_OBJECT
public:
WaylandOutput(KWayland::Client::Surface *surface, WaylandBackend *backend);
~WaylandOutput() override;
void init(const QPoint &logicalPosition, const QSize &pixelSize);
virtual void lockPointer(KWayland::Client::Pointer *pointer, bool lock) {
Q_UNUSED(pointer)
Q_UNUSED(lock)
}
virtual bool pointerIsLocked() { return false; }
QSize pixelSize() const override;
/**
* @brief defines the geometry of the output
* @param logicalPosition top left position of the output in compositor space
* @param pixelSize output size as seen from the outside
*/
void setGeometry(const QPoint &logicalPosition, const QSize &pixelSize);
KWayland::Client::Surface* surface() const {
return m_surface;
}
bool rendered() const {
return m_rendered;
}
void resetRendered() {
m_rendered = false;
}
Q_SIGNALS:
void sizeChanged(const QSize &size);
void frameRendered();
protected:
WaylandBackend *backend() {
return m_backend;
}
private:
KWayland::Client::Surface *m_surface;
WaylandBackend *m_backend;
QSize m_pixelSize;
bool m_rendered = false;
};
class ShellOutput : public WaylandOutput
{
public:
ShellOutput(KWayland::Client::Surface *surface,
KWayland::Client::Shell *shell,
WaylandBackend *backend);
~ShellOutput() override;
private:
KWayland::Client::ShellSurface *m_shellSurface = nullptr;
};
class XdgShellOutput : public WaylandOutput
{
public:
XdgShellOutput(KWayland::Client::Surface *surface,
KWayland::Client::XdgShell *xdgShell,
WaylandBackend *backend, int number);
~XdgShellOutput() override;
void lockPointer(KWayland::Client::Pointer *pointer, bool lock) override;
private:
void handleConfigure(const QSize &size, KWayland::Client::XdgShellSurface::States states, quint32 serial);
void updateWindowTitle();
KWayland::Client::XdgShellSurface *m_xdgShellSurface = nullptr;
int m_number;
KWayland::Client::LockedPointer *m_pointerLock = nullptr;
bool m_hasPointerLock = false;
};
}
}
#endif