Unverified Commit f2dc8121 authored by Mike Gabriel's avatar Mike Gabriel

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

parents 82fc54e5 fde52a9b
......@@ -3167,8 +3167,6 @@ ProcQueryBestSize (register ClientPtr client)
return (client->noClientException);
}
#ifndef NXAGENT_SERVER
int
ProcSetScreenSaver (register ClientPtr client)
{
......@@ -3224,7 +3222,6 @@ ProcSetScreenSaver (register ClientPtr client)
SetScreenSaverTimer();
return (client->noClientException);
}
#endif /* NXAGENT_SERVER */
int
ProcGetScreenSaver(register ClientPtr client)
......@@ -3425,7 +3422,6 @@ ProcChangeCloseDownMode(register ClientPtr client)
}
}
#ifndef NXAGENT_SERVER
int ProcForceScreenSaver(register ClientPtr client)
{
REQUEST(xForceScreenSaverReq);
......@@ -3441,7 +3437,6 @@ int ProcForceScreenSaver(register ClientPtr client)
SaveScreens(SCREEN_SAVER_FORCER, (int)stuff->mode);
return client->noClientException;
}
#endif /* NXAGENT_SERVER */
int ProcNoOperation(register ClientPtr client)
{
......
......@@ -3334,7 +3334,6 @@ static void DrawLogo(
);
#endif
#ifndef NXAGENT_SERVER
void
SaveScreens(int on, int mode)
{
......@@ -3445,7 +3444,6 @@ SaveScreens(int on, int mode)
if (mode == ScreenSaverReset)
SetScreenSaverTimer();
}
#endif /* NXAGENT_SERVER */
static Bool
TileScreenSaver(int i, int kind)
......
......@@ -2081,8 +2081,6 @@ FIXME: In rootless mode the backing-store support is not functional yet.
{
fprintf(stderr, "Info: Using auto-disconnect timeout of %d seconds.\n",
nxagentOption(Timeout));
nxagentAutoDisconnectTimeout = nxagentOption(Timeout) * MILLI_PER_SECOND;
}
#ifdef WATCH
......
......@@ -40,11 +40,13 @@ is" without express or implied warranty.
#include <sys/types.h>
#include <unistd.h>
#include <stdarg.h>
#include <signal.h>
#include "X.h"
#include "Xproto.h"
#include "screenint.h"
#include "input.h"
#include "inputstr.h"
#include "misc.h"
#include "scrnintstr.h"
#include "windowstr.h"
......@@ -137,6 +139,8 @@ extern void nxagentSetSelectionCallback(CallbackListPtr *callbacks, void *data,
void *args);
#endif
OsTimerPtr nxagentTimeoutTimer = NULL;
extern const char *nxagentProgName;
void ddxInitGlobals(void)
......@@ -476,6 +480,96 @@ void ddxBeforeReset(void)
{
}
CARD32 nxagentTimeoutCallback(OsTimerPtr timer, CARD32 now, void *arg)
{
CARD32 idle = now - lastDeviceEventTime.milliseconds;
#ifdef TEST
fprintf(stderr, "%s: called, idle [%d] timeout [%d]\n", __func__, idle, nxagentOption(Timeout) * MILLI_PER_SECOND);
#endif
/* Set the time to exactly match the remaining time until timeout */
if (idle < nxagentOption(Timeout) * MILLI_PER_SECOND)
{
return nxagentOption(Timeout) * MILLI_PER_SECOND - idle;
}
/*
* The lastDeviceEventTime is updated every time a device event is
* received, and it is used by WaitForSomething() to know when the
* SaveScreens() function should be called. This solution doesn't
* take care of a pointer button not being released, so we have to
* handle this case by ourselves.
*/
/*
FIXME: Do we need to check the key grab if the
autorepeat feature is disabled?
*/
if (inputInfo.pointer -> button -> buttonsDown > 0)
{
#ifdef TEST
fprintf(stderr, "%s: Prolonging timeout - there is a pointer button down.\n", __func__);
#endif
/* wait 10s more */
return 10 * MILLI_PER_SECOND;
}
if (nxagentSessionState == SESSION_UP )
{
if (nxagentClients == 0)
{
fprintf(stderr, "Info: Auto-terminating session with no client running.\n");
raise(SIGTERM);
}
else if (nxagentOption(Persistent) == 0)
{
fprintf(stderr, "Info: Auto-terminating session with persistence not allowed.\n");
raise(SIGTERM);
}
else
{
fprintf(stderr, "Info: Auto-suspending session with %d clients running.\n",
nxagentClients);
raise(SIGHUP);
}
}
/*
* we do not need the timer anymore, so do not set a new time. The
* signals above will either terminate or suspend the session. At
* resume we will re-init the timer.
*/
return 0;
}
void nxagentSetTimeoutTimer(unsigned int millis)
{
if (nxagentOption(Timeout) > 0)
{
if (millis == 0)
{
millis = nxagentOption(Timeout) * MILLI_PER_SECOND;
}
#ifdef TEST
fprintf(stderr, "%s: Setting auto-disconnect timeout to [%dms]\n", __func__, millis);
#endif
nxagentTimeoutTimer = TimerSet(nxagentTimeoutTimer, 0, millis, nxagentTimeoutCallback, NULL);
}
}
void nxagentFreeTimeoutTimer(void)
{
#ifdef TEST
fprintf(stderr, "%s: freeing timeout timer\n", __func__);
#endif
TimerFree(nxagentTimeoutTimer);
nxagentTimeoutTimer = NULL;
}
void OsVendorInit(void)
{
return;
......
......@@ -52,4 +52,8 @@ extern ServerGrabInfoRec nxagentGrabServerInfo;
void nxagentNotifyConnection(int fd, int ready, void *data);
CARD32 nxagentTimeoutCallback(OsTimerPtr timer, CARD32 now, void *arg);
void nxagentSetTimeoutTimer(unsigned int millis);
void nxagentFreeTimeoutTimer(void);
#endif /* __Init_H__ */
......@@ -125,6 +125,7 @@ Equipment Corporation.
#include <nx/Shadow.h>
#include "Handlers.h"
#include "Keyboard.h"
#include "Init.h"
const int nxagentMaxFontNames = 10000;
......@@ -139,12 +140,6 @@ void nxagentWaitDisplay(void);
void nxagentListRemoteFonts(const char *, int);
/*
* Timeouts based on screen saver time.
*/
int nxagentAutoDisconnectTimeout = 0;
#include "Xatom.h"
/*
......@@ -312,6 +307,9 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio
if (!(dispatchException & DE_TERMINATE))
dispatchException = 0;
/* Init TimeoutTimer if requested */
nxagentSetTimeoutTimer(0);
#endif /* NXAGENT_SERVER */
while (!dispatchException)
......@@ -547,6 +545,8 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio
#endif
#ifdef NXAGENT_SERVER
nxagentFreeTimeoutTimer();
/* FIXME: maybe move the code up to the KillAllClients() call to ddxBeforeReset? */
if ((dispatchException & DE_RESET) &&
(serverGeneration > nxagentMaxAllowedResets))
......@@ -978,155 +978,6 @@ ProcFreePixmap(register ClientPtr client)
}
}
int
ProcSetScreenSaver (register ClientPtr client)
{
int blankingOption, exposureOption;
REQUEST(xSetScreenSaverReq);
REQUEST_SIZE_MATCH(xSetScreenSaverReq);
blankingOption = stuff->preferBlank;
if ((blankingOption != DontPreferBlanking) &&
(blankingOption != PreferBlanking) &&
(blankingOption != DefaultBlanking))
{
client->errorValue = blankingOption;
return BadValue;
}
exposureOption = stuff->allowExpose;
if ((exposureOption != DontAllowExposures) &&
(exposureOption != AllowExposures) &&
(exposureOption != DefaultExposures))
{
client->errorValue = exposureOption;
return BadValue;
}
if (stuff->timeout < -1)
{
client->errorValue = stuff->timeout;
return BadValue;
}
if (stuff->interval < -1)
{
client->errorValue = stuff->interval;
return BadValue;
}
#ifdef NXAGENT_SERVER
/*
* The NX agent uses the screen saver procedure
* to monitor the user activities and launch its
* handlers (like timeout feature), so we can't
* always allow the clients to change our values.
*/
#ifdef TEST
fprintf(stderr, "ProcSetScreenSaver: Called with timeout [%d] interval [%d] Blanking [%d] Exposure [%d].\n",
stuff -> timeout, stuff -> interval, blankingOption, exposureOption);
#endif
if (nxagentOption(Timeout) == 0)
{
#endif
if (blankingOption == DefaultBlanking)
{
ScreenSaverBlanking = defaultScreenSaverBlanking;
}
else
{
ScreenSaverBlanking = blankingOption;
}
if (exposureOption == DefaultExposures)
{
ScreenSaverAllowExposures = defaultScreenSaverAllowExposures;
}
else
{
ScreenSaverAllowExposures = exposureOption;
}
if (stuff->timeout >= 0)
{
ScreenSaverTime = stuff->timeout * MILLI_PER_SECOND;
}
else
{
ScreenSaverTime = defaultScreenSaverTime;
}
if (stuff->interval >= 0)
{
ScreenSaverInterval = stuff->interval * MILLI_PER_SECOND;
}
else
{
ScreenSaverInterval = defaultScreenSaverInterval;
}
SetScreenSaverTimer();
#ifdef NXAGENT_SERVER
}
#ifdef TEST
else
{
fprintf(stderr, "ProcSetScreenSaver: Keeping auto-disconnect timeout set to [%d] seconds.\n",
nxagentOption(Timeout));
}
#endif
#endif
return (client->noClientException);
}
int ProcForceScreenSaver(register ClientPtr client)
{
REQUEST(xForceScreenSaverReq);
REQUEST_SIZE_MATCH(xForceScreenSaverReq);
if ((stuff->mode != ScreenSaverReset) &&
(stuff->mode != ScreenSaverActive))
{
client->errorValue = stuff->mode;
return BadValue;
}
#ifdef NXAGENT_SERVER
/*
* The NX agent uses the screen saver procedure
* to monitor the user activities and launch its
* handlers (like timeout feature), so we can't
* always allow the clients to force the screen
* saver handler execution.
*/
if (nxagentOption(Timeout) == 0)
{
#endif
SaveScreens(SCREEN_SAVER_FORCER, (int)stuff->mode);
#ifdef NXAGENT_SERVER
}
#ifdef TEST
else
{
fprintf(stderr, "ProcForceScreenSaver: Ignoring the client request with mode [%d].\n",
stuff -> mode);
}
#endif
#endif
return client->noClientException;
}
/**********************
* CloseDownClient
*
......
......@@ -783,126 +783,3 @@ MapWindow(register WindowPtr pWin, ClientPtr client)
return(Success);
}
void
SaveScreens(int on, int mode)
{
int i;
int what;
int type;
if (on == SCREEN_SAVER_FORCER)
{
if (mode == ScreenSaverReset)
what = SCREEN_SAVER_OFF;
else
what = SCREEN_SAVER_ON;
type = what;
}
else
{
what = on;
type = what;
if (what == screenIsSaved)
type = SCREEN_SAVER_CYCLE;
}
for (i = 0; i < screenInfo.numScreens; i++)
{
if (on == SCREEN_SAVER_FORCER)
(* screenInfo.screens[i]->SaveScreen) (screenInfo.screens[i], on);
if (savedScreenInfo[i].ExternalScreenSaver)
{
#ifdef NXAGENT_SERVER
if (nxagentOption(Timeout) != 0)
{
#ifdef TEST
fprintf(stderr, "SaveScreens: An external screen-saver handler is installed. "
"Ignoring it to let the auto-disconnect feature work.\n");
#endif
}
else
#endif
{
if ((*savedScreenInfo[i].ExternalScreenSaver)
(screenInfo.screens[i], type, on == SCREEN_SAVER_FORCER))
continue;
}
}
if (type == screenIsSaved)
continue;
switch (type) {
case SCREEN_SAVER_OFF:
if (savedScreenInfo[i].blanked == SCREEN_IS_BLANKED)
{
(* screenInfo.screens[i]->SaveScreen) (screenInfo.screens[i],
what);
}
else if (HasSaverWindow (i))
{
savedScreenInfo[i].pWindow = NullWindow;
FreeResource(savedScreenInfo[i].wid, RT_NONE);
}
break;
case SCREEN_SAVER_CYCLE:
if (savedScreenInfo[i].blanked == SCREEN_IS_TILED)
{
WindowPtr pWin = savedScreenInfo[i].pWindow;
/* make it look like screen saver is off, so that
* NotClippedByChildren will compute a clip list
* for the root window, so miPaintWindow works
*/
screenIsSaved = SCREEN_SAVER_OFF;
#ifndef NOLOGOHACK
if (logoScreenSaver)
(*pWin->drawable.pScreen->ClearToBackground)(pWin, 0, 0, 0, 0, FALSE);
#endif
(*pWin->drawable.pScreen->MoveWindow)(pWin,
(short)(-(rand() % RANDOM_WIDTH)),
(short)(-(rand() % RANDOM_WIDTH)),
pWin->nextSib, VTMove);
#ifndef NOLOGOHACK
if (logoScreenSaver)
DrawLogo(pWin);
#endif
screenIsSaved = SCREEN_SAVER_ON;
}
/*
* Call the DDX saver in case it wants to do something
* at cycle time
*/
else if (savedScreenInfo[i].blanked == SCREEN_IS_BLANKED)
{
(* screenInfo.screens[i]->SaveScreen) (screenInfo.screens[i],
type);
}
break;
case SCREEN_SAVER_ON:
if (ScreenSaverBlanking != DontPreferBlanking)
{
if ((* screenInfo.screens[i]->SaveScreen)
(screenInfo.screens[i], what))
{
savedScreenInfo[i].blanked = SCREEN_IS_BLANKED;
continue;
}
if ((ScreenSaverAllowExposures != DontAllowExposures) &&
TileScreenSaver(i, SCREEN_IS_BLACK))
{
savedScreenInfo[i].blanked = SCREEN_IS_BLACK;
continue;
}
}
if ((ScreenSaverAllowExposures != DontAllowExposures) &&
TileScreenSaver(i, SCREEN_IS_TILED))
{
savedScreenInfo[i].blanked = SCREEN_IS_TILED;
}
else
savedScreenInfo[i].blanked = SCREEN_ISNT_SAVED;
break;
}
}
screenIsSaved = what;
if (mode == ScreenSaverReset)
SetScreenSaverTimer();
}
......@@ -54,6 +54,7 @@
#include "Error.h"
#include "Keystroke.h"
#include "Utils.h"
#include "Init.h"
#ifdef XKB
#include "XKBsrv.h"
......@@ -361,6 +362,8 @@ void nxagentDisconnectSession(void)
DECODE_SESSION_STATE(nxagentSessionState));
#endif
nxagentFreeTimeoutTimer();
/*
* Force an I/O error on the display
* and wait until the NX transport
......
......@@ -37,12 +37,6 @@ is" without express or implied warranty.
*/
/*
* Used by the auto-disconnect feature.
*/
#include <signal.h>
#include "scrnintstr.h"
#include "dix.h"
#include "dixstruct.h"
......@@ -517,19 +511,6 @@ void nxagentSetScreenSaverTime(void)
(long unsigned int)ScreenSaverTime, (long unsigned int)ScreenSaverInterval);
#endif
/*
* More than one timeout could be used here,
* to make use of screen-saver handler not
* only for the timeout feature. In a case
* like this, the lower timeout have to be
* used as ScreenSaverTime.
*/
if (nxagentAutoDisconnectTimeout > 0)
{
ScreenSaverTime = nxagentAutoDisconnectTimeout;
}
ScreenSaverInterval = ScreenSaverTime;
#ifdef TEST
......@@ -538,37 +519,47 @@ void nxagentSetScreenSaverTime(void)
#endif
}
/*
* This is the called when the "hardware" should take care of the
* blanking.
*
* "what" can be one if these:
* SCREEN_SAVER_ON Turns on the screen saver; disables video
* SCREEN_SAVER_OFF Turns off the screen saver; enables video
* SCREEN_SAVER_FORCER Updates time of last screen saver mode change
* SCREEN_SAVER_CYCLE Cycle to new pattern
*
* Returns True if the 'what' action was successful and False otherwise.
*
* Returning False the SaveScreens() function (which calls this one)
* tries to build a screen-saver creating a new window. In some cases
* we do not want this so we return True. If we want the dix to take
* care fo blanking we return False.
*/
static Bool nxagentSaveScreen(ScreenPtr pScreen, int what)
{
#ifdef TEST
fprintf(stderr, "nxagentSaveScreen: Called for screen at [%p] with parameter [%d].\n",
(void *) pScreen, what);
fprintf(stderr, "nxagentSaveScreen: SCREEN_SAVER_ON is [%d] SCREEN_SAVER_OFF is [%d] "
"SCREEN_SAVER_FORCER is [%d] SCREEN_SAVER_CYCLE is [%d].\n",
SCREEN_SAVER_ON, SCREEN_SAVER_OFF, SCREEN_SAVER_FORCER,
SCREEN_SAVER_CYCLE);
fprintf(stderr, "%s: Called for screen at [%p] with parameter [%s]. ScreenSaverTime [%d]\n", __func__,
(void *) pScreen,
what == SCREEN_SAVER_ON ? "SCREEN_SAVER_ON" :
what == SCREEN_SAVER_OFF ? "SCREEN_SAVER_OFF" :
what == SCREEN_SAVER_FORCER ? "SCREEN_SAVER_FORCER" :
what == SCREEN_SAVER_CYCLE ? "SCREEN_SAVER_CYCLE" :
"UNKNOWN",
ScreenSaverTime);
#endif
/*
* We need only to reset the timeouts
* in this case.
*/
if (what == SCREEN_SAVER_OFF)
{
nxagentAutoDisconnectTimeout = nxagentOption(Timeout) * MILLI_PER_SECOND;
return 1;
return False;
}
/*
* The lastDeviceEventTime is updated every time
* a device event is received, and it is used by
* WaitForSomething() to know when the SaveScreens()
* function should be called. This solution doesn't
* take care of a pointer button not released, so
* we have to handle this case by ourselves.
* The lastDeviceEventTime is updated every time a device event is
* received, and it is used by WaitForSomething() to know when the
* SaveScreens() function should be called. This solution doesn't
* take care of a pointer button not released, so we have to handle
* this case by ourselves.
*/
/*
......@@ -578,71 +569,19 @@ FIXME: Do we need to check the key grab if the
if (inputInfo.pointer -> button -> buttonsDown > 0)
{
#ifdef TEST
fprintf(stderr, "nxagentSaveScreen: Ignoring timeout, there is a pointer button down.\n");
fprintf(stderr, "%s: Ignoring timeout, there is a pointer button down.\n", __func__);
#endif
/*
* Returning 0 the SaveScreens() function
* (which calls this one) tries to build
* a screen-saver creating a new window.
* We don't want this, so we return 1 in
* any case.
* Returning False the SaveScreens() function (which calls this one)
* tries to build a screen-saver creating a new window. We don't
* want this, so we return True here.
*/
return 1;
return True;
}
/*
* Handling the auto-disconnect feature.
* If there is any client attached and the persisten-
* ce is allowed then leave the session running, else
* terminate it. It should use something less brutal,
* though raising a signal should ensure that the code
* follows the usual execution path.
*/
if (nxagentOption(Timeout) > 0)
{
#ifdef TEST
fprintf(stderr, "nxagentSaveScreen: Auto-disconnect timeout was [%d].\n",
nxagentAutoDisconnectTimeout);
#endif
nxagentAutoDisconnectTimeout -= ScreenSaverTime;
#ifdef TEST
fprintf(stderr, "nxagentSaveScreen: Auto-disconnect timeout is [%d].\n",
nxagentAutoDisconnectTimeout);
#endif
if (nxagentSessionState == SESSION_UP &&
nxagentAutoDisconnectTimeout <= 0)
{
nxagentAutoDisconnectTimeout = nxagentOption(Timeout) * MILLI_PER_SECOND;
if (nxagentClients == 0)
{
fprintf(stderr, "Info: Terminating session with no client running.\n");
raise(SIGTERM);
}
else if (nxagentOption(Persistent) == 0)
{
fprintf(stderr, "Info: Terminating session with persistence not allowed.\n");
raise(SIGTERM);
}
else
{
fprintf(stderr, "Info: Suspending session with %d clients running.\n",
nxagentClients);
raise(SIGHUP);
}
}
}
return 1;
return False;
}
Bool nxagentCreateScreenResources(ScreenPtr pScreen)
......@@ -3490,14 +3429,19 @@ Bool nxagentReconnectScreen(void *p0)
XSelectInput(nxagentDisplay, nxagentDefaultWindows[0], mask);
/*
* Turn off the screen-saver and reset the
* time to the next auto-disconnection.
* Turn off the screen-saver
*/
SaveScreens(SCREEN_SAVER_OFF, ScreenSaverActive);
/*
* reset the time to the next auto-disconnection.
*/
lastDeviceEventTime.milliseconds = GetTimeInMillis();
nxagentSetTimeoutTimer(0);
return True;
}
......
......@@ -57,8 +57,6 @@ extern XlibAtom nxagentReadyAtom;
extern int nxagentClients;
extern int nxagentAutoDisconnectTimeout;
extern ScreenPtr nxagentDefaultScreen;
extern Pixmap nxagentPixmapLogo;
......
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