Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion nx-X11/programs/Xserver/hw/nxagent/Extensions.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
119 changes: 99 additions & 20 deletions nx-X11/programs/Xserver/hw/nxagent/Screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down