Add virtual display creation logic, with support for custom resolutions

This commit is contained in:
wheaney 2025-08-20 14:18:26 -07:00
parent 026f5825f3
commit 7200ac95f5
2 changed files with 25 additions and 1 deletions

View File

@ -7,6 +7,9 @@
#include "core/rendertarget.h"
#include "core/renderviewport.h"
#include <kwin/main.h>
#include <core/outputbackend.h>
#include <functional>
#include <QAction>
#include <QFile>
@ -194,6 +197,11 @@ void BreezyDesktopEffect::deactivate()
m_cursorUpdateTimer->stop();
showCursor();
for (auto output : m_virtualOutputs) {
KWin::kwinApp()->outputBackend()->removeVirtualOutput(output);
}
m_virtualOutputs.clear();
// this triggers realDeactivate with a delay so if it's triggered from QML it gives the QML function time to
// exit, avoiding a crash
m_shutdownTimer->start(250);
@ -207,7 +215,6 @@ void BreezyDesktopEffect::realDeactivate()
void BreezyDesktopEffect::recenter()
{
qCCritical(KWIN_XR) << "\t\t\tBreezy - recenter";
QFile controlFile(QStringLiteral("/dev/shm/xr_driver_control"));
if (controlFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
controlFile.write("recenter_screen=true\n");
@ -215,6 +222,21 @@ void BreezyDesktopEffect::recenter()
}
}
void BreezyDesktopEffect::addVirtualDisplay(QSize size)
{
// QSize size(2560, 1440);
// addVirtualDisplay(size);
static int virtualDisplayCount = 0;
++virtualDisplayCount;
QString name = QStringLiteral("BreezyDesktop_VirtualDisplay_%1x%2_%3").arg(size.width()).arg(size.height()).arg(virtualDisplayCount);
QString description = QStringLiteral("Breezy Display %1x%2 (%3)").arg(size.width()).arg(size.height()).arg(virtualDisplayCount);
auto output = KWin::kwinApp()->outputBackend()->createVirtualOutput(name, description, size, 1.0);
if (output) {
m_virtualOutputs.append(output);
}
}
bool BreezyDesktopEffect::isEnabled() const {
return m_enabled;
}

View File

@ -65,6 +65,7 @@ namespace KWin
void deactivate();
void toggle();
void recenter();
void addVirtualDisplay(QSize size);
void updateImuRotation();
void updateCursorImage();
void updateCursorPos();
@ -106,6 +107,7 @@ namespace KWin
QTimer *m_cursorUpdateTimer = nullptr;
qreal m_focusedDisplayDistance = 0.85;
qreal m_allDisplaysDistance = 1.05;
QList<Output *> m_virtualOutputs;
};
} // namespace KWin