boinc/clienttray/tray_win.cpp

196 lines
5.6 KiB
C++

// Berkeley Open Infrastructure for Network Computing
// http://boinc.berkeley.edu
// Copyright (C) 2005 University of California
//
// This is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any later version.
//
// This software is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Lesser General Public License for more details.
//
// To view the GNU Lesser General Public License visit
// http://www.gnu.org/copyleft/lesser.html
// or write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
#include "boinc_win.h"
#include "boinc_tray.h"
#include "tray_win.h"
BOOL IdleTrackerStartup();
EXTERN_C DWORD BOINCGetIdleTickCount();
void IdleTrackerShutdown();
HMODULE g_hModule = NULL;
static CBOINCTray* gspBOINCTray = NULL;
INT WINAPI WinMain(
HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow
) {
CBOINCTray BOINCTray;
return BOINCTray.Run( hInstance, hPrevInstance, lpCmdLine, nCmdShow );
}
CBOINCTray::CBOINCTray() {
gspBOINCTray = this;
m_hDataManagementThread = NULL;
m_bClientLibraryInitialized = FALSE;
}
// Starts main execution of BOINC Tray.
//
INT CBOINCTray::Run( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
// Initialize the BOINC client library to setup the idle tracking system.
m_bClientLibraryInitialized = IdleTrackerStartup();
if (!hPrevInstance) {
// Register an appropriate window class for the primary window
WNDCLASS cls;
cls.hCursor = NULL;
cls.hIcon = NULL;
cls.lpszMenuName = NULL;
cls.lpszClassName = _T("BOINCTrayWndClass");
cls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
cls.hInstance = hInstance;
cls.style = CS_OWNDC|CS_VREDRAW|CS_HREDRAW;
cls.lpfnWndProc = TrayProcStub;
cls.cbWndExtra = 0;
cls.cbClsExtra = 0;
RegisterClass(&cls);
}
// Create the window
MSG msg;
HWND hWnd;
hWnd = CreateWindow(
_T("BOINCTrayWndClass"),
_T("BOINC SystemTray Applet"),
WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL
);
// Process the message pump
while( GetMessage( &msg, NULL, 0, 0 ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
// Cleanup and shutdown the BOINC client library idle tracking system.
IdleTrackerShutdown();
return msg.wParam;
}
// Create the thread that is used to talk to the daemon.
//
BOOL CBOINCTray::CreateDataManagementThread() {
DWORD dwThreadID = 0;
m_hDataManagementThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
DataManagementProcStub, // thread function
NULL, // argument to thread function
0, // use default creation flags
&dwThreadID ); // returns the thread identifier
if (m_hDataManagementThread == NULL) {
return FALSE;
}
return TRUE;
}
// Terminate the thread that is used to talk to the daemon.
//
BOOL CBOINCTray::DestroyDataManagementThread() {
if (!TerminateThread(m_hDataManagementThread, 0)) {
return FALSE;
}
return TRUE;
}
// Update the time since last input activity every 5 seconds or so.
//
DWORD WINAPI CBOINCTray::DataManagementProc() {
while (true) {
if (!m_bClientLibraryInitialized) {
// On Vista systems, only elevated processes can create shared memory
// area's across various user sessions. In this case we need to wait
// for BOINC to create the shared memory area and then boinctray can
// successfully attach to it. What a PITA.
m_bClientLibraryInitialized = IdleTrackerStartup();
}
BOINCGetIdleTickCount();
Sleep(5000);
}
}
// This function forwards to DataManagementProc, which has access to the
// "this" pointer.
//
DWORD WINAPI CBOINCTray::DataManagementProcStub(LPVOID) {
return gspBOINCTray->DataManagementProc();
}
// Handle window messages for main screensaver windows.
//
LRESULT CBOINCTray::TrayProc(
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {
switch (uMsg) {
case WM_CREATE:
CreateDataManagementThread();
return 0;
break;
case WM_CLOSE:
DestroyDataManagementThread();
return 0;
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
// This function forwards all window messages to SaverProc, which has
// access to the "this" pointer.
//
LRESULT CALLBACK CBOINCTray::TrayProcStub(
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {
return gspBOINCTray->TrayProc(hWnd, uMsg, wParam, lParam);
}
const char *BOINC_RCSID_116269c72f = "$Id: screensaver_win.cpp 13819 2007-10-10 09:25:40Z fthomas $";