summaryrefslogtreecommitdiffstats
path: root/src/xx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/xx.cpp')
-rw-r--r--src/xx.cpp42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/xx.cpp b/src/xx.cpp
index 0a98b00..0707f8b 100644
--- a/src/xx.cpp
+++ b/src/xx.cpp
@@ -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();