diff options
Diffstat (limited to 'src/xx.cpp')
-rw-r--r-- | src/xx.cpp | 42 |
1 files changed, 40 insertions, 2 deletions
@@ -205,6 +205,7 @@ ScreenMode ScreenSetup::setDefaultMode(bool dryRun) return ScreenMode::Advanced; // Dunno lol QSize screenSize = getTotalSizeHorz(outputSizes); if (!dryRun) { + a->createCrtcBackup(); XGrabServer(a->_display); a->disconnectAllCrtcs(); // Set new screen size @@ -244,6 +245,7 @@ bool ScreenSetup::createMode(unsigned int resX, unsigned int resY, float refresh if (mode == nullptr) return false; XRRModeInfo m; + memset(&m, 0, sizeof(m)); m.width = static_cast<unsigned int>(mode->hr); m.height = static_cast<unsigned int>(mode->vr); m.dotClock = static_cast<unsigned long>(mode->pclk) * 1000ul * 1000ul; @@ -255,8 +257,9 @@ bool ScreenSetup::createMode(unsigned int resX, unsigned int resY, float refresh m.vSyncEnd = static_cast<unsigned int>(mode->vse); m.vTotal = static_cast<unsigned int>(mode->vfl); m.id = 0; - m.name = ba.data(); - m.nameLength = static_cast<unsigned int>(ba.length()); + m.name = ba.data(); + m.nameLength= static_cast<unsigned int>(ba.length()); + m.modeFlags = RR_VSyncPositive | RR_HSyncNegative; free(mode); for (XRRModeInfo *mode : a->_modeMap) { @@ -279,6 +282,41 @@ ScreenSetup::~ScreenSetup() delete a; } +bool ScreenSetup::setCenteredClone() +{ + a->createCrtcBackup(); + XRRModeInfo *fallback = nullptr; + for (auto m : a->_modeMap) { + if (m->width == 1024 && m->height == 768) { + fallback = m; + break; + } + } + XGrabServer(a->_display); + a->disconnectAllCrtcs(); + QSize screenSize; + bool ok = false; + for (auto oi : a->_outputMap) { + auto mode = a->getPreferredMode(oi, fallback); + if (mode != nullptr) { + if (mode->width > screenSize.width()) { + screenSize.setWidth(mode->width); + } + if (mode->height > screenSize.height()) { + screenSize.setHeight(mode->height); + } + // TODO: CENTER + const int x = (screenSize.width() - mode->width) / 2; + const int y = (screenSize.height() - mode->height) / 2; + ok = a->setOutputResolution(oi, 0, 0, QSize(int(mode->width), int(mode->height))) || ok; + } + } + a->setScreenSize(screenSize); + XUngrabServer(a->_display); + XSync(a->_display, False); + return ok; +} + bool ScreenSetup::setClone(const QSize &resolution) { a->createCrtcBackup(); |