// typedefs
// ----------------------------------------------------------------------------
-#ifdef __WXMSW__
+#if (defined(__WXMSW__) && !defined(__WXMICROWIN__)) || defined (__WXPM__)
class WXDLLEXPORT wxApp;
typedef wxApp* (*wxAppInitializerFunction)();
#else
class WXDLLEXPORT wxAppBase : public wxEvtHandler
{
public:
+ wxAppBase();
+
// the virtual functions which may/must be overridden in the derived class
// -----------------------------------------------------------------------
-
+#ifdef __WXMAC_X__
+ virtual ~wxAppBase() {} // Added min for Mac X
+#endif
// called during the program initialization, returning FALSE from here
// prevents the program from continuing - it's a good place to create
// the top level program window and return TRUE.
// depend on the toolkit. default version does nothing.
//
// Override: rarely.
- virtual bool OnInitGui() { return TRUE; }
+ virtual bool OnInitGui();
#endif // wxUSE_GUI
// called to start program execution - the default version just enters
// value of this method.
//
// Override: often.
- virtual int OnExit() { return 0; }
+ virtual int OnExit();
// called when a fatal exception occurs, this function should take care
// not to do anything which might provoke a nested exception! It may be
// top level window functions
// --------------------------
+ // return TRUE if our app has focus
+ virtual bool IsActive() const { return m_isActive; }
+
// set the "main" top level window
void SetTopWindow(wxWindow *win) { m_topWindow = win; }
// return the "main" top level window (if it hadn't been set previously
// with SetTopWindow(), will return just some top level window and, if
// there are none, will return NULL)
- wxWindow *GetTopWindow() const
+ virtual wxWindow *GetTopWindow() const
{
if (m_topWindow)
return m_topWindow;
// object) - this log object is used by default by all wxLogXXX()
// functions.
virtual wxLog *CreateLogTarget()
-#if wxUSE_GUI
- { return new wxLogGui; }
-#else // !GUI
- { return new wxLogStderr; }
-#endif // wxUSE_GUI
+ #if wxUSE_GUI && wxUSE_LOGGUI && !defined(__WXMICROWIN__)
+ { return new wxLogGui; }
+ #else // !GUI
+ { return new wxLogStderr; }
+ #endif // wxUSE_GUI
#endif // wxUSE_LOG
#if wxUSE_GUI
void SetWantDebugOutput( bool flag ) { m_wantDebugOutput = flag; }
bool GetWantDebugOutput() const { return m_wantDebugOutput; }
+ // set use of best visual flag (see below)
+ void SetUseBestVisual( bool flag ) { m_useBestVisual = flag; }
+ bool GetUseBestVisual() const { return m_useBestVisual; }
+
// set/get printing mode: see wxPRINT_XXX constants.
//
// default behaviour is the normal one for Unix: always use PostScript
// printing.
virtual void SetPrintMode(int WXUNUSED(mode)) { }
int GetPrintMode() const { return wxPRINT_POSTSCRIPT; }
+
+ // called by toolkit-specific code to set the app status: active (we have
+ // focus) or not and also the last window which had focus before we were
+ // deactivated
+ virtual void SetActive(bool isActive, wxWindow *lastFocus);
#endif // wxUSE_GUI
// implementation only from now on
static wxAppInitializerFunction GetInitializerFunction()
{ return m_appInitFn; }
+ // process all events in the wxPendingEvents list
+ virtual void ProcessPendingEvents();
+
// access to the command line arguments
int argc;
wxChar **argv;
-//private:
protected:
// function used for dynamic wxApp creation
static wxAppInitializerFunction m_appInitFn;
m_appName, // app name
m_className; // class name
- // if TRUE, exit the main loop when the last top level window is deleted
- bool m_exitOnFrameDelete;
-
// TRUE if the application wants to get debug output
bool m_wantDebugOutput;
#if wxUSE_GUI
// the main top level window - may be NULL
wxWindow *m_topWindow;
+
+ // if TRUE, exit the main loop when the last top level window is deleted
+ bool m_exitOnFrameDelete;
+
+ // TRUE if the apps whats to use the best visual on systems where
+ // more than one are available (Sun, SGI, XFree86 4.0 ?)
+ bool m_useBestVisual;
+
+ // does any of our windows has focus?
+ bool m_isActive;
#endif // wxUSE_GUI
};
#include "wx/msw/app.h"
#elif defined(__WXMOTIF__)
#include "wx/motif/app.h"
+ #elif defined(__WXMGL__)
+ #include "wx/mgl/app.h"
#elif defined(__WXQT__)
#include "wx/qt/app.h"
#elif defined(__WXGTK__)
#include "wx/stubs/app.h"
#endif
#else // !GUI
- typedef wxAppBase wxApp;
+ // can't use typedef because wxApp forward declared as a class
+ class WXDLLEXPORT wxApp : public wxAppBase
+ {
+ };
#endif // GUI/!GUI
// ----------------------------------------------------------------------------
// event loop related functions only work in GUI programs
// ------------------------------------------------------
-#if wxUSE_GUI
-
// Force an exit from main loop
extern void WXDLLEXPORT wxExit();
// Yield to other apps/messages
extern bool WXDLLEXPORT wxYield();
+// Yield to other apps/messages
+extern void WXDLLEXPORT wxWakeUpIdle();
+
+// Post a message to the given eventhandler which will be processed during the
+// next event loop iteration
+inline void wxPostEvent(wxEvtHandler *dest, wxEvent& event)
+{
+ wxCHECK_RET( dest, wxT("need an object to post event to in wxPostEvent") );
+
+#if wxUSE_GUI
+ dest->AddPendingEvent(event);
+#else
+ dest->ProcessEvent(event);
#endif // wxUSE_GUI
+}
// console applications may avoid using DECLARE_APP and IMPLEMENT_APP macros
// and call these functions instead at the program startup and termination
// -------------------------------------------------------------------------
-#if wxUSE_NOGUI
+#if !wxUSE_GUI
// initialize the library (may be called as many times as needed, but each
// call to wxInitialize() must be matched by wxUninitialize())
// wxUninitialize()
extern void WXDLLEXPORT wxUninitialize();
-#endif // wxUSE_NOGUI
+// create an object of this class on stack to initialize/cleanup thel ibrary
+// automatically
+class WXDLLEXPORT wxInitializer
+{
+public:
+ // initialize the library
+ wxInitializer() { m_ok = wxInitialize(); }
+
+ // has the initialization been successful? (explicit test)
+ bool IsOk() const { return m_ok; }
+
+ // has the initialization been successful? (implicit test)
+ operator bool() const { return m_ok; }
+
+ // dtor only does clean up if we initialized the library properly
+ ~wxInitializer() { if ( m_ok ) wxUninitialize(); }
+
+private:
+ bool m_ok;
+};
+
+#endif // !wxUSE_GUI
// ----------------------------------------------------------------------------
// macros for dynamic creation of the application object
// be in your main program (e.g. hello.cpp). Now IMPLEMENT_APP should add this
// code if required.
-#if defined(__AIX__) || defined(__HPUX__)
+#if !wxUSE_GUI || defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__)
#define IMPLEMENT_WXWIN_MAIN \
extern int wxEntry( int argc, char *argv[] ); \
int main(int argc, char *argv[]) { return wxEntry(argc, argv); }
+#elif defined(__WXMAC__) && defined(__UNIX__)
+ // wxMac seems to have a specific wxEntry prototype
+ #define IMPLEMENT_WXWIN_MAIN \
+ extern int wxEntry( int argc, char *argv[], bool enterLoop = 1 ); \
+ int main(int argc, char *argv[]) { return wxEntry(argc, argv); }
#elif defined(__WXMSW__) && defined(WXUSINGDLL)
// NT defines APIENTRY, 3.x not
#if !defined(WXAPIENTRY)
- #ifdef __WATCOMC__
- #define WXAPIENTRY PASCAL
- #else
- #define WXAPIENTRY FAR PASCAL
- #endif
+ #define WXAPIENTRY WXFAR wxSTDCALL
#endif
+ #include <windows.h>
+ #include "wx/msw/winundef.h"
+
#define IMPLEMENT_WXWIN_MAIN \
- int WXAPIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,\
- LPSTR m_lpCmdLine, int nCmdShow )\
+ extern "C" int WXAPIENTRY WinMain(HINSTANCE hInstance,\
+ HINSTANCE hPrevInstance,\
+ LPSTR m_lpCmdLine, int nCmdShow)\
{\
- return wxEntry((WXHINSTANCE) hInstance, \
+ return wxEntry((WXHINSTANCE) hInstance,\
(WXHINSTANCE) hPrevInstance,\
m_lpCmdLine, nCmdShow);\
}
-
#else
#define IMPLEMENT_WXWIN_MAIN
#endif
-// use this macro exactly once, the argument is the name of the wxApp-derived
-// class which is the class of your application
-#define IMPLEMENT_APP(appname) \
- wxApp *wxCreateApp() { return new appname; } \
+// Use this macro exactly once, the argument is the name of the wxApp-derived
+// class which is the class of your application.
+#define IMPLEMENT_APP(appname) \
+ wxApp *wxCreateApp() { return new appname; } \
wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); \
appname& wxGetApp() { return *(appname *)wxTheApp; } \
IMPLEMENT_WXWIN_MAIN
+// Use this macro if you want to define your own main() or WinMain() function
+// and call wxEntry() from there.
+#define IMPLEMENT_APP_NO_MAIN(appname) \
+ wxApp *wxCreateApp() { return new appname; } \
+ wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); \
+ appname& wxGetApp() { return *(appname *)wxTheApp; }
+
#define DECLARE_APP(appname) extern appname& wxGetApp();
#endif