[platforms/x11/windowed] Create output devices

Summary: Create output devices in X11 nested Wayland session.

Test Plan: Started nested session in X11. KScreen showed output.

Reviewers: #kwin

Subscribers: kwin

Tags: #kwin

Maniphest Tasks: T11459

Differential Revision: https://phabricator.kde.org/D23479
This commit is contained in:
Roman Gilg 2019-08-27 12:31:42 +02:00
parent d960be4b3f
commit edb200f6bc
3 changed files with 17 additions and 6 deletions

View file

@ -54,6 +54,7 @@ X11WindowedBackend::X11WindowedBackend(QObject *parent)
{ {
setSupportsPointerWarping(true); setSupportsPointerWarping(true);
connect(this, &X11WindowedBackend::sizeChanged, this, &X11WindowedBackend::screenSizeChanged); connect(this, &X11WindowedBackend::sizeChanged, this, &X11WindowedBackend::screenSizeChanged);
handleOutputs();
} }
X11WindowedBackend::~X11WindowedBackend() X11WindowedBackend::~X11WindowedBackend()
@ -153,9 +154,7 @@ void X11WindowedBackend::createOutputs()
int logicalWidthSum = 0; int logicalWidthSum = 0;
for (int i = 0; i < initialOutputCount(); ++i) { for (int i = 0; i < initialOutputCount(); ++i) {
auto *output = new X11WindowedOutput(this); auto *output = new X11WindowedOutput(this);
output->setScale(initialOutputScale()); output->init(QPoint(logicalWidthSum, 0), QSize(pixelWidth, pixelHeight));
output->setGeometry(QPoint(logicalWidthSum, 0), QSize(pixelWidth, pixelHeight));
output->init();
m_protocols = protocolsAtom; m_protocols = protocolsAtom;
m_deleteWindowProtocol = deleteWindowAtom; m_deleteWindowProtocol = deleteWindowAtom;

View file

@ -47,8 +47,20 @@ X11WindowedOutput::~X11WindowedOutput()
xcb_flush(m_backend->connection()); xcb_flush(m_backend->connection());
} }
void X11WindowedOutput::init() void X11WindowedOutput::init(const QPoint &logicalPosition, const QSize &pixelSize)
{ {
KWayland::Server::OutputDeviceInterface::Mode mode;
mode.id = 0;
mode.size = pixelSize;
mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current;
mode.refreshRate = 60000; // TODO: get refresh rate via randr
AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO",
"UUID_TODO", { mode });
setEnabled(true);
setGeometry(logicalPosition, pixelSize);
setScale(m_backend->initialOutputScale());
uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
const uint32_t values[] = { const uint32_t values[] = {
m_backend->screen()->black_pixel, m_backend->screen()->black_pixel,
@ -67,7 +79,7 @@ void X11WindowedOutput::init()
m_window, m_window,
m_backend->screen()->root, m_backend->screen()->root,
0, 0, 0, 0,
pixelSize().width(), pixelSize().height(), pixelSize.width(), pixelSize.height(),
0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT,
mask, values); mask, values);

View file

@ -45,7 +45,7 @@ public:
explicit X11WindowedOutput(X11WindowedBackend *backend); explicit X11WindowedOutput(X11WindowedBackend *backend);
~X11WindowedOutput() override; ~X11WindowedOutput() override;
void init(); void init(const QPoint &logicalPosition, const QSize &pixelSize);
xcb_window_t window() const { xcb_window_t window() const {
return m_window; return m_window;