/////////////////////////////////////////////////////////////////////////////
// Name: app.h
-// Purpose: wxApp inclusion
+// Purpose: wxAppBase class and macros used for declaration of wxApp
+// derived class in the user code
// Author: Julian Smart
// Modified by:
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_APP_H_BASE_
#define _WX_APP_H_BASE_
-#ifdef __WXMSW__
-class WXDLLEXPORT wxApp;
-typedef wxApp* (*wxAppInitializerFunction) (void);
+#ifdef __GNUG__
+ #pragma interface "appbase.h"
#endif
-#include "wx/object.h"
+// ----------------------------------------------------------------------------
+// typedefs
+// ----------------------------------------------------------------------------
+
+#ifdef __WXMSW__
+ class WXDLLEXPORT wxApp;
+ typedef wxApp* (*wxAppInitializerFunction)();
+#else
+ // returning wxApp* won't work with gcc
+ #include "wx/object.h"
-#ifndef __WXMSW__
-typedef wxObject* (*wxAppInitializerFunction) (void); // returning wxApp* won't work with gcc
+ typedef wxObject* (*wxAppInitializerFunction)();
#endif
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+static const int wxPRINT_WINDOWS = 1;
+static const int wxPRINT_POSTSCRIPT = 2;
+
+// ----------------------------------------------------------------------------
+// the common part of wxApp implementations for all platforms
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxAppBase : public wxEvtHandler
+{
+public:
+ // the virtual functions which may/must be overridden in the derived class
+ // -----------------------------------------------------------------------
+
+ // 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.
+ //
+ // Override: always.
+ virtual bool OnInit() { return FALSE; };
+
+ // a platform-dependent version of OnInit(): the code here is likely to
+ // depend on the toolkit. default version does nothing.
+ //
+ // Override: rarely.
+ virtual bool OnInitGui() { return TRUE; }
+
+ // called to start program execution - the default version just enters
+ // the main GUI loop in which events are received and processed until
+ // the last window is not deleted (if GetExitOnFrameDelete) or
+ // ExitMainLoop() is called.
+ //
+ // Override: rarely.
+ virtual int OnRun() { return MainLoop(); };
+
+ // called after the main loop termination. This is a good place for
+ // cleaning up (it may be too late in dtor) and is also useful if you
+ // want to return some non-default exit code - this is just the return
+ // value of this method.
+ //
+ // Override: often.
+ virtual int OnExit() { return 0; }
+
+ // called when a fatal exception occurs, this function should take care
+ // not to do anything which might provoke a nested exception! It may be
+ // overridden if you wish to react somehow in non-default way (core
+ // dump under Unix, application crash under Windows) to fatal program
+ // errors, however extreme care should be taken if you don't want this
+ // function to crash.
+ //
+ // Override: rarely.
+ virtual void OnFatalException() { }
+
+ // the worker functions - usually not used directly by the user code
+ // -----------------------------------------------------------------
+
+ // execute the main GUI loop, the function returns when the loop ends
+ virtual int MainLoop() = 0;
+
+ // exit the main GUI loop during the next iteration (i.e. it does not
+ // stop the program immediately!)
+ virtual void ExitMainLoop() = 0;
+
+ // returns TRUE if the program is initialized
+ virtual bool Initialized() = 0;
+
+ // returns TRUE if there are unprocessed events in the event queue
+ virtual bool Pending() = 0;
+
+ // process the first event in the event queue (blocks until an event
+ // apperas if there are none currently)
+ virtual void Dispatch() = 0;
+
+ // application info: name, description, vendor
+ // -------------------------------------------
+
+ // NB: all these should be set by the application itself, there are no
+ // reasonable default except for the application name which is taken to
+ // be argv[0]
+
+ // set/get the application name
+ wxString GetAppName() const
+ {
+ if ( !m_appName )
+ return m_className;
+ else
+ return m_appName;
+ }
+ void SetAppName(const wxString& name) { m_appName = name; }
+
+ // set/get the app class name
+ wxString GetClassName() const { return m_className; }
+ void SetClassName(const wxString& name) { m_className = name; }
+
+ // set/get the vendor name
+ const wxString& GetVendorName() const { return m_vendorName; }
+ void SetVendorName(const wxString& name) { m_vendorName = name; }
+
+ // top level window functions
+ // --------------------------
+
+ // 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
+ {
+ if (m_topWindow)
+ return m_topWindow;
+ else if (wxTopLevelWindows.GetCount() > 0)
+ return wxTopLevelWindows.GetFirst()->GetData();
+ else
+ return (wxWindow *)NULL;
+ }
+
+ // control the exit behaviour: by default, the program will exit the
+ // main loop (and so, usually, terminate) when the last top-level
+ // program window is deleted. Beware that if you disabel this (with
+ // SetExitOnFrameDelete(FALSE)), you'll have to call ExitMainLoop()
+ // explicitly from somewhere.
+ void SetExitOnFrameDelete(bool flag) { m_exitOnFrameDelete = flag; }
+ bool GetExitOnFrameDelete() const { return m_exitOnFrameDelete; }
+
+ // miscellaneous customization functions
+ // -------------------------------------
+
+#if wxUSE_LOG
+ // override this function to create default log target of arbitrary
+ // user-defined class (default implementation creates a wxLogGui
+ // object) - this log object is used by default by all wxLogXXX()
+ // functions.
+ virtual wxLog *CreateLogTarget() { return new wxLogGui; }
+#endif // wxUSE_LOG
+
+
+ // get the standard icon used by wxWin dialogs - this allows the user
+ // to customize the standard dialogs. The 'which' parameter is one of
+ // wxICON_XXX values
+ virtual wxIcon GetStdIcon(int which) const = 0;
+
+ // VZ: what does this do exactly?
+ void SetWantDebugOutput( bool flag ) { m_wantDebugOutput = flag; }
+ bool GetWantDebugOutput() const { return m_wantDebugOutput; }
+
+ // 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; }
+
+ // implementation only from now on
+ // -------------------------------
+
+ // helpers for dynamic wxApp construction
+ static void SetInitializerFunction(wxAppInitializerFunction fn)
+ { m_appInitFn = fn; }
+ static wxAppInitializerFunction GetInitializerFunction()
+ { return m_appInitFn; }
+
+ // access to the command line arguments
+ int argc;
+ char **argv;
+
+//private:
+protected:
+ // function used for dynamic wxApp creation
+ static wxAppInitializerFunction m_appInitFn;
+
+ // application info (must be set from the user code)
+ wxString m_vendorName, // vendor name (ACME Inc)
+ 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;
+
+ // the main top level window - may be NULL
+ wxWindow *m_topWindow;
+};
+
+// ----------------------------------------------------------------------------
+// now include the declaration of the real class
+// ----------------------------------------------------------------------------
+
#if defined(__WXMSW__)
-#include "wx/msw/app.h"
+ #include "wx/msw/app.h"
#elif defined(__WXMOTIF__)
-#include "wx/motif/app.h"
+ #include "wx/motif/app.h"
#elif defined(__WXQT__)
-#include "wx/qt/app.h"
+ #include "wx/qt/app.h"
#elif defined(__WXGTK__)
-#include "wx/gtk/app.h"
+ #include "wx/gtk/app.h"
#elif defined(__WXMAC__)
-#include "wx/mac/app.h"
+ #include "wx/mac/app.h"
#elif defined(__WXSTUBS__)
-#include "wx/stubs/app.h"
+ #include "wx/stubs/app.h"
#endif
-// Having a global instance of this class allows
-// wxApp to be aware of the app creator function.
-// wxApp can then call this function to create a new
-// app object. Convoluted, but necessary.
+// ----------------------------------------------------------------------------
+// macros for dynamic creation of the application object
+// ----------------------------------------------------------------------------
+
+// Having a global instance of this class allows wxApp to be aware of the app
+// creator function. wxApp can then call this function to create a new app
+// object. Convoluted, but necessary.
class WXDLLEXPORT wxAppInitializer
{
public:
- wxAppInitializer(wxAppInitializerFunction fn)
- {
- wxApp::SetInitializerFunction(fn);
- }
+ wxAppInitializer(wxAppInitializerFunction fn)
+ { wxApp::SetInitializerFunction(fn); }
};
-// Here's a macro you can use if your compiler
-// really, really wants main() to be in your main program
-// (e.g. hello.cpp).
-// Now IMPLEMENT_APP should add this code if required.
+// Here's a macro you can use if your compiler really, really wants main() to
+// be in your main program (e.g. hello.cpp). Now IMPLEMENT_APP should add this
+// code if required.
#if defined(__AIX__) || defined(__HPUX__)
-#define IMPLEMENT_WXWIN_MAIN \
-extern int wxEntry( int argc, char *argv[] ); \
-int main(int argc, char *argv[]) { return wxEntry(argc, argv); }
-
+ #define IMPLEMENT_WXWIN_MAIN \
+ extern int wxEntry( int argc, char *argv[] ); \
+ 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
+ #endif
-// NT defines APIENTRY, 3.x not
-#if !defined(WXAPIENTRY)
-# ifdef __WATCOMC__
-# define WXAPIENTRY PASCAL
-# else
-# define WXAPIENTRY FAR PASCAL
-# endif
-#endif
-
-#define IMPLEMENT_WXWIN_MAIN \
-int WXAPIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,\
- LPSTR m_lpCmdLine, int nCmdShow )\
-{\
- return wxEntry((WXHINSTANCE) hInstance, (WXHINSTANCE) hPrevInstance,\
- m_lpCmdLine, nCmdShow);\
-}
+ #define IMPLEMENT_WXWIN_MAIN \
+ int WXAPIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,\
+ LPSTR m_lpCmdLine, int nCmdShow )\
+ {\
+ return wxEntry((WXHINSTANCE) hInstance, \
+ (WXHINSTANCE) hPrevInstance,\
+ m_lpCmdLine, nCmdShow);\
+ }
#else
-#define IMPLEMENT_WXWIN_MAIN
+ #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(void) { return new appname; } \
- wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); \
- appname& wxGetApp(void) { return *(appname *)wxTheApp; } \
- IMPLEMENT_WXWIN_MAIN
-
-#define DECLARE_APP(appname) \
- extern appname& wxGetApp(void) ;
+ wxApp *wxCreateApp() { return new appname; } \
+ wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); \
+ appname& wxGetApp() { return *(appname *)wxTheApp; } \
+ IMPLEMENT_WXWIN_MAIN
+#define DECLARE_APP(appname) extern appname& wxGetApp();
#endif
// _WX_APP_H_BASE_
// wxApp
//-----------------------------------------------------------------------------
-class wxApp: public wxEvtHandler
+class wxApp: public wxAppBase
{
- DECLARE_DYNAMIC_CLASS(wxApp)
-
- public:
+DECLARE_DYNAMIC_CLASS(wxApp)
+public:
wxApp();
~wxApp();
- static void SetInitializerFunction(wxAppInitializerFunction fn) { m_appInitFn = fn; }
- static wxAppInitializerFunction GetInitializerFunction() { return m_appInitFn; }
-
- /* override for altering the way wxGTK intializes the GUI (palette/visual/colorcube).
- * under wxMSW, OnInitGui() does nothing by default. when overriding this method,
- * the code in it is likely to be platform dependent, otherwise use OnInit(). */
+ /* override for altering the way wxGTK intializes the GUI
+ * (palette/visual/colorcube). under wxMSW, OnInitGui() does nothing by
+ * default. when overriding this method, the code in it is likely to be
+ * platform dependent, otherwise use OnInit(). */
virtual bool OnInitGui();
-
- /* override to create top level frame, display splash screen etc. */
- virtual bool OnInit() { return FALSE; }
-
- virtual int OnRun() { return MainLoop(); }
- virtual int OnExit() { return 0; }
-
- wxWindow *GetTopWindow();
- void SetTopWindow( wxWindow *win );
-
+
+ // override base class (pure) virtuals
virtual int MainLoop();
- void ExitMainLoop();
- bool Initialized();
+ virtual void ExitMainLoop();
+ virtual bool Initialized();
virtual bool Pending();
virtual void Dispatch();
- /** Returns the standard icons for the msg dialogs, implemented in
- src/generic/msgdlgg.cpp and src/gtk/app.cpp. */
virtual wxIcon GetStdIcon(int which) const;
- inline void SetWantDebugOutput( bool flag ) { m_wantDebugOutput = flag; }
- inline bool GetWantDebugOutput() { return m_wantDebugOutput; }
+ // implementation only from now on
void OnIdle( wxIdleEvent &event );
bool SendIdleEvents();
bool SendIdleEvents( wxWindow* win );
- inline wxString GetAppName() const
- { if (m_appName != "") return m_appName; else return m_className; }
- inline void SetAppName( const wxString& name ) { m_appName = name; }
-
- inline wxString GetClassName() const { return m_className; }
- inline void SetClassName( const wxString& name ) { m_className = name; }
-
- const wxString& GetVendorName() const { return m_vendorName; }
- void SetVendorName( const wxString& name ) { m_vendorName = name; }
-
- inline void SetExitOnFrameDelete( bool flag ) { m_exitOnFrameDelete = flag; }
- inline bool GetExitOnFrameDelete() const { return m_exitOnFrameDelete; }
-
- void SetPrintMode( int WXUNUSED(mode) ) {}
- int GetPrintMode() const { return wxPRINT_POSTSCRIPT; }
-
-#if wxUSE_LOG
- /* override this function to create default log target of arbitrary
- * user-defined classv (default implementation creates a wxLogGui object) */
- virtual wxLog *CreateLogTarget();
-#endif // wxUSE_LOG
-
- // implementation
-
static bool Initialize();
static bool InitialzeVisual();
static void CleanUp();
#endif
void DeletePendingObjects();
- /// This can be used to suppress the generation of Idle events.
- inline void SuppressIdleEvents(bool arg = TRUE) { m_suppressIdleEvents = arg; }
- inline bool GetSuppressIdleEvents() const { return m_suppressIdleEvents; }
-
+ // This can be used to suppress the generation of Idle events.
+ void SuppressIdleEvents(bool arg = TRUE) { m_suppressIdleEvents = arg; }
+ bool GetSuppressIdleEvents() const { return m_suppressIdleEvents; }
+
bool m_initialized;
- bool m_exitOnFrameDelete;
- bool m_wantDebugOutput;
- wxWindow *m_topWindow;
-
+
gint m_idleTag;
#if wxUSE_THREADS
gint m_wakeUpTimerTag;
#endif
unsigned char *m_colorCube;
- int argc;
- char **argv;
-
- wxString m_vendorName;
- wxString m_appName;
- wxString m_className;
-
- static wxAppInitializerFunction m_appInitFn;
- private:
+private:
/// Set to TRUE while we are in wxYield().
bool m_suppressIdleEvents;
- DECLARE_EVENT_TABLE()
+
+ DECLARE_EVENT_TABLE()
};
#endif // __GTKAPPH__
// wxApp
//-----------------------------------------------------------------------------
-class wxApp: public wxEvtHandler
+class wxApp: public wxAppBase
{
- DECLARE_DYNAMIC_CLASS(wxApp)
-
- public:
+DECLARE_DYNAMIC_CLASS(wxApp)
+public:
wxApp();
~wxApp();
- static void SetInitializerFunction(wxAppInitializerFunction fn) { m_appInitFn = fn; }
- static wxAppInitializerFunction GetInitializerFunction() { return m_appInitFn; }
-
- /* override for altering the way wxGTK intializes the GUI (palette/visual/colorcube).
- * under wxMSW, OnInitGui() does nothing by default. when overriding this method,
- * the code in it is likely to be platform dependent, otherwise use OnInit(). */
+ /* override for altering the way wxGTK intializes the GUI
+ * (palette/visual/colorcube). under wxMSW, OnInitGui() does nothing by
+ * default. when overriding this method, the code in it is likely to be
+ * platform dependent, otherwise use OnInit(). */
virtual bool OnInitGui();
-
- /* override to create top level frame, display splash screen etc. */
- virtual bool OnInit() { return FALSE; }
-
- virtual int OnRun() { return MainLoop(); }
- virtual int OnExit() { return 0; }
-
- wxWindow *GetTopWindow();
- void SetTopWindow( wxWindow *win );
-
+
+ // override base class (pure) virtuals
virtual int MainLoop();
- void ExitMainLoop();
- bool Initialized();
+ virtual void ExitMainLoop();
+ virtual bool Initialized();
virtual bool Pending();
virtual void Dispatch();
- /** Returns the standard icons for the msg dialogs, implemented in
- src/generic/msgdlgg.cpp and src/gtk/app.cpp. */
virtual wxIcon GetStdIcon(int which) const;
- inline void SetWantDebugOutput( bool flag ) { m_wantDebugOutput = flag; }
- inline bool GetWantDebugOutput() { return m_wantDebugOutput; }
+ // implementation only from now on
void OnIdle( wxIdleEvent &event );
bool SendIdleEvents();
bool SendIdleEvents( wxWindow* win );
- inline wxString GetAppName() const
- { if (m_appName != "") return m_appName; else return m_className; }
- inline void SetAppName( const wxString& name ) { m_appName = name; }
-
- inline wxString GetClassName() const { return m_className; }
- inline void SetClassName( const wxString& name ) { m_className = name; }
-
- const wxString& GetVendorName() const { return m_vendorName; }
- void SetVendorName( const wxString& name ) { m_vendorName = name; }
-
- inline void SetExitOnFrameDelete( bool flag ) { m_exitOnFrameDelete = flag; }
- inline bool GetExitOnFrameDelete() const { return m_exitOnFrameDelete; }
-
- void SetPrintMode( int WXUNUSED(mode) ) {}
- int GetPrintMode() const { return wxPRINT_POSTSCRIPT; }
-
-#if wxUSE_LOG
- /* override this function to create default log target of arbitrary
- * user-defined classv (default implementation creates a wxLogGui object) */
- virtual wxLog *CreateLogTarget();
-#endif // wxUSE_LOG
-
- // implementation
-
static bool Initialize();
static bool InitialzeVisual();
static void CleanUp();
#endif
void DeletePendingObjects();
- /// This can be used to suppress the generation of Idle events.
- inline void SuppressIdleEvents(bool arg = TRUE) { m_suppressIdleEvents = arg; }
- inline bool GetSuppressIdleEvents() const { return m_suppressIdleEvents; }
-
+ // This can be used to suppress the generation of Idle events.
+ void SuppressIdleEvents(bool arg = TRUE) { m_suppressIdleEvents = arg; }
+ bool GetSuppressIdleEvents() const { return m_suppressIdleEvents; }
+
bool m_initialized;
- bool m_exitOnFrameDelete;
- bool m_wantDebugOutput;
- wxWindow *m_topWindow;
-
+
gint m_idleTag;
#if wxUSE_THREADS
gint m_wakeUpTimerTag;
#endif
unsigned char *m_colorCube;
- int argc;
- char **argv;
-
- wxString m_vendorName;
- wxString m_appName;
- wxString m_className;
-
- static wxAppInitializerFunction m_appInitFn;
- private:
+private:
/// Set to TRUE while we are in wxYield().
bool m_suppressIdleEvents;
- DECLARE_EVENT_TABLE()
+
+ DECLARE_EVENT_TABLE()
};
#endif // __GTKAPPH__
class WXDLLEXPORT wxKeyEvent;
class WXDLLEXPORT wxLog;
-static const int wxPRINT_WINDOWS = 1;
-static const int wxPRINT_POSTSCRIPT = 2;
-
WXDLLEXPORT_DATA(extern wxApp*) wxTheApp;
// Force an exit from main loop
// Represents the application. Derive OnInit and declare
// a new App object to start application
-class WXDLLEXPORT wxApp: public wxEvtHandler
+class WXDLLEXPORT wxApp : public wxAppBase
{
- DECLARE_DYNAMIC_CLASS(wxApp)
- wxApp();
- ~wxApp();
-
- static void SetInitializerFunction(wxAppInitializerFunction fn) { m_appInitFn = fn; }
- static wxAppInitializerFunction GetInitializerFunction() { return m_appInitFn; }
-
- virtual int MainLoop();
- void ExitMainLoop();
- bool Initialized();
- virtual bool Pending() ;
- virtual void Dispatch() ;
-
- void OnIdle(wxIdleEvent& event);
- void OnEndSession(wxCloseEvent& event);
- void OnQueryEndSession(wxCloseEvent& event);
-
- // Generic
- virtual bool OnInit() { return FALSE; };
-
- // No specific tasks to do here.
- virtual bool OnInitGui() { return TRUE; }
-
- // Called to set off the main loop
- virtual int OnRun() { return MainLoop(); };
- virtual int OnExit() { return 0; }
- /** Returns the standard icons for the msg dialogs, implemented in
- src/generic/msgdlgg.cpp and src/gtk/app.cpp. */
- virtual wxIcon GetStdIcon(int which) const;
-
- // called when a fatal exception occurs, this function should take care not
- // to do anything which might provoke a nested exception!
- virtual void OnFatalException() { }
+ DECLARE_DYNAMIC_CLASS(wxApp)
- void SetPrintMode(int mode) { m_printMode = mode; }
- int GetPrintMode() const { return m_printMode; }
-
- void SetExitOnFrameDelete(bool flag) { m_exitOnFrameDelete = flag; }
- bool GetExitOnFrameDelete() const { return m_exitOnFrameDelete; }
-
- const wxString& GetAppName() const {
- if (m_appName != _T(""))
- return m_appName;
- else return m_className;
- }
-
- void SetAppName(const wxString& name) { m_appName = name; };
- wxString GetClassName() const { return m_className; }
- void SetClassName(const wxString& name) { m_className = name; }
-
- void SetVendorName(const wxString& vendorName) { m_vendorName = vendorName; }
- const wxString& GetVendorName() const { return m_vendorName; }
+public:
+ wxApp();
+ virtual ~wxApp();
- wxWindow *GetTopWindow() const ;
- void SetTopWindow(wxWindow *win) { m_topWindow = win; }
+ // override base class (pure) virtuals
+ virtual int MainLoop();
+ virtual void ExitMainLoop();
+ virtual bool Initialized();
+ virtual bool Pending() ;
+ virtual void Dispatch() ;
- void SetWantDebugOutput(bool flag) { m_wantDebugOutput = flag; }
- bool GetWantDebugOutput() { return m_wantDebugOutput; }
+ virtual wxIcon GetStdIcon(int which) const;
- // Send idle event to all top-level windows.
- // Returns TRUE if more idle time is requested.
- bool SendIdleEvents();
+ virtual void SetPrintMode(int mode) { m_printMode = mode; }
+ virtual int GetPrintMode() const { return m_printMode; }
- // Send idle event to window and all subwindows
- // Returns TRUE if more idle time is requested.
- bool SendIdleEvents(wxWindow* win);
+ // implementation only
+ void OnIdle(wxIdleEvent& event);
+ void OnEndSession(wxCloseEvent& event);
+ void OnQueryEndSession(wxCloseEvent& event);
- void SetAuto3D(bool flag) { m_auto3D = flag; }
- bool GetAuto3D() const { return m_auto3D; }
+ // Send idle event to all top-level windows.
+ // Returns TRUE if more idle time is requested.
+ bool SendIdleEvents();
- // Creates a log object
- virtual wxLog* CreateLogTarget();
+ // Send idle event to window and all subwindows
+ // Returns TRUE if more idle time is requested.
+ bool SendIdleEvents(wxWindow* win);
-public:
- int argc;
- wxChar ** argv;
+ void SetAuto3D(bool flag) { m_auto3D = flag; }
+ bool GetAuto3D() const { return m_auto3D; }
protected:
- bool m_wantDebugOutput ;
- wxString m_className;
- wxString m_appName,
- m_vendorName;
- wxWindow * m_topWindow;
- bool m_exitOnFrameDelete;
- bool m_showOnInit;
- int m_printMode; // wxPRINT_WINDOWS, wxPRINT_POSTSCRIPT
- bool m_auto3D ; // Always use 3D controls, except
- // where overriden
- static wxAppInitializerFunction m_appInitFn;
-
-/* Windows-specific wxApp definitions */
+ bool m_showOnInit;
+ int m_printMode; // wxPRINT_WINDOWS, wxPRINT_POSTSCRIPT
+ bool m_auto3D ; // Always use 3D controls, except where overriden
+
+ /* Windows-specific wxApp definitions */
public:
- // Implementation
- static bool Initialize();
- static void CleanUp();
-
- static bool RegisterWindowClasses();
- // Convert Windows to argc, argv style
- void ConvertToStandardCommandArgs(char* p);
- virtual bool DoMessage();
- virtual bool ProcessMessage(WXMSG* pMsg);
- void DeletePendingObjects();
- bool ProcessIdle();
+ // Implementation
+ static bool Initialize();
+ static void CleanUp();
+
+ static bool RegisterWindowClasses();
+ // Convert Windows to argc, argv style
+ void ConvertToStandardCommandArgs(char* p);
+ virtual bool DoMessage();
+ virtual bool ProcessMessage(WXMSG* pMsg);
+ void DeletePendingObjects();
+ bool ProcessIdle();
#if wxUSE_THREADS
- void ProcessPendingEvents();
+ void ProcessPendingEvents();
#endif
- int GetComCtl32Version() const;
+ int GetComCtl32Version() const;
public:
- int m_nCmdShow;
+ int m_nCmdShow;
protected:
- bool m_keepGoing ;
+ bool m_keepGoing ;
-DECLARE_EVENT_TABLE()
+ DECLARE_EVENT_TABLE()
};
#if !defined(_WINDLL) || (defined(_WINDLL) && defined(WXMAKINGDLL))
wxDllType
wxDllLoader::GetProgramHandle(void)
{
-#ifdef __WXGTK__
- return dlopen(NULL, RTLD_NOW/*RTLD_LAZY*/);
+#ifdef __UNIX__
+ return dlopen(NULL, RTLD_NOW/*RTLD_LAZY*/);
#else
-#pragma warning "Not implemented, please fix!"
- return 0;
+ wxFAIL_MSG(_("This method is not implemented under Windows"));
+
+ return 0;
#endif
}
// icons
// ----------------------------------------------------------------------------
-
-
#if !USE_SHARED_LIBRARY
BEGIN_EVENT_TABLE(wxGenericMessageDialog, wxDialog)
EVT_BUTTON(wxID_YES, wxGenericMessageDialog::OnYes)
IMPLEMENT_CLASS(wxGenericMessageDialog, wxDialog)
#endif
-#ifdef _WXGTK__
-# include "wx/gtk/info.xpm"
-# include "wx/gtk/error.xpm"
-# include "wx/gtk/question.xpm"
-# include "wx/gtk/warning.xpm"
-#else
- // MSW icons are in the ressources, for all other platforms - in XPM files
-# ifndef __WXMSW__
-# include "wx/generic/info.xpm"
-# include "wx/generic/question.xpm"
-# include "wx/generic/warning.xpm"
-# include "wx/generic/error.xpm"
-# endif // __WXMSW__
-#endif
-
-wxIcon
-wxApp::GetStdIcon(int which) const
-{
- switch(which)
- {
- case wxICON_INFORMATION:
- return wxIcon(info_xpm);
- break;
- case wxICON_HAND:
- return wxIcon(error_xpm);
- break;
- case wxICON_QUESTION:
- return wxIcon(question_xpm);
- break;
- case wxICON_EXCLAMATION:
- return wxIcon(warning_xpm);
- break;
- default:
- wxFAIL_MSG("requested non existent standard icon");
- return wxIcon(error_xpm);
- break;
- }
-}
-
-
wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent,
const wxString& message,
const wxString& caption,
might have been changed (it also will update other things set from
OnUpdateUI() which is a nice (and desired) side effect) */
while (wxTheApp->ProcessIdle()) { }
-
+
#if 0
for ( wxWindowList::Node *node = wxTopLevelWindows.GetFirst();
node;
while (gtk_events_pending())
gtk_main_iteration();
}
-
+
return TRUE;
}
gint wxapp_idle_callback( gpointer WXUNUSED(data) )
{
if (!wxTheApp) return TRUE;
-
+
#if (GTK_MINOR_VERSION > 0)
/* when getting called from GDK's idle handler we
are no longer within GDK's grab on the GUI
thread so we must lock it here ourselves */
GDK_THREADS_ENTER ();
#endif
-
+
/* sent idle event to all who request them */
while (wxTheApp->ProcessIdle()) { }
-
+
/* we don't want any more idle events until the next event is
sent to wxGTK */
gtk_idle_remove( wxTheApp->m_idleTag );
once each time after the event queue has been completely
emptied */
g_isIdle = TRUE;
-
+
#if (GTK_MINOR_VERSION > 0)
/* release lock again */
GDK_THREADS_LEAVE ();
indicating that the idle is over. */
wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
-
+
g_isIdle = FALSE;
}
{
gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag );
wxTheApp->m_wakeUpTimerTag = 0;
-
+
#if (GTK_MINOR_VERSION > 0)
- // when getting called from GDK's time-out handler
+ // when getting called from GDK's time-out handler
// we are no longer within GDK's grab on the GUI
// thread so we must lock it here ourselves
GDK_THREADS_ENTER ();
#endif
-
+
// unblock other threads wishing to do some GUI things
wxMutexGuiLeave();
-
+
// wake up other threads
wxUsleep( 1 );
-
+
// block other thread again
wxMutexGuiEnter();
-
+
#if (GTK_MINOR_VERSION > 0)
// release lock again
GDK_THREADS_LEAVE ();
#endif
-
+
wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
-
+
return TRUE;
}
#endif
m_exitOnFrameDelete = TRUE;
m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
-
+
/*
#if wxUSE_THREADS
m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
if (m_wakeUpTimerTag) gtk_timeout_remove( m_wakeUpTimerTag );
#endif
*/
-
+
if (m_colorCube) free(m_colorCube);
}
{
GdkVisual *visual = gdk_visual_get_system();
- /* on some machines, the default visual is just 256 colours, so
+ /* on some machines, the default visual is just 256 colours, so
we make sure we get the best. this can sometimes be wasteful,
of course, but what do these guys pay $30.000 for? */
/*
GdkColormap *colormap = gdk_colormap_new( vis, FALSE );
gtk_widget_set_default_colormap( colormap );
-
- visual = vis;
+
+ visual = vis;
}
*/
-
+
/* Nothing to do for 15, 16, 24, 32 bit displays */
if (visual->depth > 8) return TRUE;
int bdiff = ((bb << 8) - colors[i].blue);
int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);
if (sum < max)
- {
+ {
index = i; max = sum;
}
}
}
- else
- {
+ else
+ {
#if (GTK_MINOR_VERSION > 0)
- /* assume 8-bit true or static colors. this really
- exists. */
- GdkVisual* vis = gdk_colormap_get_visual( cmap );
- index = (r >> (5 - vis->red_prec)) << vis->red_shift;
- index |= (g >> (5 - vis->green_prec)) << vis->green_shift;
- index |= (b >> (5 - vis->blue_prec)) << vis->blue_shift;
+ /* assume 8-bit true or static colors. this really
+ exists. */
+ GdkVisual* vis = gdk_colormap_get_visual( cmap );
+ index = (r >> (5 - vis->red_prec)) << vis->red_shift;
+ index |= (g >> (5 - vis->green_prec)) << vis->green_shift;
+ index |= (b >> (5 - vis->blue_prec)) << vis->blue_shift;
#else
wxFAIL_MSG( _T("Unsupported graphics hardware") );
#endif
- }
+ }
m_colorCube[ (r*1024) + (g*32) + b ] = index;
}
}
}
}
-wxWindow *wxApp::GetTopWindow()
-{
- if (m_topWindow)
- return m_topWindow;
- else if (wxTopLevelWindows.GetCount() > 0)
- return wxTopLevelWindows.GetFirst()->GetData();
- else
- return NULL;
-}
-
-void wxApp::SetTopWindow( wxWindow *win )
-{
- m_topWindow = win;
-}
-
bool wxApp::Initialize()
{
wxBuffer = new wxChar[BUFSIZ + 512];
delete oldLog;
}
-wxLog *wxApp::CreateLogTarget()
-{
- return new wxLogGui;
-}
#endif // wxUSE_LOG
//-----------------------------------------------------------------------------
gtk_init( &argc, &argv );
wxSetDetectableAutoRepeat( TRUE );
-
+
if (!wxApp::Initialize())
return -1;
if ( retValue == 0 )
{
/* delete pending toplevel windows (typically a single
- dialog) so that, if there isn't any left, we don't
- call OnRun() */
+ dialog) so that, if there isn't any left, we don't
+ call OnRun() */
wxTheApp->DeletePendingObjects();
-
+
wxTheApp->m_initialized = wxTopLevelWindows.GetCount() != 0;
if (wxTheApp->Initialized())
- {
+ {
retValue = wxTheApp->OnRun();
wxWindow *topWindow = wxTheApp->GetTopWindow();
delete topWindow;
wxTheApp->SetTopWindow( (wxWindow*) NULL );
}
- }
+ }
wxTheApp->OnExit();
}
}
return retValue;
}
-# include "wx/gtk/info.xpm"
-# include "wx/gtk/error.xpm"
-# include "wx/gtk/question.xpm"
-# include "wx/gtk/warning.xpm"
-
+#include "wx/gtk/info.xpm"
+#include "wx/gtk/error.xpm"
+#include "wx/gtk/question.xpm"
+#include "wx/gtk/warning.xpm"
+
wxIcon
wxApp::GetStdIcon(int which) const
{
- switch(which)
- {
- case wxICON_INFORMATION:
- return wxIcon(info_xpm);
- break;
- case wxICON_HAND:
- return wxIcon(error_xpm);
- break;
- case wxICON_QUESTION:
- return wxIcon(question_xpm);
- break;
- case wxICON_EXCLAMATION:
- return wxIcon(warning_xpm);
- break;
- default:
- wxFAIL_MSG("requested non existent standard icon");
- return wxIcon(error_xpm);
- break;
- }
+ switch(which)
+ {
+ case wxICON_INFORMATION:
+ return wxIcon(info_xpm);
+
+ case wxICON_QUESTION:
+ return wxIcon(question_xpm);
+
+ case wxICON_EXCLAMATION:
+ return wxIcon(warning_xpm);
+
+ default:
+ wxFAIL_MSG("requested non existent standard icon");
+ // still fall through
+
+ case wxICON_HAND:
+ return wxIcon(error_xpm);
+ }
}
might have been changed (it also will update other things set from
OnUpdateUI() which is a nice (and desired) side effect) */
while (wxTheApp->ProcessIdle()) { }
-
+
#if 0
for ( wxWindowList::Node *node = wxTopLevelWindows.GetFirst();
node;
while (gtk_events_pending())
gtk_main_iteration();
}
-
+
return TRUE;
}
gint wxapp_idle_callback( gpointer WXUNUSED(data) )
{
if (!wxTheApp) return TRUE;
-
+
#if (GTK_MINOR_VERSION > 0)
/* when getting called from GDK's idle handler we
are no longer within GDK's grab on the GUI
thread so we must lock it here ourselves */
GDK_THREADS_ENTER ();
#endif
-
+
/* sent idle event to all who request them */
while (wxTheApp->ProcessIdle()) { }
-
+
/* we don't want any more idle events until the next event is
sent to wxGTK */
gtk_idle_remove( wxTheApp->m_idleTag );
once each time after the event queue has been completely
emptied */
g_isIdle = TRUE;
-
+
#if (GTK_MINOR_VERSION > 0)
/* release lock again */
GDK_THREADS_LEAVE ();
indicating that the idle is over. */
wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
-
+
g_isIdle = FALSE;
}
{
gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag );
wxTheApp->m_wakeUpTimerTag = 0;
-
+
#if (GTK_MINOR_VERSION > 0)
- // when getting called from GDK's time-out handler
+ // when getting called from GDK's time-out handler
// we are no longer within GDK's grab on the GUI
// thread so we must lock it here ourselves
GDK_THREADS_ENTER ();
#endif
-
+
// unblock other threads wishing to do some GUI things
wxMutexGuiLeave();
-
+
// wake up other threads
wxUsleep( 1 );
-
+
// block other thread again
wxMutexGuiEnter();
-
+
#if (GTK_MINOR_VERSION > 0)
// release lock again
GDK_THREADS_LEAVE ();
#endif
-
+
wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
-
+
return TRUE;
}
#endif
m_exitOnFrameDelete = TRUE;
m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
-
+
/*
#if wxUSE_THREADS
m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
if (m_wakeUpTimerTag) gtk_timeout_remove( m_wakeUpTimerTag );
#endif
*/
-
+
if (m_colorCube) free(m_colorCube);
}
{
GdkVisual *visual = gdk_visual_get_system();
- /* on some machines, the default visual is just 256 colours, so
+ /* on some machines, the default visual is just 256 colours, so
we make sure we get the best. this can sometimes be wasteful,
of course, but what do these guys pay $30.000 for? */
/*
GdkColormap *colormap = gdk_colormap_new( vis, FALSE );
gtk_widget_set_default_colormap( colormap );
-
- visual = vis;
+
+ visual = vis;
}
*/
-
+
/* Nothing to do for 15, 16, 24, 32 bit displays */
if (visual->depth > 8) return TRUE;
int bdiff = ((bb << 8) - colors[i].blue);
int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);
if (sum < max)
- {
+ {
index = i; max = sum;
}
}
}
- else
- {
+ else
+ {
#if (GTK_MINOR_VERSION > 0)
- /* assume 8-bit true or static colors. this really
- exists. */
- GdkVisual* vis = gdk_colormap_get_visual( cmap );
- index = (r >> (5 - vis->red_prec)) << vis->red_shift;
- index |= (g >> (5 - vis->green_prec)) << vis->green_shift;
- index |= (b >> (5 - vis->blue_prec)) << vis->blue_shift;
+ /* assume 8-bit true or static colors. this really
+ exists. */
+ GdkVisual* vis = gdk_colormap_get_visual( cmap );
+ index = (r >> (5 - vis->red_prec)) << vis->red_shift;
+ index |= (g >> (5 - vis->green_prec)) << vis->green_shift;
+ index |= (b >> (5 - vis->blue_prec)) << vis->blue_shift;
#else
wxFAIL_MSG( _T("Unsupported graphics hardware") );
#endif
- }
+ }
m_colorCube[ (r*1024) + (g*32) + b ] = index;
}
}
}
}
-wxWindow *wxApp::GetTopWindow()
-{
- if (m_topWindow)
- return m_topWindow;
- else if (wxTopLevelWindows.GetCount() > 0)
- return wxTopLevelWindows.GetFirst()->GetData();
- else
- return NULL;
-}
-
-void wxApp::SetTopWindow( wxWindow *win )
-{
- m_topWindow = win;
-}
-
bool wxApp::Initialize()
{
wxBuffer = new wxChar[BUFSIZ + 512];
delete oldLog;
}
-wxLog *wxApp::CreateLogTarget()
-{
- return new wxLogGui;
-}
#endif // wxUSE_LOG
//-----------------------------------------------------------------------------
gtk_init( &argc, &argv );
wxSetDetectableAutoRepeat( TRUE );
-
+
if (!wxApp::Initialize())
return -1;
if ( retValue == 0 )
{
/* delete pending toplevel windows (typically a single
- dialog) so that, if there isn't any left, we don't
- call OnRun() */
+ dialog) so that, if there isn't any left, we don't
+ call OnRun() */
wxTheApp->DeletePendingObjects();
-
+
wxTheApp->m_initialized = wxTopLevelWindows.GetCount() != 0;
if (wxTheApp->Initialized())
- {
+ {
retValue = wxTheApp->OnRun();
wxWindow *topWindow = wxTheApp->GetTopWindow();
delete topWindow;
wxTheApp->SetTopWindow( (wxWindow*) NULL );
}
- }
+ }
wxTheApp->OnExit();
}
}
return retValue;
}
-# include "wx/gtk/info.xpm"
-# include "wx/gtk/error.xpm"
-# include "wx/gtk/question.xpm"
-# include "wx/gtk/warning.xpm"
-
+#include "wx/gtk/info.xpm"
+#include "wx/gtk/error.xpm"
+#include "wx/gtk/question.xpm"
+#include "wx/gtk/warning.xpm"
+
wxIcon
wxApp::GetStdIcon(int which) const
{
- switch(which)
- {
- case wxICON_INFORMATION:
- return wxIcon(info_xpm);
- break;
- case wxICON_HAND:
- return wxIcon(error_xpm);
- break;
- case wxICON_QUESTION:
- return wxIcon(question_xpm);
- break;
- case wxICON_EXCLAMATION:
- return wxIcon(warning_xpm);
- break;
- default:
- wxFAIL_MSG("requested non existent standard icon");
- return wxIcon(error_xpm);
- break;
- }
+ switch(which)
+ {
+ case wxICON_INFORMATION:
+ return wxIcon(info_xpm);
+
+ case wxICON_QUESTION:
+ return wxIcon(question_xpm);
+
+ case wxICON_EXCLAMATION:
+ return wxIcon(warning_xpm);
+
+ default:
+ wxFAIL_MSG("requested non existent standard icon");
+ // still fall through
+
+ case wxICON_HAND:
+ return wxIcon(error_xpm);
+ }
}
}
}
-wxLog* wxApp::CreateLogTarget()
-{
- return new wxLogGui;
-}
-
-wxWindow* wxApp::GetTopWindow() const
-{
- if (m_topWindow)
- return m_topWindow;
- else if (wxTopLevelWindows.GetCount() > 0)
- return wxTopLevelWindows.GetFirst()->GetData();
- else
- return NULL;
-}
-
int wxApp::GetComCtl32Version() const
{
// have we loaded COMCTL32 yet?
return TRUE;
}
+
wxIcon
wxApp::GetStdIcon(int which) const
{
- switch(which)
- {
- case wxICON_INFORMATION:
- return wxIcon("wxICON_INFO");
- break;
- case wxICON_HAND:
- return wxIcon("wxICON_ERROR");
- break;
- case wxICON_QUESTION:
- return wxIcon("wxICON_QUESTION");
- break;
- case wxICON_EXCLAMATION:
- return wxIcon("wxICON_WARNING");
- break;
- default:
- wxFAIL_MSG("requested non existent standard icon");
- return wxIcon("wxICON_ERROR");
- break;
- }
+ switch(which)
+ {
+ case wxICON_INFORMATION:
+ return wxIcon("wxICON_INFO");
+
+ case wxICON_QUESTION:
+ return wxIcon("wxICON_QUESTION");
+
+ case wxICON_EXCLAMATION:
+ return wxIcon("wxICON_WARNING");
+
+ default:
+ wxFAIL_MSG(_T("requested non existent standard icon"));
+ // still fall through
+
+ case wxICON_HAND:
+ return wxIcon("wxICON_ERROR");
+ }
}
int sizeFlags)
{
wxControl::DoSetSize(x, y, width, height, sizeFlags);
-
- // VZ: for unknown (to me) reasons, if we don't do this, the combobox
- // somehow is hidden by the static boxes, although static boxes do
- // put themselves at the very end of Z-order.
- if ( !::SetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOSIZE) )
- {
- wxLogLastError(_T("SetWindowPos"));
- }
}
#endif
{
wxControl::DoSetSize(x, y, width, height, sizeFlags);
+ return;
+
// the static box should always be on the bottom of the Z-order, otherwise
// it may hide controls which are positioned inside it
if ( !::SetWindowPos(GetHwnd(), HWND_TOP, 0, 0, 0, 0,
// Alternatively, just make sure that wxStaticBox is always at the back! There are probably
// few other circumstances where it matters about child clipping. But what about painting onto
// to panel, inside a groupbox? Doesn't appear, because the box wipes it out.
- wxWindow *parent = GetParent();
+ wxWindow *parent = 0; //GetParent();
if ( parent && parent->GetHWND() && (::GetWindowLong((HWND) parent->GetHWND(), GWL_STYLE) & WS_CLIPCHILDREN) )
{
// TODO: May in fact need to generate a paint event for inside this
long wxStaticBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
- if ( 0 )//nMsg == WM_NCHITTEST)
+ if ( nMsg == WM_NCHITTEST)
{
int xPos = LOWORD(lParam); // horizontal position of cursor
int yPos = HIWORD(lParam); // vertical position of cursor