Unverified Commit aecdb526 authored by Mihai Moldovan's avatar Mihai Moldovan

Merge branch 'uli42-pr/update_xext' into 3.6.x

parents cbdae3b7 5ec2366c
/* /*
* $XConsortium: saver.h,v 1.5 94/04/17 20:59:33 rws Exp $
*
Copyright (c) 1992 X Consortium Copyright (c) 1992 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
...@@ -37,7 +35,7 @@ in this Software without prior written authorization from the X Consortium. ...@@ -37,7 +35,7 @@ in this Software without prior written authorization from the X Consortium.
#define ScreenSaverCycleMask 0x00000002 #define ScreenSaverCycleMask 0x00000002
#define ScreenSaverMajorVersion 1 #define ScreenSaverMajorVersion 1
#define ScreenSaverMinorVersion 0 #define ScreenSaverMinorVersion 1
#define ScreenSaverOff 0 #define ScreenSaverOff 0
#define ScreenSaverOn 1 #define ScreenSaverOn 1
......
/* /*
* $XConsortium: saverproto.h,v 1.5 94/04/17 20:59:33 keith Exp $
*
Copyright (c) 1992 X Consortium Copyright (c) 1992 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
...@@ -26,7 +24,6 @@ in this Software without prior written authorization from the X Consortium. ...@@ -26,7 +24,6 @@ in this Software without prior written authorization from the X Consortium.
* *
* Author: Keith Packard, MIT X Consortium * Author: Keith Packard, MIT X Consortium
*/ */
/* $XFree86$ */
#ifndef _SAVERPROTO_H_ #ifndef _SAVERPROTO_H_
#define _SAVERPROTO_H_ #define _SAVERPROTO_H_
...@@ -136,6 +133,16 @@ typedef struct _ScreenSaverUnsetAttributes { ...@@ -136,6 +133,16 @@ typedef struct _ScreenSaverUnsetAttributes {
} xScreenSaverUnsetAttributesReq; } xScreenSaverUnsetAttributesReq;
#define sz_xScreenSaverUnsetAttributesReq 8 #define sz_xScreenSaverUnsetAttributesReq 8
#define X_ScreenSaverSuspend 5
typedef struct _ScreenSaverSuspend {
CARD8 reqType;
CARD8 saverReqType;
CARD16 length B16;
Bool suspend B32;
} xScreenSaverSuspendReq;
#define sz_xScreenSaverSuspendReq 8
typedef struct _ScreenSaverNotify { typedef struct _ScreenSaverNotify {
CARD8 type; /* always eventBase + ScreenSaverNotify */ CARD8 type; /* always eventBase + ScreenSaverNotify */
BYTE state; /* off, on, cycle */ BYTE state; /* off, on, cycle */
......
...@@ -183,12 +183,12 @@ ProcDPMSSetTimeouts(client) ...@@ -183,12 +183,12 @@ ProcDPMSSetTimeouts(client)
client->errorValue = stuff->suspend; client->errorValue = stuff->suspend;
return BadValue; return BadValue;
} }
DPMSStandbyTime = stuff->standby * MILLI_PER_SECOND; DPMSStandbyTime = stuff->standby * MILLI_PER_SECOND;
DPMSSuspendTime = stuff->suspend * MILLI_PER_SECOND; DPMSSuspendTime = stuff->suspend * MILLI_PER_SECOND;
DPMSOffTime = stuff->off * MILLI_PER_SECOND; DPMSOffTime = stuff->off * MILLI_PER_SECOND;
SetDPMSTimers(); SetScreenSaverTimer();
return(client->noClientException); return(client->noClientException);
} }
......
...@@ -72,10 +72,10 @@ static unsigned char PanoramiXReqCode = 0; ...@@ -72,10 +72,10 @@ static unsigned char PanoramiXReqCode = 0;
int PanoramiXPixWidth = 0; int PanoramiXPixWidth = 0;
int PanoramiXPixHeight = 0; int PanoramiXPixHeight = 0;
int PanoramiXNumScreens = 0; _X_EXPORT int PanoramiXNumScreens = 0;
PanoramiXData *panoramiXdataPtr = NULL; _X_EXPORT PanoramiXData *panoramiXdataPtr = NULL;
RegionRec PanoramiXScreenRegion = {{0, 0, 0, 0}, NULL}; RegionRec PanoramiXScreenRegion = {{0, 0, 0, 0}, NULL};
static int PanoramiXNumDepths; static int PanoramiXNumDepths;
static DepthPtr PanoramiXDepths; static DepthPtr PanoramiXDepths;
...@@ -83,13 +83,13 @@ static int PanoramiXNumVisuals; ...@@ -83,13 +83,13 @@ static int PanoramiXNumVisuals;
static VisualPtr PanoramiXVisuals; static VisualPtr PanoramiXVisuals;
/* We support at most 256 visuals */ /* We support at most 256 visuals */
XID *PanoramiXVisualTable = NULL; _X_EXPORT XID *PanoramiXVisualTable = NULL;
unsigned long XRC_DRAWABLE; _X_EXPORT unsigned long XRC_DRAWABLE;
unsigned long XRT_WINDOW; _X_EXPORT unsigned long XRT_WINDOW;
unsigned long XRT_PIXMAP; _X_EXPORT unsigned long XRT_PIXMAP;
unsigned long XRT_GC; _X_EXPORT unsigned long XRT_GC;
unsigned long XRT_COLORMAP; _X_EXPORT unsigned long XRT_COLORMAP;
/* /*
* Function prototypes * Function prototypes
...@@ -330,7 +330,7 @@ XineramaDestroyClip(GCPtr pGC) ...@@ -330,7 +330,7 @@ XineramaDestroyClip(GCPtr pGC)
int _X_EXPORT int
XineramaDeleteResource(void * data, XID id) XineramaDeleteResource(void * data, XID id)
{ {
free(data); free(data);
...@@ -411,7 +411,7 @@ typedef struct _connect_callback_list { ...@@ -411,7 +411,7 @@ typedef struct _connect_callback_list {
static XineramaConnectionCallbackList *ConnectionCallbackList = NULL; static XineramaConnectionCallbackList *ConnectionCallbackList = NULL;
Bool _X_EXPORT Bool
XineramaRegisterConnectionBlockCallback(void (*func)(void)) XineramaRegisterConnectionBlockCallback(void (*func)(void))
{ {
XineramaConnectionCallbackList *newlist; XineramaConnectionCallbackList *newlist;
...@@ -1037,7 +1037,16 @@ ProcXineramaIsActive(ClientPtr client) ...@@ -1037,7 +1037,16 @@ ProcXineramaIsActive(ClientPtr client)
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
#if 1
{
/* The following hack fools clients into thinking that Xinerama
* is disabled even though it is not. */
extern Bool PanoramiXExtensionDisabledHack;
rep.state = !noPanoramiXExtension && !PanoramiXExtensionDisabledHack;
}
#else
rep.state = !noPanoramiXExtension; rep.state = !noPanoramiXExtension;
#endif
if (client->swapped) { if (client->swapped) {
swaps (&rep.sequenceNumber); swaps (&rep.sequenceNumber);
swapl (&rep.length); swapl (&rep.length);
......
...@@ -51,7 +51,10 @@ in this Software without prior written authorization from the X Consortium. ...@@ -51,7 +51,10 @@ in this Software without prior written authorization from the X Consortium.
#include "panoramiX.h" #include "panoramiX.h"
#include "panoramiXsrv.h" #include "panoramiXsrv.h"
#endif #endif
#ifdef DPMSExtension
#define DPMS_SERVER
#include <nx-X11/extensions/dpms.h>
#endif
#include <stdio.h> #include <stdio.h>
...@@ -68,12 +71,14 @@ static DISPATCH_PROC(ProcScreenSaverQueryVersion); ...@@ -68,12 +71,14 @@ static DISPATCH_PROC(ProcScreenSaverQueryVersion);
static DISPATCH_PROC(ProcScreenSaverSelectInput); static DISPATCH_PROC(ProcScreenSaverSelectInput);
static DISPATCH_PROC(ProcScreenSaverSetAttributes); static DISPATCH_PROC(ProcScreenSaverSetAttributes);
static DISPATCH_PROC(ProcScreenSaverUnsetAttributes); static DISPATCH_PROC(ProcScreenSaverUnsetAttributes);
static DISPATCH_PROC(ProcScreenSaverSuspend);
static DISPATCH_PROC(SProcScreenSaverDispatch); static DISPATCH_PROC(SProcScreenSaverDispatch);
static DISPATCH_PROC(SProcScreenSaverQueryInfo); static DISPATCH_PROC(SProcScreenSaverQueryInfo);
static DISPATCH_PROC(SProcScreenSaverQueryVersion); static DISPATCH_PROC(SProcScreenSaverQueryVersion);
static DISPATCH_PROC(SProcScreenSaverSelectInput); static DISPATCH_PROC(SProcScreenSaverSelectInput);
static DISPATCH_PROC(SProcScreenSaverSetAttributes); static DISPATCH_PROC(SProcScreenSaverSetAttributes);
static DISPATCH_PROC(SProcScreenSaverUnsetAttributes); static DISPATCH_PROC(SProcScreenSaverUnsetAttributes);
static DISPATCH_PROC(SProcScreenSaverSuspend);
static Bool ScreenSaverHandle ( static Bool ScreenSaverHandle (
ScreenPtr /* pScreen */, ScreenPtr /* pScreen */,
...@@ -110,6 +115,32 @@ static void ScreenSaverResetProc ( ...@@ -110,6 +115,32 @@ static void ScreenSaverResetProc (
ExtensionEntry * /* extEntry */ ExtensionEntry * /* extEntry */
); );
static RESTYPE SuspendType; /* resource type for suspension records */
typedef struct _ScreenSaverSuspension *ScreenSaverSuspensionPtr;
/* List of clients that are suspending the screensaver. */
static ScreenSaverSuspensionPtr suspendingClients = NULL;
/*
* clientResource is a resource ID that's added when the record is
* allocated, so the record is freed and the screensaver resumed when
* the client disconnects. count is the number of times the client has
* requested the screensaver be suspended.
*/
typedef struct _ScreenSaverSuspension
{
ScreenSaverSuspensionPtr next;
ClientPtr pClient;
XID clientResource;
int count;
} ScreenSaverSuspensionRec;
static int ScreenSaverFreeSuspend(
pointer /*value */,
XID /* id */
);
/* /*
* each screen has a list of clients requesting * each screen has a list of clients requesting
* ScreenSaverNotify events. Each client has a resource * ScreenSaverNotify events. Each client has a resource
...@@ -227,13 +258,15 @@ ScreenSaverExtensionInit(void) ...@@ -227,13 +258,15 @@ ScreenSaverExtensionInit(void)
AttrType = CreateNewResourceType(ScreenSaverFreeAttr); AttrType = CreateNewResourceType(ScreenSaverFreeAttr);
EventType = CreateNewResourceType(ScreenSaverFreeEvents); EventType = CreateNewResourceType(ScreenSaverFreeEvents);
SuspendType = CreateNewResourceType(ScreenSaverFreeSuspend);
ScreenPrivateIndex = AllocateScreenPrivateIndex (); ScreenPrivateIndex = AllocateScreenPrivateIndex ();
for (i = 0; i < screenInfo.numScreens; i++) for (i = 0; i < screenInfo.numScreens; i++)
{ {
pScreen = screenInfo.screens[i]; pScreen = screenInfo.screens[i];
SetScreenPrivate (pScreen, NULL); SetScreenPrivate (pScreen, NULL);
} }
if (AttrType && EventType && ScreenPrivateIndex != -1 && if (AttrType && EventType && SuspendType && ScreenPrivateIndex != -1 &&
(extEntry = AddExtension(ScreenSaverName, ScreenSaverNumberEvents, 0, (extEntry = AddExtension(ScreenSaverName, ScreenSaverNumberEvents, 0,
ProcScreenSaverDispatch, SProcScreenSaverDispatch, ProcScreenSaverDispatch, SProcScreenSaverDispatch,
ScreenSaverResetProc, StandardMinorOpcode))) ScreenSaverResetProc, StandardMinorOpcode)))
...@@ -427,6 +460,45 @@ ScreenSaverFreeAttr (value, id) ...@@ -427,6 +460,45 @@ ScreenSaverFreeAttr (value, id)
return TRUE; return TRUE;
} }
static int
ScreenSaverFreeSuspend (pointer value, XID id)
{
ScreenSaverSuspensionPtr data = (ScreenSaverSuspensionPtr) value;
ScreenSaverSuspensionPtr *prev, this;
/* Unlink and free the suspension record for the client */
for (prev = &suspendingClients; (this = *prev); prev = &this->next)
{
if (this == data)
{
*prev = this->next;
free (this);
break;
}
}
/* Reenable the screensaver if this was the last client suspending it. */
if (screenSaverSuspended && suspendingClients == NULL)
{
screenSaverSuspended = FALSE;
/* The screensaver could be active, since suspending it (by design)
doesn't prevent it from being forceably activated */
#ifdef DPMSExtension
if (screenIsSaved != SCREEN_SAVER_ON && DPMSPowerLevel == DPMSModeOn)
#else
if (screenIsSaved != SCREEN_SAVER_ON)
#endif
{
UpdateCurrentTimeIf();
lastDeviceEventTime = currentTime;
SetScreenSaverTimer();
}
}
return Success;
}
static void static void
SendScreenSaverNotify (pScreen, state, forced) SendScreenSaverNotify (pScreen, state, forced)
ScreenPtr pScreen; ScreenPtr pScreen;
...@@ -1286,12 +1358,73 @@ ProcScreenSaverUnsetAttributes (ClientPtr client) ...@@ -1286,12 +1358,73 @@ ProcScreenSaverUnsetAttributes (ClientPtr client)
return ScreenSaverUnsetAttributes(client); return ScreenSaverUnsetAttributes(client);
} }
static int
ProcScreenSaverSuspend (ClientPtr client)
{
ScreenSaverSuspensionPtr *prev, this;
REQUEST(xScreenSaverSuspendReq);
REQUEST_SIZE_MATCH(xScreenSaverSuspendReq);
/* Check if this client is suspending the screensaver */
for (prev = &suspendingClients; (this = *prev); prev = &this->next)
if (this->pClient == client)
break;
if (this)
{
if (stuff->suspend == TRUE)
this->count++;
else if (--this->count == 0)
FreeResource (this->clientResource, RT_NONE);
return Success;
}
/* If we get to this point, this client isn't suspending the screensaver */
if (stuff->suspend == FALSE)
return Success;
/*
* Allocate a suspension record for the client, and stop the screensaver
* if it isn't already suspended by another client. We attach a resource ID
* to the record, so the screensaver will be reenabled and the record freed
* if the client disconnects without reenabling it first.
*/
this = (ScreenSaverSuspensionPtr) malloc (sizeof (ScreenSaverSuspensionRec));
if (!this)
return BadAlloc;
memset(this, 0, sizeof (ScreenSaverSuspensionRec));
this->next = NULL;
this->pClient = client;
this->count = 1;
this->clientResource = FakeClientID (client->index);
if (!AddResource (this->clientResource, SuspendType, (pointer) this))
{
free (this);
return BadAlloc;
}
*prev = this;
if (!screenSaverSuspended)
{
screenSaverSuspended = TRUE;
FreeScreenSaverTimer();
}
return (client->noClientException);
}
static DISPATCH_PROC((*NormalVector[])) = { static DISPATCH_PROC((*NormalVector[])) = {
ProcScreenSaverQueryVersion, ProcScreenSaverQueryVersion,
ProcScreenSaverQueryInfo, ProcScreenSaverQueryInfo,
ProcScreenSaverSelectInput, ProcScreenSaverSelectInput,
ProcScreenSaverSetAttributes, ProcScreenSaverSetAttributes,
ProcScreenSaverUnsetAttributes, ProcScreenSaverUnsetAttributes,
ProcScreenSaverSuspend,
}; };
#define NUM_REQUESTS ((sizeof NormalVector) / (sizeof NormalVector[0])) #define NUM_REQUESTS ((sizeof NormalVector) / (sizeof NormalVector[0]))
...@@ -1375,12 +1508,24 @@ SProcScreenSaverUnsetAttributes (client) ...@@ -1375,12 +1508,24 @@ SProcScreenSaverUnsetAttributes (client)
return ProcScreenSaverUnsetAttributes (client); return ProcScreenSaverUnsetAttributes (client);
} }
static int
SProcScreenSaverSuspend (ClientPtr client)
{
REQUEST(xScreenSaverSuspendReq);
swaps(&stuff->length);
REQUEST_SIZE_MATCH(xScreenSaverSuspendReq);
swapl(&stuff->suspend);
return ProcScreenSaverSuspend (client);
}
static DISPATCH_PROC((*SwappedVector[])) = { static DISPATCH_PROC((*SwappedVector[])) = {
SProcScreenSaverQueryVersion, SProcScreenSaverQueryVersion,
SProcScreenSaverQueryInfo, SProcScreenSaverQueryInfo,
SProcScreenSaverSelectInput, SProcScreenSaverSelectInput,
SProcScreenSaverSetAttributes, SProcScreenSaverSetAttributes,
SProcScreenSaverUnsetAttributes, SProcScreenSaverUnsetAttributes,
SProcScreenSaverSuspend,
}; };
static int static int
......
...@@ -78,7 +78,7 @@ static void SertafiedWakeupHandler( ...@@ -78,7 +78,7 @@ static void SertafiedWakeupHandler(
void * /* LastSelectMask */ void * /* LastSelectMask */
); );
int _X_EXPORT int
ClientSleepUntil (client, revive, notifyFunc, closure) ClientSleepUntil (client, revive, notifyFunc, closure)
ClientPtr client; ClientPtr client;
TimeStamp *revive; TimeStamp *revive;
......
...@@ -296,14 +296,18 @@ static void ...@@ -296,14 +296,18 @@ static void
SyncDeleteTriggerFromCounter(pTrigger) SyncDeleteTriggerFromCounter(pTrigger)
SyncTrigger *pTrigger; SyncTrigger *pTrigger;
{ {
SyncTriggerList *pCur, *pPrev = NULL; SyncTriggerList *pCur;
SyncTriggerList *pPrev;
/* pCounter needs to be stored in pTrigger before calling here. */ /* pCounter needs to be stored in pTrigger before calling here. */
if (!pTrigger->pCounter) if (!pTrigger->pCounter)
return; return;
for (pCur = pTrigger->pCounter->pTriglist; pCur; pCur = pCur->next) pPrev = NULL;
pCur = pTrigger->pCounter->pTriglist;
while (pCur)
{ {
if (pCur->pTrigger == pTrigger) if (pCur->pTrigger == pTrigger)
{ {
...@@ -311,9 +315,13 @@ SyncDeleteTriggerFromCounter(pTrigger) ...@@ -311,9 +315,13 @@ SyncDeleteTriggerFromCounter(pTrigger)
pPrev->next = pCur->next; pPrev->next = pCur->next;
else else
pTrigger->pCounter->pTriglist = pCur->next; pTrigger->pCounter->pTriglist = pCur->next;
free(pCur); free(pCur);
break; break;
} }
pPrev = pCur;
pCur = pCur->next;
} }
if (IsSystemCounter(pTrigger->pCounter)) if (IsSystemCounter(pTrigger->pCounter))
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include <dix-config.h> #include <dix-config.h>
#endif #endif
#include <stdio.h>
#include <string.h>
#include <nx-X11/X.h> #include <nx-X11/X.h>
#include <nx-X11/Xproto.h> #include <nx-X11/Xproto.h>
#include "misc.h" #include "misc.h"
...@@ -206,7 +208,7 @@ ProcXResQueryClientPixmapBytes (ClientPtr client) ...@@ -206,7 +208,7 @@ ProcXResQueryClientPixmapBytes (ClientPtr client)
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
rep.length = 0; rep.length = 0;
rep.bytes = bytes; rep.bytes = bytes;
#ifdef XSERVER64 #ifdef _XSERVER64
rep.bytes_overflow = bytes >> 32; rep.bytes_overflow = bytes >> 32;
#else #else
rep.bytes_overflow = 0; rep.bytes_overflow = 0;
......
...@@ -253,7 +253,7 @@ CreateResourceTypes() ...@@ -253,7 +253,7 @@ CreateResourceTypes()
} }
int _X_EXPORT int
XvScreenInit(ScreenPtr pScreen) XvScreenInit(ScreenPtr pScreen)
{ {
XvScreenPtr pxvs; XvScreenPtr pxvs;
...@@ -333,13 +333,13 @@ XvResetProc(ExtensionEntry* extEntry) ...@@ -333,13 +333,13 @@ XvResetProc(ExtensionEntry* extEntry)
{ {
} }
int _X_EXPORT int
XvGetScreenIndex() XvGetScreenIndex()
{ {
return XvScreenIndex; return XvScreenIndex;
} }
unsigned long _X_EXPORT unsigned long
XvGetRTPort() XvGetRTPort()
{ {
return XvRTPort; return XvRTPort;
......
...@@ -132,7 +132,7 @@ NormalLibraryTarget(dix,$(OBJS)) ...@@ -132,7 +132,7 @@ NormalLibraryTarget(dix,$(OBJS))
LintLibraryTarget(dix,$(SRCS) $(XPSRC)) LintLibraryTarget(dix,$(SRCS) $(XPSRC))
NormalLintTarget($(SRCS) $(XPSRC)) NormalLintTarget($(SRCS) $(XPSRC))
SpecialCObjectRule(globals,$(ICONFIGFILES),$(SITE_DEFINES)) SpecialCObjectRule(globals,$(ICONFIGFILES),$(SITE_DEFINES) $(EXT_DEFINES))
SpecialCObjectRule(main,$(ICONFIGFILES),$(VENDOR_DEFINES)) SpecialCObjectRule(main,$(ICONFIGFILES),$(VENDOR_DEFINES))
SpecialCObjectRule(pixmap,$(ICONFIGFILES),$(_NOOP_)) SpecialCObjectRule(pixmap,$(ICONFIGFILES),$(_NOOP_))
SpecialCObjectRule(privates,$(ICONFIGFILES),$(_NOOP_)) SpecialCObjectRule(privates,$(ICONFIGFILES),$(_NOOP_))
......
...@@ -127,6 +127,10 @@ int defaultScreenSaverAllowExposures = DEFAULT_SCREEN_SAVER_EXPOSURES; ...@@ -127,6 +127,10 @@ int defaultScreenSaverAllowExposures = DEFAULT_SCREEN_SAVER_EXPOSURES;
int logoScreenSaver = DEFAULT_LOGO_SCREEN_SAVER; int logoScreenSaver = DEFAULT_LOGO_SCREEN_SAVER;
#endif #endif
#ifdef SCREENSAVER
Bool screenSaverSuspended = FALSE;
#endif
char *defaultFontPath = COMPILEDDEFAULTFONTPATH; char *defaultFontPath = COMPILEDDEFAULTFONTPATH;
char *defaultTextFont = COMPILEDDEFAULTFONT; char *defaultTextFont = COMPILEDDEFAULTFONT;
char *defaultCursorFont = COMPILEDCURSORFONT; char *defaultCursorFont = COMPILEDCURSORFONT;
......
...@@ -335,9 +335,6 @@ main(int argc, char *argv[], char *envp[]) ...@@ -335,9 +335,6 @@ main(int argc, char *argv[], char *envp[])
InitRootWindow(screenInfo.screens[i]->root); InitRootWindow(screenInfo.screens[i]->root);
DefineInitialRootWindow(screenInfo.screens[0]->root); DefineInitialRootWindow(screenInfo.screens[0]->root);
SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset); SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
#ifdef DPMSExtension
SetDPMSTimers();
#endif
#ifdef PANORAMIX #ifdef PANORAMIX
if (!noPanoramiXExtension) { if (!noPanoramiXExtension) {
...@@ -387,9 +384,6 @@ main(int argc, char *argv[], char *envp[]) ...@@ -387,9 +384,6 @@ main(int argc, char *argv[], char *envp[])
} }
FreeFonts(); FreeFonts();
#ifdef DPMSExtension
FreeDPMSTimers();
#endif
FreeAuditTimer(); FreeAuditTimer();
ReleaseClientIds(serverClient); ReleaseClientIds(serverClient);
......
...@@ -11,6 +11,10 @@ extern CARD32 defaultScreenSaverInterval; ...@@ -11,6 +11,10 @@ extern CARD32 defaultScreenSaverInterval;
extern CARD32 ScreenSaverTime; extern CARD32 ScreenSaverTime;
extern CARD32 ScreenSaverInterval; extern CARD32 ScreenSaverInterval;
#ifdef SCREENSAVER
extern Bool screenSaverSuspended;
#endif
extern char *defaultFontPath; extern char *defaultFontPath;
extern int monitorResolution; extern int monitorResolution;
extern Bool loadableFonts; extern Bool loadableFonts;
......
...@@ -701,26 +701,89 @@ TimerInit(void) ...@@ -701,26 +701,89 @@ TimerInit(void)
} }
} }
#ifdef DPMSExtension
#define DPMS_CHECK_MODE(mode,time)\
if (time > 0 && DPMSPowerLevel < mode && timeout >= time)\
DPMSSet(mode);
#define DPMS_CHECK_TIMEOUT(time)\
if (time > 0 && (time - timeout) > 0)\
return time - timeout;
static CARD32
NextDPMSTimeout(INT32 timeout)
{
/*
* Return the amount of time remaining until we should set
* the next power level. Fallthroughs are intentional.
*/
switch (DPMSPowerLevel)
{
case DPMSModeOn:
DPMS_CHECK_TIMEOUT(DPMSStandbyTime)
case DPMSModeStandby:
DPMS_CHECK_TIMEOUT(DPMSSuspendTime)
case DPMSModeSuspend:
DPMS_CHECK_TIMEOUT(DPMSOffTime)
default: /* DPMSModeOff */
return 0;
}
}
#endif /* DPMSExtension */
static CARD32 static CARD32
ScreenSaverTimeoutExpire(OsTimerPtr timer,CARD32 now,void * arg) ScreenSaverTimeoutExpire(OsTimerPtr timer,CARD32 now,void * arg)
{ {
INT32 timeout = now - lastDeviceEventTime.milliseconds; INT32 timeout = now - lastDeviceEventTime.milliseconds;
CARD32 nextTimeout = 0;
#ifdef DPMSExtension
/*
* Check each mode lowest to highest, since a lower mode can
* have the same timeout as a higher one.
*/
if (DPMSEnabled)
{
DPMS_CHECK_MODE(DPMSModeOff, DPMSOffTime)
DPMS_CHECK_MODE(DPMSModeSuspend, DPMSSuspendTime)
DPMS_CHECK_MODE(DPMSModeStandby, DPMSStandbyTime)
if (timeout < ScreenSaverTime) { nextTimeout = NextDPMSTimeout(timeout);
return ScreenSaverTime - timeout; }
/*
* Only do the screensaver checks if we're not in a DPMS
* power saving mode
*/
if (DPMSPowerLevel != DPMSModeOn)
return nextTimeout;
#endif /* DPMSExtension */
if (!ScreenSaverTime)
return nextTimeout;
if (timeout < ScreenSaverTime)
{
return nextTimeout > 0 ?
MIN(ScreenSaverTime - timeout, nextTimeout) :
ScreenSaverTime - timeout;
} }
ResetOsBuffers(); /* not ideal, but better than nothing */ ResetOsBuffers(); /* not ideal, but better than nothing */
SaveScreens(SCREEN_SAVER_ON, ScreenSaverActive); SaveScreens(SCREEN_SAVER_ON, ScreenSaverActive);
#ifdef DPMSExtension
if (ScreenSaverInterval > 0 && DPMSPowerLevel == DPMSModeOn)
#else
if (ScreenSaverInterval > 0) if (ScreenSaverInterval > 0)
#endif /* DPMSExtension */ {
return ScreenSaverInterval; nextTimeout = nextTimeout > 0 ?
MIN(ScreenSaverInterval, nextTimeout) :
ScreenSaverInterval;
}
return 0; return nextTimeout;
} }
static OsTimerPtr ScreenSaverTimer = NULL; static OsTimerPtr ScreenSaverTimer = NULL;
...@@ -737,93 +800,41 @@ FreeScreenSaverTimer(void) ...@@ -737,93 +800,41 @@ FreeScreenSaverTimer(void)
void void
SetScreenSaverTimer(void) SetScreenSaverTimer(void)
{ {
if (ScreenSaverTime > 0) { CARD32 timeout = 0;
ScreenSaverTimer = TimerSet(ScreenSaverTimer, 0, ScreenSaverTime,
ScreenSaverTimeoutExpire, NULL);
} else if (ScreenSaverTimer) {
FreeScreenSaverTimer();
}
}
#ifdef DPMSExtension #ifdef DPMSExtension
if (DPMSEnabled)
static OsTimerPtr DPMSStandbyTimer = NULL; {
static OsTimerPtr DPMSSuspendTimer = NULL; /*
static OsTimerPtr DPMSOffTimer = NULL; * A higher DPMS level has a timeout that's either less
* than or equal to that of a lower DPMS level.
static CARD32 */
DPMSStandbyTimerExpire(OsTimerPtr timer,CARD32 now,void * arg) if (DPMSStandbyTime > 0)
{ timeout = DPMSStandbyTime;
INT32 timeout = now - lastDeviceEventTime.milliseconds;
else if (DPMSSuspendTime > 0)
if (timeout < DPMSStandbyTime) { timeout = DPMSSuspendTime;
return DPMSStandbyTime - timeout;
} else if (DPMSOffTime > 0)
if (DPMSPowerLevel < DPMSModeStandby) { timeout = DPMSOffTime;
if (DPMSEnabled)
DPMSSet(DPMSModeStandby);
}
return DPMSStandbyTime;
}
static CARD32
DPMSSuspendTimerExpire(OsTimerPtr timer,CARD32 now,void * arg)
{
INT32 timeout = now - lastDeviceEventTime.milliseconds;
if (timeout < DPMSSuspendTime) {
return DPMSSuspendTime - timeout;
}
if (DPMSPowerLevel < DPMSModeSuspend) {
if (DPMSEnabled)
DPMSSet(DPMSModeSuspend);
}
return DPMSSuspendTime;
}
static CARD32
DPMSOffTimerExpire(OsTimerPtr timer,CARD32 now,void * arg)
{
INT32 timeout = now - lastDeviceEventTime.milliseconds;
if (timeout < DPMSOffTime) {
return DPMSOffTime - timeout;
}
if (DPMSPowerLevel < DPMSModeOff) {
if (DPMSEnabled)
DPMSSet(DPMSModeOff);
} }
return DPMSOffTime; #endif
}
void if (ScreenSaverTime > 0)
FreeDPMSTimers(void) {
{ timeout = timeout > 0 ?
if (DPMSStandbyTimer) { MIN(ScreenSaverTime, timeout) :
TimerFree(DPMSStandbyTimer); ScreenSaverTime;
DPMSStandbyTimer = NULL;
} }
if (DPMSSuspendTimer) { #ifdef SCREENSAVER
TimerFree(DPMSSuspendTimer); if (timeout && !screenSaverSuspended) {
DPMSSuspendTimer = NULL; #else
if (timeout) {
#endif
ScreenSaverTimer = TimerSet(ScreenSaverTimer, 0, timeout,
ScreenSaverTimeoutExpire, NULL);
} }
if (DPMSOffTimer) { else if (ScreenSaverTimer) {
TimerFree(DPMSOffTimer); FreeScreenSaverTimer();
DPMSOffTimer = NULL;
} }
} }
void
SetDPMSTimers(void)
{
if (!DPMSEnabled)
return;
DPMSStandbyTimer = TimerSet(DPMSStandbyTimer, 0, DPMSStandbyTime,
DPMSStandbyTimerExpire, NULL);
DPMSSuspendTimer = TimerSet(DPMSSuspendTimer, 0, DPMSSuspendTime,
DPMSSuspendTimerExpire, NULL);
DPMSOffTimer = TimerSet(DPMSOffTimer, 0, DPMSOffTime,
DPMSOffTimerExpire, NULL);
}
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment