diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2017-12-13 23:18:34 +0100 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2017-12-13 23:18:34 +0100 |
commit | c5f3c204236614261cfd8c694d713004847a3b0d (patch) | |
tree | cdca5ba521547bec21739b61d84a39f7967a7797 | |
parent | 73c113ce64bb454361f4a145e4880651af7707f7 (diff) | |
parent | bd1ca625e4a48c3702da8a5ac170904c371e9bda (diff) | |
download | nx-libs-c5f3c204236614261cfd8c694d713004847a3b0d.tar.gz nx-libs-c5f3c204236614261cfd8c694d713004847a3b0d.tar.bz2 nx-libs-c5f3c204236614261cfd8c694d713004847a3b0d.zip |
Merge branch 'uli42-pr/pre-rrxinerama-fallback' into 3.6.x
Attributes GH PR #602: https://github.com/ArcticaProject/nx-libs/pull/602
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Extensions.c | 2 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Screen.c | 119 |
2 files changed, 100 insertions, 21 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Extensions.c b/nx-X11/programs/Xserver/hw/nxagent/Extensions.c index d9db1a8aa..237e13fb6 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Extensions.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Extensions.c @@ -136,7 +136,7 @@ void nxagentInitRandRExtension(ScreenPtr pScreen) pRandRScrPriv = rrGetScrPriv(pScreen); - pRandRScrPriv -> rrGetInfo = nxagentRandRGetInfo; + pRandRScrPriv -> rrGetInfo = nxagentRandRGetInfo; #if RANDR_15_INTERFACE /* nothing to be assigned here, so far */ diff --git a/nx-X11/programs/Xserver/hw/nxagent/Screen.c b/nx-X11/programs/Xserver/hw/nxagent/Screen.c index 90ebe9829..d642f63b7 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Screen.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Screen.c @@ -3666,11 +3666,88 @@ Bool intersect_bb(int ax1, int ay1, unsigned int aw, unsigned int ah, } #endif +RRModePtr nxagentRRCustomMode = NULL; + +/* + This is basically the code that was used on screen resize before + xinerama was implemented. We need it as fallback if the user + disables xinerama +*/ +void nxagentAdjustCustomMode(ScreenPtr pScreen) +{ + rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen); + RROutputPtr output; + + if (pScrPriv) + { + output = RRFirstOutput(pScreen); + + if (output && output -> crtc) + { + RRCrtcPtr crtc; + char name[100]; + xRRModeInfo modeInfo; + const int refresh = 60; + int width = nxagentOption(Width); + int height = nxagentOption(Height); + + crtc = output -> crtc; + + for (int c = 0; c < pScrPriv -> numCrtcs; c++) + { + RRCrtcSet(pScrPriv -> crtcs[c], NULL, 0, 0, RR_Rotate_0, 0, NULL); + } + + memset(&modeInfo, '\0', sizeof(modeInfo)); + sprintf(name, "%dx%d", width, height); + + modeInfo.width = width; + modeInfo.height = height; + modeInfo.hTotal = width; + modeInfo.vTotal = height; + modeInfo.dotClock = ((CARD32) width * (CARD32) height * + (CARD32) refresh); + modeInfo.nameLength = strlen(name); + + if (nxagentRRCustomMode != NULL) + { + RROutputDeleteUserMode(output, nxagentRRCustomMode); + FreeResource(nxagentRRCustomMode -> mode.id, 0); + + if (crtc != NULL && crtc -> mode == nxagentRRCustomMode) + { + RRCrtcSet(crtc, NULL, 0, 0, RR_Rotate_0, 0, NULL); + } + + #ifdef TEST + fprintf(stderr, "%s: Going to destroy mode %p with refcnt %d.\n", + __func__, nxagentRRCustomMode, nxagentRRCustomMode->refcnt); + #endif + + RRModeDestroy(nxagentRRCustomMode); + } + + nxagentRRCustomMode = RRModeGet(&modeInfo, name); + + RROutputAddUserMode(output, nxagentRRCustomMode); + + RRCrtcSet(crtc, nxagentRRCustomMode, 0, 0, RR_Rotate_0, 1, &output); + + RROutputChanged(output, 1); + } + + pScrPriv -> lastSetTime = currentTime; + + pScrPriv->changed = 1; + pScrPriv->configChanged = 1; + } /* if (pScrPriv) */ + + RRScreenSizeNotify(pScreen); +} + int nxagentChangeScreenConfig(int screen, int width, int height, int mmWidth, int mmHeight) { ScreenPtr pScreen; - /* FIXME: when is this needed? */ - int doNotify = TRUE; int r; #ifdef DEBUG @@ -3726,12 +3803,18 @@ int nxagentChangeScreenConfig(int screen, int width, int height, int mmWidth, in if (r != 0) { - nxagentAdjustRandRXinerama(pScreen); - } + if (nxagentOption(Xinerama)) + { + nxagentAdjustRandRXinerama(pScreen); + } + else + { + #ifdef DEBUG + fprintf(stderr, "%s: Xinerama is disabled\n", __func__); + #endif - if (doNotify) - { - RRScreenSizeNotify(pScreen); + nxagentAdjustCustomMode(pScreen); + } } #ifdef DEBUG @@ -3782,24 +3865,20 @@ int nxagentAdjustRandRXinerama(ScreenPtr pScreen) XineramaScreenInfo *screeninfo = NULL; - if (nxagentOption(Xinerama)) { - screeninfo = XineramaQueryScreens(nxagentDisplay, &number); + screeninfo = XineramaQueryScreens(nxagentDisplay, &number); + if (number) + { #ifdef DEBUG - if (number) { - fprintf(stderr, "nxagentAdjustRandRXinerama: XineramaQueryScreens() returned [%d] screens:\n", number); - for (int i=0; i < number; i++) { - fprintf(stderr, "nxagentAdjustRandRXinerama: screen_number [%d] x_org [%d] y_org [%d] width [%d] height [%d]\n", screeninfo[i].screen_number, screeninfo[i].x_org, screeninfo[i].y_org, screeninfo[i].width, screeninfo[i].height); - } - - } - else - { - fprintf(stderr, "nxagentAdjustRandRXinerama: XineramaQueryScreens() failed - continuing without Xinerama\n"); + fprintf(stderr, "nxagentAdjustRandRXinerama: XineramaQueryScreens() returned [%d] screens:\n", number); + for (int i=0; i < number; i++) { + fprintf(stderr, "nxagentAdjustRandRXinerama: screen_number [%d] x_org [%d] y_org [%d] width [%d] height [%d]\n", screeninfo[i].screen_number, screeninfo[i].x_org, screeninfo[i].y_org, screeninfo[i].width, screeninfo[i].height); } +#endif } else { - fprintf(stderr, "nxagentAdjustRandRXinerama: Xinerama is disabled\n"); +#ifdef DEBUG + fprintf(stderr, "nxagentAdjustRandRXinerama: XineramaQueryScreens() failed - continuing without Xinerama\n"); #endif } |