This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

155 lines
6.5 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: An application framework
//
// $Revision: $
// $NoKeywords: $
//===========================================================================//
#ifndef APPFRAMEWORK_H
#define APPFRAMEWORK_H
#ifdef _WIN32
#pragma once
#endif
#include "appframework/IAppSystemGroup.h"
//-----------------------------------------------------------------------------
// Gets the application instance..
//-----------------------------------------------------------------------------
void *GetAppInstance();
//-----------------------------------------------------------------------------
// Sets the application instance, should only be used if you're not calling
// AppMain.
//-----------------------------------------------------------------------------
void SetAppInstance(void *hInstance);
//-----------------------------------------------------------------------------
// Main entry point for the application
//-----------------------------------------------------------------------------
int AppMain(void *hInstance, void *hPrevInstance, const char *lpCmdLine,
int nCmdShow, CAppSystemGroup *pAppSystemGroup);
int AppMain(int argc, char **argv, CAppSystemGroup *pAppSystemGroup);
//-----------------------------------------------------------------------------
// Used to startup/shutdown the application
//-----------------------------------------------------------------------------
int AppStartup(void *hInstance, void *hPrevInstance, const char *lpCmdLine,
int nCmdShow, CAppSystemGroup *pAppSystemGroup);
int AppStartup(int argc, char **argv, CAppSystemGroup *pAppSystemGroup);
void AppShutdown(CAppSystemGroup *pAppSystemGroup);
//-----------------------------------------------------------------------------
// Macros to create singleton application objects for windowed + console apps
//-----------------------------------------------------------------------------
#if !defined(_X360)
#ifdef WIN32
#define DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR(_globalVarName) \
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, \
LPSTR lpCmdLine, int nCmdShow) { \
return AppMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow, \
&_globalVarName); \
}
#elif defined(OSX)
#define DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR(_globalVarName) \
int main(int argc, char **argv) { \
extern int ValveCocoaMain(int argc, char **argv, \
CAppSystemGroup *pAppSystemGroup); \
return ValveCocoaMain(argc, argv, &_globalVarName); \
}
#elif defined(LINUX)
#define DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR(_globalVarName) \
int main(int argc, char **argv) { \
extern int ValveLinuxWindowedMain(int argc, char **argv, \
CAppSystemGroup *pAppSystemGroup); \
return ValveLinuxWindowedMain(argc, argv, &_globalVarName); \
}
#else
#error
#endif
#else
#define DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR(_globalVarName) \
void __cdecl main() { \
AppMain((HINSTANCE)1, (HINSTANCE)0, NULL, 0, &_globalVarName); \
}
#endif
#if !defined(_X360)
#define DEFINE_CONSOLE_APPLICATION_OBJECT_GLOBALVAR(_globalVarName) \
int main(int argc, char **argv) { \
return AppMain(argc, argv, &_globalVarName); \
}
#else
#define DEFINE_CONSOLE_APPLICATION_OBJECT_GLOBALVAR(_globalVarName) \
void __cdecl main() { AppMain(0, (char **)NULL, &_globalVarName); }
#endif
#define DEFINE_WINDOWED_APPLICATION_OBJECT(_className) \
static _className __s_ApplicationObject; \
DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR(__s_ApplicationObject)
#define DEFINE_CONSOLE_APPLICATION_OBJECT(_className) \
static _className __s_ApplicationObject; \
DEFINE_CONSOLE_APPLICATION_OBJECT_GLOBALVAR(__s_ApplicationObject)
//-----------------------------------------------------------------------------
// This class is a helper class used for steam-based applications.
// It loads up the file system in preparation for using it to load other
// required modules from steam.
//-----------------------------------------------------------------------------
class CSteamApplication : public CAppSystemGroup {
typedef CAppSystemGroup BaseClass;
public:
CSteamApplication(CSteamAppSystemGroup *pAppSystemGroup);
// Implementation of IAppSystemGroup
virtual bool Create();
virtual bool PreInit();
virtual int Main();
virtual void PostShutdown();
virtual void Destroy();
// Use this version in cases where you can't control the main loop and
// expect to be ticked
virtual int Startup();
virtual void Shutdown();
protected:
IFileSystem *m_pFileSystem;
CSteamAppSystemGroup *m_pChildAppSystemGroup;
bool m_bSteam;
};
//-----------------------------------------------------------------------------
// Macros to help create singleton application objects for windowed + console
// steam apps
//-----------------------------------------------------------------------------
#define DEFINE_WINDOWED_STEAM_APPLICATION_OBJECT_GLOBALVAR(_className, \
_varName) \
static CSteamApplication __s_SteamApplicationObject(&_varName); \
DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR(__s_SteamApplicationObject)
#define DEFINE_WINDOWED_STEAM_APPLICATION_OBJECT(_className) \
static _className __s_ApplicationObject; \
static CSteamApplication __s_SteamApplicationObject( \
&__s_ApplicationObject); \
DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR(__s_SteamApplicationObject)
#define DEFINE_CONSOLE_STEAM_APPLICATION_OBJECT_GLOBALVAR(_className, \
_varName) \
static CSteamApplication __s_SteamApplicationObject(&_varName); \
DEFINE_CONSOLE_APPLICATION_OBJECT_GLOBALVAR(__s_SteamApplicationObject)
#define DEFINE_CONSOLE_STEAM_APPLICATION_OBJECT(_className) \
static _className __s_ApplicationObject; \
static CSteamApplication __s_SteamApplicationObject( \
&__s_ApplicationObject); \
DEFINE_CONSOLE_APPLICATION_OBJECT_GLOBALVAR(__s_SteamApplicationObject)
#endif // APPFRAMEWORK_H