From 3e745745fecef1cb59e53bde52ded311b51e1dac Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 16 Sep 2006 23:21:37 -0700 Subject: Split RandR implementation into separate files. RandR is getting too big to live in one file; split into one file per object type (crtc, mode, screen), leaving the rest of the code in randr.c. Code is slowly approaching the point where it will drop-in as a replacement for the old 1.0 implementation. --- randr/rrmode.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 randr/rrmode.c (limited to 'randr/rrmode.c') diff --git a/randr/rrmode.c b/randr/rrmode.c new file mode 100644 index 000000000..1eb53c388 --- /dev/null +++ b/randr/rrmode.c @@ -0,0 +1,85 @@ +/* + * Copyright © 2006 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "randrstr.h" + +static RESTYPE ModeType; + +RRModePtr +RRModeGet (ScreenPtr pScreen, + xRRModeInfo *modeInfo, + char *name) +{ + rrScrPriv (pScreen); + int i; + RRModePtr mode; + + for (i = 0; i < pScrPriv->numModes; i++) + { + mode = pScrPriv->modes[i]; + if (!memcmp (modeInfo, &mode->mode, sizeof (xRRModeInfo)) && + !memcmp (name, mode->name, modeInfo->nameLength)) + { + ++mode->refcnt; + return mode; + } + } + mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1); + mode->refcnt = 1; + mode->mode = *modeInfo; + mode->name = (char *) (mode + 1); + memcpy (mode->name, name, modeInfo->nameLength); + mode->name[modeInfo->nameLength] = '\0'; + mode->id = FakeClientID(0); + if (!AddResource (mode->id, ModeType, (pointer) mode)) + return NULL; + ++mode->refcnt; + pScrPriv->changed = TRUE; + return mode; +} + +void +RRModeDestroy (RRModePtr mode) +{ + if (--mode->refcnt > 0) + return; + xfree (mode); +} + +static int +RRModeDestroyResource (pointer value, XID pid) +{ + RRModeDestroy ((RRModePtr) value); + return 1; +} + +Bool +RRModeInit (void) +{ + ModeType = CreateNewResourceType (RRModeDestroyResource); + if (!ModeType) + return FALSE; +#ifdef XResExtension + RegisterResourceName (ModeType, "MODE"); +#endif + return TRUE; +} -- cgit v1.2.3