diff options
author | Simon Rettberg | 2020-08-12 10:02:20 +0200 |
---|---|---|
committer | Simon Rettberg | 2020-08-12 10:02:20 +0200 |
commit | 0d38ecc3e979a05fb29840c0df342422394b4ba3 (patch) | |
tree | 141d57d92562953d937fde5288ccc9e754b2f4d2 /core/modules/run-virt/winres | |
parent | [pam-slx-plug] Kill pwdaemon, umount PERSISTENT on session end (diff) | |
download | mltk-0d38ecc3e979a05fb29840c0df342422394b4ba3.tar.gz mltk-0d38ecc3e979a05fb29840c0df342422394b4ba3.tar.xz mltk-0d38ecc3e979a05fb29840c0df342422394b4ba3.zip |
[run-virt] openslx.exe: Support multi-screen (VMware)
Diffstat (limited to 'core/modules/run-virt/winres')
-rw-r--r-- | core/modules/run-virt/winres/src/winres.c | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/core/modules/run-virt/winres/src/winres.c b/core/modules/run-virt/winres/src/winres.c index c5d22bd5..a08c9821 100644 --- a/core/modules/run-virt/winres/src/winres.c +++ b/core/modules/run-virt/winres/src/winres.c @@ -590,21 +590,36 @@ static void setPowerState() static int setResolution() { int ret; - static int width = 0, height = 0; - if (width == 0 && height == 0) { + static int nres = 0; + static struct { long int w, h; } res[16]; + if (nres == -1) // We've been here before and consider config invalid, or are done + return 0; + if (nres == 0) { // use config file in floppy - char data[200] = ""; - GetPrivateProfileStringA("openslx", "resolution", "", data, sizeof(data), SETTINGS_FILE); - char *x = strchr(data, 'x'); - if (x == NULL) { + char data[300] = ""; + GetPrivateProfileStringA("openslx", "resolution2", "", data, sizeof(data), SETTINGS_FILE); // Multi-res, space separated + if (data[0] == '\0') { + GetPrivateProfileStringA("openslx", "resolution", "", data, sizeof(data), SETTINGS_FILE); // Fallback + } + char *pos = data, *end; + while (*pos != '\0' && nres < 16) { + res[nres].w = strtol(pos, &end, 10); + if (*end != 'x') + break; + res[nres].h = strtol(end + 1, &pos, 10); + if (*pos != '\0' && *pos != ' ') + break; + if (res[nres].w < 320 || res[nres].h < 240) { + alog("Invalid resolution in " SETTINGS_FILE ": '%s' (parsed width=%ld, height=%ld)", data, res[nres].w, res[nres].h); + continue; + } + nres++; + } + if (*pos != '\0') { alog("Malformed resolution in " SETTINGS_FILE ": '%s'", data); - return 0; } - *x++ = '\0'; - width = atoi(data); - height = atoi(x); - if (width < 320 || height < 240) { - alog("Invalid resolution in " SETTINGS_FILE ": '%s' (parsed width=%d, height=%d)", data, width, height); + if (nres == 0) { + nres = -1; return 0; } } @@ -627,24 +642,32 @@ static int setResolution() } if (path[0] != 0 && fileExists(path)) { wchar_t cmdline[MAX_PATH]; - StringCchPrintfW(cmdline, MAX_PATH, L"VMwareResolutionSet.exe 0 1 , 0 0 %d %d", width, height); + wchar_t *pos = cmdline; + size_t rem = MAX_PATH; + long int sx = 0, i = 0; + StringCchPrintfExW(pos, rem, &pos, &rem, 0, L"VMwareResolutionSet.exe 0 %d", nres); + while (rem > 0 && i < nres) { + StringCchPrintfExW(pos, rem, &pos, &rem, 0, L" , %ld 0 %ld %ld", sx, res[i].w, res[i].h); + sx += res[i++].w; + } + //wlog(L"cmd: %s", cmdline); int ret = execute(path, cmdline); if (ret == -1) { alog("VmwareRes: CreateProcess failed (%d)", (int)GetLastError()); } else if (ret == -2) { alog("VmwareRes: GetExitCode failed (%d)", (int)GetLastError()); + } else { + return 0; } } // Use WinAPI as fallback - DEVMODE mode; - int query = 1337; - memset(&mode, 0, sizeof(mode)); - mode.dmSize = sizeof(mode); + // TODO: Multi-Screen (once it really matters) + DEVMODE mode = { .dmSize = sizeof(mode) }; // MSDN recommends to fill the struct first by querying.... - query = EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &mode); + int query = EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &mode); // Then set our own desired mode - mode.dmPelsWidth = width; - mode.dmPelsHeight = height; + mode.dmPelsWidth = res[0].w; + mode.dmPelsHeight = res[0].h; mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; ret = ChangeDisplaySettings(&mode, CDS_GLOBAL | CDS_UPDATEREGISTRY); if (ret != DISP_CHANGE_SUCCESSFUL) { @@ -659,8 +682,8 @@ static int setResolution() if (ret != DISP_CHANGE_SUCCESSFUL) { static int fails = 0; if (++fails == 5) { - alog("Fehler beim Setzen der Auflösung: %d (soll: 0) / %d ( soll: !0) - Zielaufloesung: %d * %d", - ret, query, width, height); + alog("Fehler beim Setzen der Auflösung: %d (soll: 0) / %d ( soll: !0) - Zielaufloesung: %ld * %ld", + ret, query, res[0].w, res[0].h); } return 1; } |