📄 saver.c
字号:
} CheckScreenPrivate (pScreen); return TRUE;}static voidSendScreenSaverNotify (pScreen, state, forced) ScreenPtr pScreen; int state; Bool forced;{ ScreenSaverScreenPrivatePtr pPriv; ScreenSaverEventPtr pEv; unsigned long mask; xScreenSaverNotifyEvent ev; ClientPtr client; int kind; ScreenSaverStuffPtr pSaver; UpdateCurrentTimeIf (); mask = ScreenSaverNotifyMask; if (state == ScreenSaverCycle) mask = ScreenSaverCycleMask; pScreen = screenInfo.screens[pScreen->myNum]; pPriv = GetScreenPrivate(pScreen); if (!pPriv) return; pSaver = &savedScreenInfo[pScreen->myNum]; if (pPriv->attr) kind = ScreenSaverExternal; else if (ScreenSaverBlanking != DontPreferBlanking) kind = ScreenSaverBlanked; else kind = ScreenSaverInternal; for (pEv = pPriv->events; pEv; pEv = pEv->next) { client = pEv->client; if (client->clientGone) continue; if (!(pEv->mask & mask)) continue; ev.type = ScreenSaverNotify + ScreenSaverEventBase; ev.state = state; ev.sequenceNumber = client->sequence; ev.timestamp = currentTime.milliseconds; ev.root = WindowTable[pScreen->myNum]->drawable.id; ev.window = savedScreenInfo[pScreen->myNum].wid; ev.kind = kind; ev.forced = forced; WriteEventsToClient (client, 1, (xEvent *) &ev); }}static voidSScreenSaverNotifyEvent (from, to) xScreenSaverNotifyEvent *from, *to;{ to->type = from->type; to->state = from->state; cpswaps (from->sequenceNumber, to->sequenceNumber); cpswapl (from->timestamp, to->timestamp); cpswapl (from->root, to->root); cpswapl (from->window, to->window); to->kind = from->kind; to->forced = from->forced;}static voidUninstallSaverColormap (pScreen) ScreenPtr pScreen;{ SetupScreen(pScreen); ColormapPtr pCmap; if (pPriv && pPriv->installedMap != None) { pCmap = (ColormapPtr) LookupIDByType (pPriv->installedMap, RT_COLORMAP); if (pCmap) (*pCmap->pScreen->UninstallColormap) (pCmap); pPriv->installedMap = None; CheckScreenPrivate (pScreen); }}static BoolCreateSaverWindow (pScreen) ScreenPtr pScreen;{ SetupScreen (pScreen); ScreenSaverStuffPtr pSaver; ScreenSaverAttrPtr pAttr; WindowPtr pWin; int result; unsigned long mask; extern int GrabInProgress; Colormap *installedMaps; int numInstalled; int i; Colormap wantMap; ColormapPtr pCmap; pSaver = &savedScreenInfo[pScreen->myNum]; if (pSaver->pWindow) { pSaver->pWindow = NullWindow; FreeResource (pSaver->wid, RT_NONE); if (pPriv) { UninstallSaverColormap (pScreen); pPriv->hasWindow = FALSE; CheckScreenPrivate (pScreen); } } if (!pPriv || !(pAttr = pPriv->attr)) return FALSE; pPriv->installedMap = None; if (GrabInProgress && GrabInProgress != pAttr->client->index) return FALSE; pWin = CreateWindow (pSaver->wid, WindowTable[pScreen->myNum], pAttr->x, pAttr->y, pAttr->width, pAttr->height, pAttr->borderWidth, pAttr->class, pAttr->mask, (XID *)pAttr->values, pAttr->depth, serverClient, pAttr->visual, &result); if (!pWin) return FALSE; if (!AddResource(pWin->drawable.id, RT_WINDOW, pWin)) return FALSE; mask = 0; if (pAttr->pBackgroundPixmap) { pWin->backgroundState = BackgroundPixmap; pWin->background.pixmap = pAttr->pBackgroundPixmap; pAttr->pBackgroundPixmap->refcnt++; mask |= CWBackPixmap; } if (pAttr->pBorderPixmap) { pWin->borderIsPixel = FALSE; pWin->border.pixmap = pAttr->pBorderPixmap; pAttr->pBorderPixmap->refcnt++; mask |= CWBorderPixmap; } if (pAttr->pCursor) { if (!pWin->optional) if (!MakeWindowOptional (pWin)) { FreeResource (pWin->drawable.id, RT_NONE); return FALSE; } if (pWin->optional->cursor) FreeCursor (pWin->optional->cursor, (Cursor)0); pWin->optional->cursor = pAttr->pCursor; pAttr->pCursor->refcnt++; pWin->cursorIsNone = FALSE; CheckWindowOptionalNeed (pWin); mask |= CWCursor; } if (mask) (*pScreen->ChangeWindowAttributes) (pWin, mask); if (pAttr->colormap != None) (void) ChangeWindowAttributes (pWin, CWColormap, &pAttr->colormap, serverClient); MapWindow (pWin, serverClient); pPriv->hasWindow = TRUE; pSaver->pWindow = pWin; /* check and install our own colormap if it isn't installed now */ wantMap = wColormap (pWin); if (wantMap == None) return TRUE; installedMaps = (Colormap *) ALLOCATE_LOCAL (pScreen->maxInstalledCmaps * sizeof (Colormap)); numInstalled = (*pWin->drawable.pScreen->ListInstalledColormaps) (pScreen, installedMaps); for (i = 0; i < numInstalled; i++) if (installedMaps[i] == wantMap) break; DEALLOCATE_LOCAL ((char *) installedMaps); if (i < numInstalled) return TRUE; pCmap = (ColormapPtr) LookupIDByType (wantMap, RT_COLORMAP); if (!pCmap) return TRUE; pPriv->installedMap = wantMap; (*pCmap->pScreen->InstallColormap) (pCmap); return TRUE;}static BoolDestroySaverWindow (pScreen) ScreenPtr pScreen;{ SetupScreen(pScreen); ScreenSaverStuffPtr pSaver; if (!pPriv || !pPriv->hasWindow) return FALSE; pSaver = &savedScreenInfo[pScreen->myNum]; if (pSaver->pWindow) { pSaver->pWindow = NullWindow; FreeResource (pSaver->wid, RT_NONE); } pPriv->hasWindow = FALSE; CheckScreenPrivate (pScreen); UninstallSaverColormap (pScreen); return TRUE;}static BoolScreenSaverHandle (pScreen, xstate, force) ScreenPtr pScreen; int xstate; Bool force;{ int state; Bool ret = FALSE; ScreenSaverScreenPrivatePtr pPriv; switch (xstate) { case SCREEN_SAVER_ON: state = ScreenSaverOn; ret = CreateSaverWindow (pScreen); break; case SCREEN_SAVER_OFF: state = ScreenSaverOff; ret = DestroySaverWindow (pScreen); break; case SCREEN_SAVER_CYCLE: state = ScreenSaverCycle; pPriv = GetScreenPrivate (pScreen); if (pPriv && pPriv->hasWindow) ret = TRUE; } SendScreenSaverNotify (pScreen, state, force); return ret;}static intProcScreenSaverQueryVersion (client) register ClientPtr client;{ xScreenSaverQueryVersionReply rep; register int n; REQUEST_SIZE_MATCH (xScreenSaverQueryVersionReq); rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; rep.majorVersion = ScreenSaverMajorVersion; rep.minorVersion = ScreenSaverMinorVersion; if (client->swapped) { swaps(&rep.sequenceNumber, n); swapl(&rep.length, n); } WriteToClient(client, sizeof (xScreenSaverQueryVersionReply), (char *)&rep); return (client->noClientException);}intProcScreenSaverQueryInfo (client) register ClientPtr client;{ REQUEST(xScreenSaverQueryInfoReq); xScreenSaverQueryInfoReply rep; register int n; ScreenSaverStuffPtr pSaver; DrawablePtr pDraw; CARD32 lastInput; ScreenSaverScreenPrivatePtr pPriv; REQUEST_SIZE_MATCH (xScreenSaverQueryInfoReq); pDraw = (DrawablePtr) LookupDrawable (stuff->drawable, client); if (!pDraw) return BadDrawable; pSaver = &savedScreenInfo[pDraw->pScreen->myNum]; pPriv = GetScreenPrivate (pDraw->pScreen); UpdateCurrentTime (); lastInput = GetTimeInMillis() - lastDeviceEventTime.milliseconds; rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; rep.window = pSaver->wid; if (screenIsSaved != SCREEN_SAVER_OFF) { rep.state = ScreenSaverOn; if (ScreenSaverTime) rep.tilOrSince = lastInput - ScreenSaverTime; else rep.tilOrSince = 0; } else { if (ScreenSaverTime) { rep.state = ScreenSaverOff; if (ScreenSaverTime < lastInput) rep.tilOrSince = 0; else rep.tilOrSince = ScreenSaverTime - lastInput; } else { rep.state = ScreenSaverDisabled; rep.tilOrSince = 0; } } rep.idle = lastInput; rep.eventMask = getEventMask (pDraw->pScreen, client); if (pPriv && pPriv->attr) rep.kind = ScreenSaverExternal; else if (ScreenSaverBlanking != DontPreferBlanking) rep.kind = ScreenSaverBlanked; else rep.kind = ScreenSaverInternal; if (client->swapped) { swaps (&rep.sequenceNumber, n); swapl (&rep.length, n); swapl (&rep.window, n); swapl (&rep.tilOrSince, n); swapl (&rep.idle, n); swapl (&rep.eventMask, n); } WriteToClient(client, sizeof (xScreenSaverQueryInfoReply), (char *)&rep); return (client->noClientException);}static intProcScreenSaverSelectInput (client) register ClientPtr client;{ REQUEST(xScreenSaverSelectInputReq); DrawablePtr pDraw; REQUEST_SIZE_MATCH (xScreenSaverSelectInputReq); pDraw = (DrawablePtr) LookupDrawable (stuff->drawable, client); if (!pDraw) return BadDrawable; if (!setEventMask (pDraw->pScreen, client, stuff->eventMask)) return BadAlloc; return Success;}static intProcScreenSaverSetAttributes (client) register ClientPtr client;{ REQUEST(xScreenSaverSetAttributesReq); DrawablePtr pDraw; WindowPtr pParent; ScreenPtr pScreen; ScreenSaverScreenPrivatePtr pPriv = 0; ScreenSaverAttrPtr pAttr = 0; int ret; int len; int class, bw, depth; unsigned long visual; int idepth, ivisual; Bool fOK; DepthPtr pDepth; WindowOptPtr ancwopt; unsigned long *pVlist; unsigned long *values = 0; int valuei; unsigned long tmask, imask; unsigned long val; Pixmap pixID; PixmapPtr pPixmap; Cursor cursorID; CursorPtr pCursor; Colormap cmap; ColormapPtr pCmap; REQUEST_AT_LEAST_SIZE (xScreenSaverSetAttributesReq); pDraw = (DrawablePtr) LookupDrawable (stuff->drawable, client); if (!pDraw) return BadDrawable; pScreen = pDraw->pScreen; pParent = WindowTable[pScreen->myNum]; len = stuff->length - (sizeof(xScreenSaverSetAttributesReq) >> 2); if (Ones(stuff->mask) != len) return BadLength; if (!stuff->width || !stuff->height) { client->errorValue = 0; return BadValue; } switch (class = stuff->c_class) { case CopyFromParent: case InputOnly: case InputOutput: break; default: client->errorValue = class; return BadValue; } bw = stuff->borderWidth; depth = stuff->depth; visual = stuff->visualID; /* copied directly from CreateWindow */ if (class == CopyFromParent) class = pParent->drawable.class; if ((class != InputOutput) && (class != InputOnly)) { client->errorValue = class; return BadValue; } if ((class != InputOnly) && (pParent->drawable.class == InputOnly)) return BadMatch; if ((class == InputOnly) && ((bw != 0) || (depth != 0))) return BadMatch;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -