diff options
Diffstat (limited to 'randr/rrmode.c')
-rw-r--r-- | randr/rrmode.c | 108 |
1 files changed, 59 insertions, 49 deletions
diff --git a/randr/rrmode.c b/randr/rrmode.c index fb4b5eb1e..3cd9ef273 100644 --- a/randr/rrmode.c +++ b/randr/rrmode.c @@ -42,19 +42,23 @@ RRModeEqual (xRRModeInfo *a, xRRModeInfo *b) return TRUE; } +/* + * Keep a list so it's easy to find modes in the resource database. + */ +static int num_modes; +static RRModePtr *modes; + RRModePtr -RRModeGet (ScreenPtr pScreen, - xRRModeInfo *modeInfo, +RRModeGet (xRRModeInfo *modeInfo, const char *name) { - rrScrPriv (pScreen); int i; RRModePtr mode; - RRModePtr *modes; + RRModePtr *newModes; - for (i = 0; i < pScrPriv->numModes; i++) + for (i = 0; i < num_modes; i++) { - mode = pScrPriv->modes[i]; + mode = modes[i]; if (RRModeEqual (&mode->mode, modeInfo) && !memcmp (name, mode->name, modeInfo->nameLength)) { @@ -71,16 +75,14 @@ RRModeGet (ScreenPtr pScreen, mode->name = (char *) (mode + 1); memcpy (mode->name, name, modeInfo->nameLength); mode->name[modeInfo->nameLength] = '\0'; - mode->screen = pScreen; mode->userDefined = FALSE; - if (pScrPriv->numModes) - modes = xrealloc (pScrPriv->modes, - (pScrPriv->numModes + 1) * sizeof (RRModePtr)); + if (num_modes) + newModes = xrealloc (modes, (num_modes + 1) * sizeof (RRModePtr)); else - modes = xalloc (sizeof (RRModePtr)); + newModes = xalloc (sizeof (RRModePtr)); - if (!modes) + if (!newModes) { xfree (mode); return NULL; @@ -89,37 +91,64 @@ RRModeGet (ScreenPtr pScreen, mode->mode.id = FakeClientID(0); if (!AddResource (mode->mode.id, RRModeType, (pointer) mode)) return NULL; + modes = newModes; + modes[num_modes++] = mode; + + /* + * give the caller a reference to this mode + */ ++mode->refcnt; - pScrPriv->modes = modes; - pScrPriv->modes[pScrPriv->numModes++] = mode; - pScrPriv->changed = TRUE; return mode; } +RRModePtr * +RRModesForScreen (ScreenPtr pScreen, int *num_ret) +{ + rrScrPriv(pScreen); + int o; + RRModePtr *screen_modes; + int num_screen_modes = 0; + + screen_modes = xalloc ((num_modes ? num_modes : 1) * sizeof (RRModePtr)); + + for (o = 0; o < pScrPriv->numOutputs; o++) + { + RROutputPtr output = pScrPriv->outputs[o]; + int m, n; + + for (m = 0; m < output->numModes; m++) + { + RRModePtr mode = output->modes[m]; + for (n = 0; n < num_screen_modes; n++) + if (screen_modes[n] == mode) + break; + if (n == num_screen_modes) + screen_modes[num_screen_modes++] = mode; + } + } + *num_ret = num_screen_modes; + return screen_modes; +} + void RRModeDestroy (RRModePtr mode) { - ScreenPtr pScreen; - rrScrPrivPtr pScrPriv; int m; if (--mode->refcnt > 0) return; - pScreen = mode->screen; - pScrPriv = rrGetScrPriv (pScreen); - for (m = 0; m < pScrPriv->numModes; m++) + for (m = 0; m < num_modes; m++) { - if (pScrPriv->modes[m] == mode) + if (modes[m] == mode) { - memmove (pScrPriv->modes + m, pScrPriv->modes + m + 1, - (pScrPriv->numModes - m - 1) * sizeof (RRModePtr)); - pScrPriv->numModes--; - if (!pScrPriv->numModes) + memmove (modes + m, modes + m + 1, + (num_modes - m - 1) * sizeof (RRModePtr)); + num_modes--; + if (!num_modes) { - xfree (pScrPriv->modes); - pScrPriv->modes = NULL; + xfree (modes); + modes = NULL; } - pScrPriv->changed = TRUE; break; } } @@ -137,6 +166,8 @@ RRModeDestroyResource (pointer value, XID pid) Bool RRModeInit (void) { + assert (num_modes == 0); + assert (modes == NULL); RRModeType = CreateNewResourceType (RRModeDestroyResource); if (!RRModeType) return FALSE; @@ -146,26 +177,6 @@ RRModeInit (void) return TRUE; } -void -RRModePruneUnused (ScreenPtr pScreen) -{ - rrScrPriv (pScreen); - RRModePtr *unused, mode; - int m; - int num = pScrPriv->numModes; - - unused = xalloc (num * sizeof (RRModePtr)); - if (!unused) - return; - memcpy (unused, pScrPriv->modes, num * sizeof (RRModePtr)); - for (m = 0; m < num; m++) { - mode = unused[m]; - if (mode->refcnt == 1 && !mode->userDefined) - FreeResource (mode->mode.id, 0); - } - xfree (unused); -} - int ProcRRCreateMode (ClientPtr client) { @@ -205,4 +216,3 @@ ProcRRDeleteOutputMode (ClientPtr client) (void) stuff; return BadImplementation; } - |