static RROutputPtr rdpRRAddOutput(rdpPtr dev, const char *aname, int x, int y, int width, int height) { RRModePtr mode; RRCrtcPtr crtc; RROutputPtr output; xRRModeInfo modeInfo; char name[64]; sprintf (name, "%dx%d", width, height); memset (&modeInfo, 0, sizeof(modeInfo)); modeInfo.width = width; modeInfo.height = height; modeInfo.nameLength = strlen(name); mode = RRModeGet(&modeInfo, name); if (mode == 0) { LLOGLN(0, ("rdpRRAddOutput: RRModeGet failed")); return 0; } crtc = RRCrtcCreate(dev->pScreen, NULL); if (crtc == 0) { LLOGLN(0, ("rdpRRAddOutput: RRCrtcCreate failed")); RRModeDestroy(mode); return 0; } output = RROutputCreate(dev->pScreen, aname, strlen(aname), NULL); if (output == 0) { LLOGLN(0, ("rdpRRAddOutput: RROutputCreate failed")); RRCrtcDestroy(crtc); RRModeDestroy(mode); return 0; } if (!RROutputSetClones(output, NULL, 0)) { LLOGLN(0, ("rdpRRAddOutput: RROutputSetClones failed")); } if (!RROutputSetModes(output, &mode, 1, 0)) { LLOGLN(0, ("rdpRRAddOutput: RROutputSetModes failed")); } if (!RROutputSetCrtcs(output, &crtc, 1)) { LLOGLN(0, ("rdpRRAddOutput: RROutputSetCrtcs failed")); } if (!RROutputSetConnection(output, RR_Connected)) { LLOGLN(0, ("rdpRRAddOutput: RROutputSetConnection failed")); } RRCrtcNotify(crtc, mode, x, y, RR_Rotate_0, NULL, 1, &output); dev->output[dev->extra_outputs] = output; dev->crtc[dev->extra_outputs] = crtc; dev->extra_outputs++; return output; }
/** * Given a list of xf86 modes and a RandR Output object, construct * RandR modes and assign them to the output */ static Bool xf86RROutputSetModes (RROutputPtr randr_output, DisplayModePtr modes) { DisplayModePtr mode; RRModePtr *rrmodes = NULL; int nmode = 0; int npreferred = 0; Bool ret = TRUE; int pref; for (mode = modes; mode; mode = mode->next) nmode++; if (nmode) { rrmodes = xalloc (nmode * sizeof (RRModePtr)); if (!rrmodes) return FALSE; nmode = 0; for (pref = 1; pref >= 0; pref--) { for (mode = modes; mode; mode = mode->next) { if ((pref != 0) == ((mode->type & M_T_PREFERRED) != 0)) { xRRModeInfo modeInfo; RRModePtr rrmode; modeInfo.nameLength = strlen (mode->name); modeInfo.width = mode->HDisplay; modeInfo.dotClock = mode->Clock * 1000; modeInfo.hSyncStart = mode->HSyncStart; modeInfo.hSyncEnd = mode->HSyncEnd; modeInfo.hTotal = mode->HTotal; modeInfo.hSkew = mode->HSkew; modeInfo.height = mode->VDisplay; modeInfo.vSyncStart = mode->VSyncStart; modeInfo.vSyncEnd = mode->VSyncEnd; modeInfo.vTotal = mode->VTotal; modeInfo.modeFlags = mode->Flags; rrmode = RRModeGet (&modeInfo, mode->name); if (rrmode) { rrmodes[nmode++] = rrmode; npreferred += pref; } } } } } ret = RROutputSetModes (randr_output, rrmodes, nmode, npreferred); xfree (rrmodes); return ret; }
static RRModePtr RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh) { ScreenPtr pScreen = output->pScreen; rrScrPriv(pScreen); xRRModeInfo modeInfo; char name[100]; RRModePtr mode; int i; RRModePtr *modes; memset (&modeInfo, '\0', sizeof (modeInfo)); sprintf (name, "%dx%d", size->width, size->height); modeInfo.width = size->width; modeInfo.height = size->height; modeInfo.hTotal = size->width; modeInfo.vTotal = size->height; modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->height * (CARD32) refresh); modeInfo.nameLength = strlen (name); mode = RRModeGet (&modeInfo, name); if (!mode) return NULL; for (i = 0; i < output->numModes; i++) if (output->modes[i] == mode) { RRModeDestroy (mode); return mode; } if (output->numModes) modes = xrealloc (output->modes, (output->numModes + 1) * sizeof (RRModePtr)); else modes = xalloc (sizeof (RRModePtr)); if (!modes) { RRModeDestroy (mode); FreeResource (mode->mode.id, 0); return NULL; } modes[output->numModes++] = mode; output->modes = modes; output->changed = TRUE; pScrPriv->changed = TRUE; pScrPriv->configChanged = TRUE; return mode; }
static RRModePtr vncRandRModeGet(int width, int height) { xRRModeInfo modeInfo; char name[100]; RRModePtr mode; 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 * 60); modeInfo.nameLength = strlen(name); mode = RRModeGet(&modeInfo, name); if (mode == NULL) return NULL; return mode; }