Changes for Screen saver And implement

1. Time value can be changes use SPI_SETSCREENSAVETIMEOUT to set the new value, current insate value are set to 30sec
2. SPI_GETSCREENSAVETIMEOUT Get the screen saver timeout value.
3. Dectect if screen saver is running with SPI_GETSCREENSAVERRUNNING
4. Set the state of screen saver with  SPI_SETSCREENSAVERRUNNING <- this is internal api see msdn 
 
Implement for mouse
1. SPI_GETWHEELSCROLLLINES I am but unsure if win32k need more changes it seam like it is only a counter that should be set/get a value and user apps take care of the rest. Implement it for jimtabor did request it. 
2. SPI_GETWHEELSCROLLCHARS  I am but unsure if win32k need more changes it seam like it is only a counter that should be set/get a value and user apps take care of the rest.

svn path=/trunk/; revision=22985
This commit is contained in:
Magnus Olsen 2006-07-10 00:26:56 +00:00
parent f89c0df588
commit 52c172d21e
5 changed files with 86 additions and 30 deletions

View file

@ -38,6 +38,8 @@ typedef struct _SYSTEM_CURSORINFO
UINT ButtonsDown; UINT ButtonsDown;
CURSORCLIP_INFO CursorClipInfo; CURSORCLIP_INFO CursorClipInfo;
PCURICON_OBJECT CurrentCursorObject; PCURICON_OBJECT CurrentCursorObject;
UINT WheelScroLines;
UINT WheelScroChars;
BYTE ShowingCursor; BYTE ShowingCursor;
UINT DblClickSpeed; UINT DblClickSpeed;
UINT DblClickWidth; UINT DblClickWidth;
@ -46,6 +48,7 @@ typedef struct _SYSTEM_CURSORINFO
LONG LastBtnDownX; LONG LastBtnDownX;
LONG LastBtnDownY; LONG LastBtnDownY;
HANDLE LastClkWnd; HANDLE LastClkWnd;
BOOL ScreenSaverRunning;
} SYSTEM_CURSORINFO, *PSYSTEM_CURSORINFO; } SYSTEM_CURSORINFO, *PSYSTEM_CURSORINFO;
HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange); HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange);

View file

@ -33,6 +33,10 @@ typedef struct _WINSTATION_OBJECT
HANDLE ShellWindow; HANDLE ShellWindow;
HANDLE ShellListView; HANDLE ShellListView;
/* ScreenSaver */
BOOL ScreenSaverRunning;
UINT ScreenSaverTimeOut;
/* Wallpaper */ /* Wallpaper */
HANDLE hbmWallpaper; HANDLE hbmWallpaper;
ULONG cxWallpaper, cyWallpaper; ULONG cxWallpaper, cyWallpaper;

View file

@ -55,6 +55,8 @@ static BOOLEAN InputThreadsRunning = FALSE;
PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue = 0; PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue = 0;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
ULONG FASTCALL
IntSystemParametersInfo(UINT uiAction, UINT uiParam,PVOID pvParam, UINT fWinIni);
#define ClearMouseInput(mi) \ #define ClearMouseInput(mi) \
mi.dx = 0; \ mi.dx = 0; \
@ -162,20 +164,18 @@ ScreenSaverThreadMain(PVOID StartContext)
LARGE_INTEGER CurrentTime; LARGE_INTEGER CurrentTime;
LARGE_INTEGER DiffTimeMouse; LARGE_INTEGER DiffTimeMouse;
LARGE_INTEGER DiffTimeKeyboard; LARGE_INTEGER DiffTimeKeyboard;
LARGE_INTEGER OldTimeMouse; UINT ScreenSaverTimeOut = 0;
LARGE_INTEGER OldTimeKeyboard; BOOL nPreviousState = FALSE;
NTSTATUS Status; NTSTATUS Status;
KeSetPriorityThread(&PsGetCurrentThread()->Tcb, KeSetPriorityThread(&PsGetCurrentThread()->Tcb,
LOW_REALTIME_PRIORITY + 3); LOW_REALTIME_PRIORITY + 3);
KeQuerySystemTime(&MouseInputCurrentTime); KeQuerySystemTime(&MouseInputCurrentTime);
KeQuerySystemTime(&KeyboardInputCurrentTime); KeQuerySystemTime(&KeyboardInputCurrentTime);
OldTimeMouse.QuadPart = MouseInputCurrentTime.QuadPart; DelayTimer.QuadPart = -10000000LL; /* 1 second timeout */
OldTimeKeyboard.QuadPart = MouseInputCurrentTime.QuadPart;
DelayTimer.QuadPart = -10000000LL; /* 1 second timeout */
for(;;) for(;;)
{ {
@ -188,14 +188,12 @@ ScreenSaverThreadMain(PVOID StartContext)
DPRINT("Screen Saver auto start Thread Starting...\n"); DPRINT("Screen Saver auto start Thread Starting...\n");
while(InputThreadsRunning) while(InputThreadsRunning)
{ {
/* FIXME
1. read timeout value from reg IntSystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &ScreenSaverTimeOut, 0);
2. read timeout value from spi msg IntSystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &nPreviousState, 0);
*/
Timeout.QuadPart = ((LONGLONG)ScreenSaverTimeOut) * 10000000LL;
/* 30 second timeout This value should be read from register */
Timeout.QuadPart = 300000000LL;
KeInitializeEvent(&Event, NotificationEvent, FALSE); KeInitializeEvent(&Event, NotificationEvent, FALSE);
Status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, &DelayTimer); Status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, &DelayTimer);
@ -211,27 +209,33 @@ ScreenSaverThreadMain(PVOID StartContext)
KeQuerySystemTime(&CurrentTime); KeQuerySystemTime(&CurrentTime);
DiffTimeMouse.QuadPart = CurrentTime.QuadPart - MouseInputCurrentTime.QuadPart; DiffTimeMouse.QuadPart = CurrentTime.QuadPart - MouseInputCurrentTime.QuadPart;
DiffTimeKeyboard.QuadPart = CurrentTime.QuadPart - KeyboardInputCurrentTime.QuadPart; DiffTimeKeyboard.QuadPart = CurrentTime.QuadPart - KeyboardInputCurrentTime.QuadPart;
if ( DiffTimeMouse.QuadPart >= Timeout.QuadPart && if ( (DiffTimeMouse.QuadPart >= Timeout.QuadPart) &&
DiffTimeKeyboard.QuadPart >= Timeout.QuadPart && (DiffTimeKeyboard.QuadPart >= Timeout.QuadPart) &&
OldTimeMouse.QuadPart != MouseInputCurrentTime.QuadPart && (nPreviousState == FALSE))
OldTimeKeyboard.QuadPart != MouseInputCurrentTime.QuadPart) {
{ BOOL nPreviousState = FALSE;
DPRINT1("Keyboard and Mouse TimeOut Starting Screen Saver ...\n"); DPRINT1("Keyboard and Mouse TimeOut Starting Screen Saver ...\n");
DPRINT1("Keyboard Timeout counter was %I64d\n",DiffTimeKeyboard.QuadPart); DPRINT1("Keyboard Timeout counter was %I64d\n",DiffTimeKeyboard.QuadPart);
DPRINT1("Mouse Timeout counter was %I64d\n",DiffTimeMouse.QuadPart); DPRINT1("Mouse Timeout counter was %I64d\n",DiffTimeMouse.QuadPart);
CSR_API_MESSAGE Request; CSR_API_MESSAGE Request;
OldTimeMouse.QuadPart = MouseInputCurrentTime.QuadPart;
OldTimeKeyboard.QuadPart = MouseInputCurrentTime.QuadPart;
CsrInit(); CsrInit();
Request.Type = MAKE_CSR_API(START_SCREEN_SAVER, CSR_GUI); Request.Type = MAKE_CSR_API(START_SCREEN_SAVER, CSR_GUI);
Request.Data.StartScreenSaver.Start = TRUE; Request.Data.StartScreenSaver.Start = TRUE;
co_CsrNotifyScreenSaver(&Request ); co_CsrNotifyScreenSaver(&Request );
}
IntSystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &nPreviousState, 0);
}
if ( (DiffTimeMouse.QuadPart < Timeout.QuadPart) &&
(DiffTimeKeyboard.QuadPart < Timeout.QuadPart) &&
(nPreviousState == TRUE))
{
IntSystemParametersInfo(SPI_SETSCREENSAVERRUNNING, FALSE, &nPreviousState, 0);
}
} }
DPRINT("Screen Saver auto start Thread Stopped...\n"); DPRINT("Screen Saver auto start Thread Stopped...\n");

View file

@ -992,6 +992,12 @@ IntSystemParametersInfo(
case SPI_SETDOUBLECLICKTIME: case SPI_SETDOUBLECLICKTIME:
case SPI_SETDESKWALLPAPER: case SPI_SETDESKWALLPAPER:
case SPI_GETDESKWALLPAPER: case SPI_GETDESKWALLPAPER:
case SPI_GETWHEELSCROLLLINES:
case SPI_GETWHEELSCROLLCHARS:
case SPI_SETSCREENSAVERRUNNING:
case SPI_GETSCREENSAVERRUNNING:
case SPI_GETSCREENSAVETIMEOUT:
case SPI_SETSCREENSAVETIMEOUT:
{ {
PSYSTEM_CURSORINFO CurInfo; PSYSTEM_CURSORINFO CurInfo;
@ -1007,6 +1013,29 @@ IntSystemParametersInfo(
switch(uiAction) switch(uiAction)
{ {
case SPI_GETSCREENSAVETIMEOUT:
if (pvParam != NULL) *((UINT*)pvParam) = WinStaObject->ScreenSaverTimeOut;
return TRUE;
case SPI_SETSCREENSAVETIMEOUT:
WinStaObject->ScreenSaverTimeOut = uiParam;
return TRUE;
case SPI_GETSCREENSAVERRUNNING:
if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
return TRUE;
case SPI_SETSCREENSAVERRUNNING:
if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
WinStaObject->ScreenSaverRunning = uiParam;
return TRUE;
case SPI_GETWHEELSCROLLLINES:
CurInfo = IntGetSysCursorInfo(WinStaObject);
if (pvParam != NULL) *((UINT*)pvParam) = CurInfo->WheelScroLines;
/* FIXME add this value to scroll list as scroll value ?? */
return TRUE;
case SPI_GETWHEELSCROLLCHARS:
CurInfo = IntGetSysCursorInfo(WinStaObject);
if (pvParam != NULL) *((UINT*)pvParam) = CurInfo->WheelScroChars;
// FIXME add this value to scroll list as scroll value ??
break;
case SPI_SETDOUBLECLKWIDTH: case SPI_SETDOUBLECLKWIDTH:
CurInfo = IntGetSysCursorInfo(WinStaObject); CurInfo = IntGetSysCursorInfo(WinStaObject);
/* FIXME limit the maximum value? */ /* FIXME limit the maximum value? */
@ -1365,6 +1394,12 @@ UserSystemParametersInfo(
case SPI_GETGRADIENTCAPTIONS: case SPI_GETGRADIENTCAPTIONS:
case SPI_GETFOCUSBORDERHEIGHT: case SPI_GETFOCUSBORDERHEIGHT:
case SPI_GETFOCUSBORDERWIDTH: case SPI_GETFOCUSBORDERWIDTH:
case SPI_GETWHEELSCROLLLINES:
case SPI_GETWHEELSCROLLCHARS:
case SPI_GETSCREENSAVERRUNNING:
case SPI_SETSCREENSAVERRUNNING:
case SPI_GETSCREENSAVETIMEOUT:
case SPI_SETSCREENSAVETIMEOUT:
{ {
BOOL Ret; BOOL Ret;
@ -1458,6 +1493,11 @@ UserSystemParametersInfo(
} }
return( TRUE); return( TRUE);
} }
default :
{
DPRINT1("UserSystemParametersInfo : uiAction = %x \n",uiAction );
break;
}
} }
return( FALSE); return( FALSE);
} }

View file

@ -488,6 +488,8 @@ NtUserCreateWindowStation(
/* /*
* Initialize the new window station object * Initialize the new window station object
*/ */
WindowStationObject->ScreenSaverRunning = FALSE;
WindowStationObject->ScreenSaverTimeOut = 30;
if(!(CurInfo = ExAllocatePool(PagedPool, sizeof(SYSTEM_CURSORINFO)))) if(!(CurInfo = ExAllocatePool(PagedPool, sizeof(SYSTEM_CURSORINFO))))
{ {
@ -504,8 +506,11 @@ NtUserCreateWindowStation(
CurInfo->LastBtnDown = 0; CurInfo->LastBtnDown = 0;
CurInfo->CurrentCursorObject = NULL; CurInfo->CurrentCursorObject = NULL;
CurInfo->ShowingCursor = 0; CurInfo->ShowingCursor = 0;
CurInfo->WheelScroLines = 3;
CurInfo->WheelScroChars = 3;
/* FIXME: Obtain the following information from the registry */ /* FIXME: Obtain the following information from the registry */
CurInfo->SwapButtons = FALSE; CurInfo->SwapButtons = FALSE;
CurInfo->DblClickSpeed = 500; CurInfo->DblClickSpeed = 500;
CurInfo->DblClickWidth = 4; CurInfo->DblClickWidth = 4;