boinc/client/win/win_screensaver.cpp

240 lines
6.5 KiB
C++
Executable File

// The contents of this file are subject to the Mozilla Public License
// Version 1.0 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://www.mozilla.org/MPL/
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is the Berkeley Open Infrastructure for Network Computing.
//
// The Initial Developer of the Original Code is the SETI@home project.
// Portions created by the SETI@home project are Copyright (C) 2002
// University of California at Berkeley. All Rights Reserved.
//
// Contributor(s):
//
// Based on code by Lucian Wischik
#include <afxwin.h>
#include "graphics_api.h"
#include "boinc_ss_res.h"
#include "win_util.h"
void RunSaver( void );
BOOL CALLBACK ConfigDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
void DoPreviewWindow(HWND hparwnd);
LRESULT CALLBACK SaverWindowProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
enum TScrMode {smNone,smConfig,smPassword,smPreview,smSaver};
HINSTANCE hInstance=NULL;
HWND hScrWindow=NULL;
TScrMode ScrMode=smNone;
int WINAPI WinMain(HINSTANCE h,HINSTANCE,LPSTR,int) {
char *cmd_line, *c;
HWND hwnd=NULL;
cmd_line=GetCommandLine();
c = cmd_line;
// Skip past the screensaver name
if (*c=='\"') {
c++;
while (*c!=0 && *c!='\"') c++;
} else {
while (*c!=0 && *c!=' ') c++;
}
if (*c!=0) c++;
while (*c==' ') c++;
if (*c==0) {
ScrMode=smConfig;
hwnd=NULL;
} else {
if (*c=='-' || *c=='/') c++;
if (*c=='p' || *c=='P' || *c=='l' || *c=='L') { // Preview mode
c++;
while (*c==' ' || *c==':') c++;
hwnd=(HWND)atoi(c);
ScrMode=smPreview;
} else if (*c=='s' || *c=='S') { // Full screensaver mode
ScrMode=smSaver;
} else if (*c=='c' || *c=='C') { // Configuration dialog mode
c++;
while (*c==' ' || *c==':') c++;
if (*c==0)
hwnd=GetForegroundWindow();
else
hwnd=(HWND)atoi(c);
ScrMode=smConfig;
}
else if (*c=='a' || *c=='A') { // Password configuration dialog
c++;
while (*c==' ' || *c==':') c++;
hwnd=(HWND)atoi(c);
ScrMode=smPassword;
}
}
UtilInitOSVersion();
switch (ScrMode) {
case smPreview:
DoPreviewWindow(hwnd);
break;
case smSaver:
RunSaver();
break;
case smPassword:
//ChangePassword(hwnd);
break;
case smConfig:
DialogBox(hInstance,MAKEINTRESOURCE(DLG_CONFIG),hwnd,ConfigDialogProc);
break;
}
return 0;
}
void RunSaver( void ) {
int BOINC_SS_START_MSG;
int BOINC_GFX_MODE_MSG;
int oldval;
char client_path[256], client_dir[256];
PROCESS_INFORMATION process_info;
STARTUPINFO startup_info;
HANDLE boinc_mutex;
// If BOINC isn't running, then start it up!
boinc_mutex = CreateMutex(NULL, false, "BOINC_MUTEX");
if(boinc_mutex != 0) {
CloseHandle(boinc_mutex);
// Get the path to the client
UtilGetRegStr( "ClientPath", client_path );
UtilGetRegStr( "ClientDir", client_dir );
memset( &process_info, 0, sizeof( process_info ) );
memset( &startup_info, 0, sizeof( startup_info ) );
startup_info.cb = sizeof(startup_info);
startup_info.lpReserved = NULL;
startup_info.lpDesktop = "";
// Start the client in the background
oldval = CreateProcess( client_path, // path to the client
"boinc -min -saver", // start it in the background
NULL, // no process security attributes
NULL, // no thread security attribute
FALSE, // doesn't inherit handles
CREATE_NEW_PROCESS_GROUP|CREATE_NO_WINDOW|IDLE_PRIORITY_CLASS,
NULL, // same environment
client_dir, // start in the standard client directory
&startup_info,
&process_info );
}
// Set a flag in the system to indicate that we're in screensaver mode
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,&oldval,0);
BOINC_SS_START_MSG = RegisterWindowMessage( "BOINC_SS_START" );
BOINC_GFX_MODE_MSG = RegisterWindowMessage( "BOINC_GFX_MODE" );
PostMessage(HWND_BROADCAST, BOINC_GFX_MODE_MSG, 0, MODE_FULLSCREEN);
// We should go into a wait state here
// Unset the system screensaver flag
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,&oldval,0);
}
void DoPreviewWindow(HWND hparwnd)
{
WNDCLASS wc;
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=SaverWindowProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=NULL;
wc.hCursor=NULL;
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="ScrClass";
RegisterClass(&wc);
RECT rc;
GetWindowRect(hparwnd,&rc);
int cx=rc.right-rc.left, cy=rc.bottom-rc.top;
hScrWindow=CreateWindowEx(0,"ScrClass","SaverPreview",WS_CHILD|WS_VISIBLE,0,0,cx,cy,hparwnd,NULL,hInstance,NULL);
if (hScrWindow==NULL) return;
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return;
}
BOOL CALLBACK ConfigDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
unsigned long screen_blank, blank_time;
char buf[256];
switch (msg) {
case WM_INITDIALOG:
UtilGetRegKey( "Blank", screen_blank );
CheckDlgButton(hwnd,IDC_BLANK,screen_blank);
UtilGetRegKey( "Blank Time", blank_time );
sprintf( buf, "%d", blank_time );
SetDlgItemText(hwnd,IDC_BLANK_TIME,buf);
return TRUE;
case WM_COMMAND:
int id=LOWORD(wParam);
if (id==IDOK) {
screen_blank=(IsDlgButtonChecked(hwnd,IDC_BLANK)==BST_CHECKED);
UtilSetRegKey( "Blank", screen_blank );
GetDlgItemText(hwnd, IDC_BLANK_TIME, buf, 256 );
blank_time=atoi(buf);
UtilSetRegKey( "Blank Time", blank_time );
}
if (id==IDOK || id==IDCANCEL)
EndDialog(hwnd,id);
break;
}
return FALSE;
}
LRESULT CALLBACK SaverWindowProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch (msg) {
case WM_CREATE:
//GetCursorPos(&(ss->InitCursorPos));
break;
case WM_SETCURSOR:
if (ScrMode==smSaver) SetCursor(NULL);
else SetCursor(LoadCursor(NULL,IDC_ARROW));
break;
case WM_SYSCOMMAND:
if (ScrMode==smSaver)
{ if (wParam==SC_SCREENSAVE) {return FALSE;}
if (wParam==SC_CLOSE) {return FALSE;}
}
break;
case WM_CLOSE:
/*if (ScrMode==smSaver && ss->ReallyClose && !ss->IsDialogActive)
{
BOOL CanClose=TRUE;
}
if (ScrMode==smSaver) return FALSE;*/ // so that DefWindowProc doesn't get called, because it would just DestroyWindow
break;
case (WM_DESTROY):
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}