Initial commit
This commit is contained in:
246
nkosrc4/Neko98/Neko98.cpp
Executable file
246
nkosrc4/Neko98/Neko98.cpp
Executable file
@@ -0,0 +1,246 @@
|
||||
/************************************
|
||||
Neko for Windows
|
||||
*************************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "Tray.h"
|
||||
#include "NekoSettings.h"
|
||||
#include "NekoCommon.h"
|
||||
#include "resource.h"
|
||||
#include "Neko.h"
|
||||
|
||||
//global variables
|
||||
HINSTANCE g_hInstance = NULL;
|
||||
HWND g_hWndMain = NULL;
|
||||
BOOL g_fTaskbar = TRUE;
|
||||
CTray * Tray = NULL;
|
||||
|
||||
int g_nNumCats = 0;
|
||||
typedef CNeko* PNeko;
|
||||
PNeko* g_NekoArray = NULL; //array of CNeko pointers
|
||||
DWORD g_dwSleepTime = 100;
|
||||
|
||||
BOOL g_fNeedReinit = TRUE;
|
||||
|
||||
|
||||
/* ExecuteConfigProcess - runs the configuration program *******************************/
|
||||
void ExecuteConfigProcess()
|
||||
{
|
||||
if( (int)ShellExecute( NULL, "open", "NekoCFG.EXE", 0, "", SW_SHOWNORMAL ) <= 32 )
|
||||
MessageBox( NULL, "Neko was unable to start the configuration program\n'NekoCFG.EXE'\n\nMake sure that this file is in the same folder as the main Neko program.", "Configure Neko", MB_ICONEXCLAMATION );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* LoadConfiguration - reloads the program configuration *******************************/
|
||||
void LoadConfiguration()
|
||||
{
|
||||
//load in the new global settings
|
||||
CNekoSettings * NekoSettings = new CNekoSettings( szNekoRegKey );
|
||||
NekoSettings->GetBool( szNekoTaskbarKey, &g_fTaskbar );
|
||||
|
||||
//delete all existing Nekos
|
||||
int i;
|
||||
for( i = 0; i < g_nNumCats; i++ ) delete g_NekoArray[i];
|
||||
delete[] g_NekoArray;
|
||||
|
||||
//load in new cats list
|
||||
DWORD dwNumCats = 0;
|
||||
NekoSettings->GetInt( szNekoNumCatsKey, &dwNumCats );
|
||||
g_nNumCats = dwNumCats;
|
||||
|
||||
if( g_nNumCats == 0 )
|
||||
{
|
||||
//the user hasn't run the config program, or there are no Nekos - use default
|
||||
g_NekoArray = new PNeko[1];
|
||||
g_NekoArray[0] = new CNeko();
|
||||
g_nNumCats = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_NekoArray = new PNeko[g_nNumCats];
|
||||
for( i = 0; i < g_nNumCats; i++ )
|
||||
{
|
||||
//build the key index
|
||||
char szSubKey[MAX_PATH], szName[MAX_NEKO_NAME];
|
||||
sprintf( szSubKey, "%d", i );
|
||||
|
||||
//load this cat's name from the registry
|
||||
NekoSettings->GetString( szSubKey, szName, MAX_NEKO_NAME-1 );
|
||||
|
||||
//add this Neko to the array
|
||||
g_NekoArray[i] = new CNeko( szName );
|
||||
}
|
||||
}
|
||||
|
||||
//erase the Neko settings
|
||||
delete NekoSettings;
|
||||
|
||||
//calculate new sleep time
|
||||
g_dwSleepTime = 100;
|
||||
if( g_nNumCats <= 20 ) g_dwSleepTime = 200 - ( 5 * g_nNumCats );
|
||||
|
||||
//update task bar
|
||||
if( g_fTaskbar )
|
||||
{
|
||||
if( Tray->GetCount() == 0 )
|
||||
Tray->AddIcon( g_hWndMain, LoadIcon( g_hInstance, MAKEINTRESOURCE( IDI_AWAKE )), 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( Tray->GetCount() > 0 )
|
||||
Tray->RemoveIcon( g_hWndMain, 1 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* WndProc - message processing function for the hidden Neko window ********************/
|
||||
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
switch( message )
|
||||
{
|
||||
case WM_DESTROY:
|
||||
//terminate the program
|
||||
PostQuitMessage( 0 );
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
case ID_SETTINGS:
|
||||
ExecuteConfigProcess();
|
||||
break;
|
||||
|
||||
case ID_EXIT:
|
||||
PostQuitMessage( 0 );
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DEVMODECHANGE:
|
||||
case WM_DISPLAYCHANGE:
|
||||
case WM_SETTINGCHANGE:
|
||||
case MY_UPDATENEKO:
|
||||
g_fNeedReinit = TRUE;
|
||||
break;
|
||||
|
||||
case MY_NOTIFYICON:
|
||||
switch( lParam )
|
||||
{
|
||||
case WM_LBUTTONDBLCLK:
|
||||
ExecuteConfigProcess();
|
||||
break;
|
||||
|
||||
case WM_RBUTTONUP:
|
||||
//this line is needed to make the menu go away!
|
||||
//(from Windows Developer FAQ [Robert Mashlan])
|
||||
SetForegroundWindow( hWnd );
|
||||
|
||||
//show the context menu
|
||||
Tray->ShowPopupMenu( hWnd );
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_TIMER:
|
||||
{
|
||||
//check to see if stuff needs reinitialisation
|
||||
if( g_fNeedReinit )
|
||||
{
|
||||
LoadConfiguration();
|
||||
g_fNeedReinit = FALSE;
|
||||
}
|
||||
|
||||
//update all Nekos
|
||||
for( int i = 0; i < g_nNumCats; i++ ) g_NekoArray[i]->Update();
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
return DefWindowProc( hWnd, message, wParam, lParam );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* InitApplication - program initialisation function ***********************************/
|
||||
BOOL InitApplication( HINSTANCE hInstance )
|
||||
{
|
||||
//store the instance handle
|
||||
g_hInstance = hInstance;
|
||||
|
||||
//create the (hidden) window
|
||||
WNDCLASS wc;
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = (WNDPROC)WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = NULL;
|
||||
wc.hCursor = NULL;
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = szNekoClassName;
|
||||
|
||||
if( RegisterClass(&wc) )
|
||||
{
|
||||
//create the window
|
||||
g_hWndMain = CreateWindow( szNekoClassName, szNekoWindowTitle, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);
|
||||
|
||||
if( g_hWndMain == NULL ) return FALSE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
//initialise random number generator
|
||||
srand( GetTickCount() );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* WinMain - program entry point *******************************************************/
|
||||
int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
|
||||
{
|
||||
//check for previous version & unload both if it's found
|
||||
HWND hWndOld = FindWindow( szNekoClassName, szNekoWindowTitle );
|
||||
if( hWndOld != NULL )
|
||||
{
|
||||
PostMessage( hWndOld, WM_QUIT, 0, 0 );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//initialise the program
|
||||
if( !InitApplication( hInstance ) ) return FALSE;
|
||||
|
||||
//create the tray object
|
||||
Tray = new CTray( hInstance );
|
||||
|
||||
//set a timer to update Neko
|
||||
SetTimer( g_hWndMain, ID_TIMER_NEKO, 200, NULL );
|
||||
|
||||
MSG msg;
|
||||
while( GetMessage( &msg, NULL, 0, 0 ) )
|
||||
{
|
||||
//pass the message onto our WndProc
|
||||
TranslateMessage( &msg );
|
||||
DispatchMessage( &msg );
|
||||
}
|
||||
|
||||
//remove the timer
|
||||
KillTimer( g_hWndMain, ID_TIMER_NEKO );
|
||||
|
||||
//delete all Nekos
|
||||
for( int i = 0; i < g_nNumCats; i++ ) delete g_NekoArray[i];
|
||||
delete[] g_NekoArray;
|
||||
|
||||
//remove the taskbar icon
|
||||
if( g_fTaskbar ) Tray->RemoveIcon( g_hWndMain, 1 );
|
||||
delete Tray;
|
||||
|
||||
return msg.wParam;
|
||||
}
|
||||
Reference in New Issue
Block a user