⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saver.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * $XConsortium: saver.c,v 1.12 94/04/17 20:59:36 dpw Exp $ * $XFree86: xc/programs/Xserver/Xext/saver.c,v 3.2 1996/06/10 09:11:17 dawes Exp $ *Copyright (c) 1992  X ConsortiumPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THEX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER INAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Except as contained in this notice, the name of the X Consortium shall not beused in advertising or otherwise to promote the sale, use or other dealingsin this Software without prior written authorization from the X Consortium. * * Author:  Keith Packard, MIT X Consortium */#define NEED_REPLIES#define NEED_EVENTS#include <stdio.h>#include "X.h"#include "Xproto.h"#include "misc.h"#include "os.h"#include "windowstr.h"#include "scrnintstr.h"#include "pixmapstr.h"#include "extnsionst.h"#include "dixstruct.h"#include "resource.h"#include "opaque.h"#include "saverproto.h"#include "gcstruct.h"#include "cursorstr.h"#include "colormapst.h"static unsigned char ScreenSaverReqCode = 0;static int ScreenSaverEventBase = 0;extern DISPATCH_PROC(ProcScreenSaverQueryInfo);static DISPATCH_PROC(ProcScreenSaverDispatch);static DISPATCH_PROC(ProcScreenSaverQueryVersion);static DISPATCH_PROC(ProcScreenSaverSelectInput);static DISPATCH_PROC(ProcScreenSaverSetAttributes);static DISPATCH_PROC(ProcScreenSaverUnsetAttributes);static DISPATCH_PROC(SProcScreenSaverDispatch);static DISPATCH_PROC(SProcScreenSaverQueryInfo);static DISPATCH_PROC(SProcScreenSaverQueryVersion);static DISPATCH_PROC(SProcScreenSaverSelectInput);static DISPATCH_PROC(SProcScreenSaverSetAttributes);static DISPATCH_PROC(SProcScreenSaverUnsetAttributes);static Bool ScreenSaverHandle (#if NeedFunctionPrototypes	ScreenPtr /* pScreen */,	int /* xstate */,	Bool /* force */#endif	);static BoolCreateSaverWindow (#if NeedFunctionPrototypes	ScreenPtr /* pScreen */#endif	);static BoolDestroySaverWindow (#if NeedFunctionPrototypes	ScreenPtr /* pScreen */#endif	);static voidUninstallSaverColormap (#if NeedFunctionPrototypes	ScreenPtr /* pScreen */#endif	);static voidCheckScreenPrivate (#if NeedFunctionPrototypes	ScreenPtr /* pScreen */#endif	);static void SScreenSaverNotifyEvent (#if NeedFunctionPrototypes	xScreenSaverNotifyEvent * /* from */,	xScreenSaverNotifyEvent * /* to */#endif	);static void ScreenSaverResetProc (#if NeedFunctionPrototypes	ExtensionEntry * /* extEntry */#endif	);extern WindowPtr    *WindowTable;/* * each screen has a list of clients requesting * ScreenSaverNotify events.  Each client has a resource * for each screen it selects ScreenSaverNotify input for, * this resource is used to delete the ScreenSaverNotifyRec * entry from the per-screen queue. */static RESTYPE EventType;   /* resource type for event masks */typedef struct _ScreenSaverEvent *ScreenSaverEventPtr;typedef struct _ScreenSaverEvent {    ScreenSaverEventPtr	next;    ClientPtr		client;    ScreenPtr		screen;    XID			resource;    CARD32		mask;} ScreenSaverEventRec;static int ScreenSaverFreeEvents(#if NeedFunctionPrototypes    pointer /* value */,    XID /* id */#endif);static Bool setEventMask (#if NeedFunctionPrototypes    ScreenPtr /* pScreen */,    ClientPtr /* client */,    unsigned long /* mask */#endif);static unsigned long getEventMask (#if NeedFunctionPrototypes    ScreenPtr /* pScreen */,    ClientPtr /* client */#endif);/* * when a client sets the screen saver attributes, a resource is * kept to be freed when the client exits */static RESTYPE AttrType;    /* resource type for attributes */typedef struct _ScreenSaverAttr {    ScreenPtr	    screen;    ClientPtr	    client;    XID		    resource;    short	    x, y;    unsigned short  width, height, borderWidth;    unsigned char   class;    unsigned char   depth;    VisualID	    visual;    CursorPtr	    pCursor;    PixmapPtr	    pBackgroundPixmap;    PixmapPtr	    pBorderPixmap;    Colormap	    colormap;    unsigned long   mask;		/* no pixmaps or cursors */    unsigned long   *values;} ScreenSaverAttrRec, *ScreenSaverAttrPtr;static int ScreenSaverFreeAttr (#if NeedFunctionPrototypes    pointer /* value */,    XID /* id */#endif);static void FreeAttrs (#if NeedFunctionPrototypes    ScreenSaverAttrPtr	/* pAttr */#endif);static void FreeScreenAttr (#if NeedFunctionPrototypes    ScreenSaverAttrPtr	/* pAttr */#endif);static voidSendScreenSaverNotify (#if NeedFunctionPrototypes    ScreenPtr /* pScreen */,    int /* state */,    Bool /* forced */#endif);typedef struct _ScreenSaverScreenPrivate {    ScreenSaverEventPtr	    events;    ScreenSaverAttrPtr	    attr;    Bool		    hasWindow;    Colormap		    installedMap;} ScreenSaverScreenPrivateRec, *ScreenSaverScreenPrivatePtr;static ScreenSaverScreenPrivatePtrMakeScreenPrivate (#if NeedFunctionPrototypes	ScreenPtr /* pScreen */#endif	);static int ScreenPrivateIndex;#define GetScreenPrivate(s) ((ScreenSaverScreenPrivatePtr)(s)->devPrivates[ScreenPrivateIndex].ptr)#define SetScreenPrivate(s,v) ((s)->devPrivates[ScreenPrivateIndex].ptr = (pointer) v);#define SetupScreen(s)	ScreenSaverScreenPrivatePtr pPriv = GetScreenPrivate(s)#define New(t)	((t *) xalloc (sizeof (t)))/**************** * ScreenSaverExtensionInit * * Called from InitExtensions in main() or from QueryExtension() if the * extension is dynamically loaded. * ****************/voidScreenSaverExtensionInit(){    ExtensionEntry *extEntry;    int		    i;    ScreenPtr	    pScreen;    AttrType = CreateNewResourceType(ScreenSaverFreeAttr);    EventType = CreateNewResourceType(ScreenSaverFreeEvents);    ScreenPrivateIndex = AllocateScreenPrivateIndex ();    for (i = 0; i < screenInfo.numScreens; i++)    {	pScreen = screenInfo.screens[i];	SetScreenPrivate (pScreen, NULL);    }    if (AttrType && EventType && ScreenPrivateIndex != -1 &&	(extEntry = AddExtension(ScreenSaverName, ScreenSaverNumberEvents, 0,				 ProcScreenSaverDispatch, SProcScreenSaverDispatch,				 ScreenSaverResetProc, StandardMinorOpcode)))    {	ScreenSaverReqCode = (unsigned char)extEntry->base;	ScreenSaverEventBase = extEntry->eventBase;	EventSwapVector[ScreenSaverEventBase] = (EventSwapPtr) SScreenSaverNotifyEvent;    }}/*ARGSUSED*/static voidScreenSaverResetProc (extEntry)ExtensionEntry	*extEntry;{}static voidCheckScreenPrivate (pScreen)    ScreenPtr	pScreen;{    SetupScreen (pScreen);    if (!pPriv)	return;    if (!pPriv->attr && !pPriv->events &&	!pPriv->hasWindow && pPriv->installedMap == None)    {	xfree (pPriv);	SetScreenPrivate (pScreen, NULL);	savedScreenInfo[pScreen->myNum].ExternalScreenSaver = NULL;    }}static ScreenSaverScreenPrivatePtrMakeScreenPrivate (pScreen)    ScreenPtr	pScreen;{    SetupScreen (pScreen);    if (pPriv)	return pPriv;    pPriv = New (ScreenSaverScreenPrivateRec);    if (!pPriv)	return 0;    pPriv->events = 0;    pPriv->attr = 0;    pPriv->hasWindow = FALSE;    pPriv->installedMap = None;    SetScreenPrivate (pScreen, pPriv);    savedScreenInfo[pScreen->myNum].ExternalScreenSaver = ScreenSaverHandle;    return pPriv;}static unsigned longgetEventMask (pScreen, client)    ScreenPtr	pScreen;    ClientPtr	client;{    SetupScreen(pScreen);    ScreenSaverEventPtr	pEv;    if (!pPriv)	return 0;    for (pEv = pPriv->events; pEv; pEv = pEv->next)	if (pEv->client == client)	    return pEv->mask;    return 0;}static BoolsetEventMask (pScreen, client, mask)    ScreenPtr	pScreen;    ClientPtr	client;    unsigned long   mask;{    SetupScreen(pScreen);    ScreenSaverEventPtr	pEv, *pPrev;    if (getEventMask (pScreen, client) == mask)	return TRUE;    if (!pPriv)    {	pPriv = MakeScreenPrivate (pScreen);	if (!pPriv)	    return FALSE;    }    for (pPrev = &pPriv->events; (pEv = *pPrev) != 0; pPrev = &pEv->next)	if (pEv->client == client)	    break;    if (mask == 0)    {	FreeResource (pEv->resource, EventType);	*pPrev = pEv->next;	xfree (pEv);	CheckScreenPrivate (pScreen);    }    else    {    	if (!pEv)     	{	    pEv = New (ScreenSaverEventRec);	    if (!pEv) 	    {		CheckScreenPrivate (pScreen);	    	return FALSE;	    }    	    *pPrev = pEv;    	    pEv->next = NULL;    	    pEv->client = client;    	    pEv->screen = pScreen;    	    pEv->resource = FakeClientID (client->index);	    if (!AddResource (pEv->resource, EventType, (pointer) pEv))		return FALSE;    	}	pEv->mask = mask;    }    return TRUE;}static voidFreeAttrs (pAttr)    ScreenSaverAttrPtr	pAttr;{    PixmapPtr	    pPixmap;    CursorPtr	    pCursor;    if ((pPixmap = pAttr->pBackgroundPixmap) != 0)	(*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);    if ((pPixmap = pAttr->pBorderPixmap) != 0)	(*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);    if ((pCursor = pAttr->pCursor) != 0)	FreeCursor (pCursor, (Cursor) 0);}static voidFreeScreenAttr (pAttr)    ScreenSaverAttrPtr	pAttr;{    FreeAttrs (pAttr);    xfree (pAttr->values);    xfree (pAttr);}static intScreenSaverFreeEvents (value, id)    pointer value;    XID id;{    ScreenSaverEventPtr	pOld = (ScreenSaverEventPtr)value;    ScreenPtr pScreen = pOld->screen;    SetupScreen (pScreen);    ScreenSaverEventPtr	pEv, *pPrev;    if (!pPriv)	return TRUE;    for (pPrev = &pPriv->events; (pEv = *pPrev) != 0; pPrev = &pEv->next)	if (pEv == pOld)	    break;    if (!pEv)	return TRUE;    *pPrev = pEv->next;    xfree (pEv);    CheckScreenPrivate (pScreen);    return TRUE;}static intScreenSaverFreeAttr (value, id)    pointer value;    XID id;{    ScreenSaverAttrPtr	pOldAttr = (ScreenSaverAttrPtr)value;    ScreenPtr	pScreen = pOldAttr->screen;    SetupScreen (pScreen);    if (!pPriv)	return TRUE;    if (pPriv->attr != pOldAttr)	return TRUE;    FreeScreenAttr (pOldAttr);    pPriv->attr = NULL;    if (pPriv->hasWindow)    {	SaveScreens (SCREEN_SAVER_FORCER, ScreenSaverReset);	SaveScreens (SCREEN_SAVER_FORCER, ScreenSaverActive);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -