From e2478fde622a16d25c66690af353dfdc37e7b582 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 24 Jun 2003 00:56:19 +0000 Subject: [PATCH] wxBase/GUI separation: 1st step, wxMSW should build, all the rest is broken git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21342 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/msw/tmake/filelist.txt | 23 +- distrib/msw/tmake/vc6msw.t | 16 +- docs/latex/wx/cppconst.tex | 16 +- include/wx/app.h | 416 ++--- include/wx/apptrait.h | 172 ++ include/wx/build.h | 4 +- include/wx/cocoa/app.h | 4 + include/wx/event.h | 9 + include/wx/fmappriv.h | 74 + include/wx/fontmap.h | 205 ++- include/wx/fs_mem.h | 56 +- include/wx/gtk/app.h | 4 + include/wx/gtk1/app.h | 4 + include/wx/mac/app.h | 4 + include/wx/motif/app.h | 4 + include/wx/msgout.h | 12 + include/wx/msw/app.h | 2 + include/wx/msw/apptbase.h | 46 + include/wx/msw/apptrait.h | 44 + include/wx/msw/missing.h | 46 +- include/wx/os2/app.h | 6 +- include/wx/unix/apptbase.h | 63 + include/wx/unix/apptrait.h | 46 + include/wx/unix/execute.h | 43 + include/wx/unix/pipe.h | 95 ++ include/wx/volume.h | 78 +- include/wx/x11/app.h | 4 + src/cocoa/app.mm | 15 +- src/common/appbase.cpp | 735 +++++++++ src/common/appcmn.cpp | 594 +------ src/common/artstd.cpp | 18 - src/common/fmapbase.cpp | 642 ++++++++ src/common/fontmap.cpp | 761 ++------- src/common/fs_mem.cpp | 66 +- src/common/init.cpp | 31 +- src/common/log.cpp | 291 +--- src/common/msgout.cpp | 78 +- src/common/socket.cpp | 71 +- src/common/stopwatch.cpp | 344 ++++ src/common/timercmn.cpp | 334 +--- src/gtk/app.cpp | 25 +- src/gtk1/app.cpp | 25 +- src/mac/app.cpp | 6 +- src/mac/carbon/app.cpp | 6 +- src/mgl/app.cpp | 11 +- src/motif/app.cpp | 22 +- src/motif/evtloop.cpp | 2 +- src/msw/app.cpp | 140 +- src/msw/basemsw.cpp | 61 + src/msw/fontutil.cpp | 81 +- src/msw/main.cpp | 89 +- src/msw/mslu.cpp | 6 +- src/msw/thread.cpp | 29 +- src/msw/utils.cpp | 651 +------- src/msw/utilsexc.cpp | 104 +- src/msw/utilsgui.cpp | 444 +++++ src/msw/volume.cpp | 107 +- src/os2/app.cpp | 9 +- src/unix/baseunix.cpp | 108 ++ src/unix/utilsunx.cpp | 397 ++--- src/wxBase.dsp | 36 +- src/wxMSW.dsp | 2805 ++++++++++++++++++++++++++++++++ src/wxWindows.dsp | 217 ++- src/x11/app.cpp | 18 +- 64 files changed, 7328 insertions(+), 3547 deletions(-) create mode 100644 include/wx/apptrait.h create mode 100644 include/wx/fmappriv.h create mode 100644 include/wx/msw/apptbase.h create mode 100644 include/wx/msw/apptrait.h create mode 100644 include/wx/unix/apptbase.h create mode 100644 include/wx/unix/apptrait.h create mode 100644 include/wx/unix/pipe.h create mode 100644 src/common/appbase.cpp create mode 100644 src/common/fmapbase.cpp create mode 100644 src/common/stopwatch.cpp create mode 100644 src/msw/basemsw.cpp create mode 100644 src/msw/utilsgui.cpp create mode 100644 src/unix/baseunix.cpp create mode 100644 src/wxMSW.dsp diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index f5a6836194..a46024c829 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -120,7 +120,8 @@ treectlg.cpp Generic wizard.cpp Generic accesscmn.cpp Common -appcmn.cpp Common Base +appbase.cpp Common Base +appcmn.cpp Common artprov.cpp Common artstd.cpp Common bmpbase.cpp Common NotGTK,NotOS2,NotMSW,NotMicro @@ -165,8 +166,9 @@ filefn.cpp Common Base filename.cpp Common Base filesys.cpp Common Base fldlgcmn.cpp Common +fmapbase.cpp Common Base fontcmn.cpp Common -fontmap.cpp Common Base +fontmap.cpp Common framecmn.cpp Common toplvcmn.cpp Common fs_inet.cpp Common Base @@ -228,6 +230,7 @@ settcmn.cpp Common sizer.cpp Common socket.cpp Common Socket,Base statbar.cpp Common +stopwatch.cpp Common Base strconv.cpp Common Base stream.cpp Common Base string.cpp Common Base @@ -237,7 +240,7 @@ tbarbase.cpp Common textbuf.cpp Common Base textcmn.cpp Common textfile.cpp Common Base -timercmn.cpp Common Base +timercmn.cpp Common tokenzr.cpp Common Base treebase.cpp Common txtstrm.cpp Common Base @@ -262,6 +265,7 @@ accel.cpp MSW access.cpp MSW OLE app.cpp MSW LowLevel automtn.cpp MSW OLE,LowLevel +basemsw.cpp MSW Base bitmap.cpp MSW LowLevel bmpbuttn.cpp MSW brush.cpp MSW LowLevel @@ -366,12 +370,14 @@ toplevel.cpp MSW LowLevel treectrl.cpp MSW Win32Only utils.cpp MSW Base,LowLevel utilsexc.cpp MSW Base,LowLevel +utilsgui.cpp MSW LowLevel uuid.cpp MSW OLE,LowLevel uxtheme.cpp MSW volume.cpp MSW Base wave.cpp MSW LowLevel window.cpp MSW LowLevel +baseunix.cpp Unix Base dialup.cpp Unix NotMac dir.cpp Unix Base,NotMac fontenum.cpp Unix NotCocoa,NotMac,NotMGL,NotMicro @@ -381,6 +387,8 @@ mimetype.cpp Unix Base,NotMac,NotMicro snglinst.cpp Unix Base taskbarx11.cpp Unix NotCocoa,NotMac,NotMGL,NotMicro threadpsx.cpp Unix Base,NotMac +# not yet +# utilsgui.cpp Unix utilsunx.cpp Unix Base utilsx11.cpp Unix NotMac,NotMGL,NotMicro @@ -809,6 +817,7 @@ access.h WXH accel.h WXH access.h WXH app.h WXH Base +apptrait.h WXH Base artprov.h WXH bitmap.h WXH bmpbuttn.h WXH @@ -881,6 +890,7 @@ filedlg.h WXH filefn.h WXH Base filename.h WXH Base filesys.h WXH Base +fmappriv.h WXH Base font.h WXH fontdlg.h WXH fontenc.h WXH Base @@ -950,7 +960,7 @@ minifram.h WXH module.h WXH Base msgdlg.h WXH msgout.h WXH Base -mslu.cpp MSW +mslu.cpp MSW Base mstream.h WXH Base notebook.h WXH object.h WXH Base @@ -1350,6 +1360,8 @@ window.h MGLH access.h MSWH accel.h MSWH app.h MSWH +apptbase.h MSWH Base +apptrait.h MSWH Base bitmap.h MSWH bmpbuttn.h MSWH brush.h MSWH @@ -1547,10 +1559,13 @@ pnghand.h OS2H statbox.h OS2H toplevel.h OS2H +apptbase.h UnixH Base +apptrait.h UnixH Base execute.h UnixH fontutil.h UnixH gsockunx.h UnixH Base mimetype.h UnixH Base +pipe.h UnixH Base taskbarx11.h UnixH utilsx11.h UnixH diff --git a/distrib/msw/tmake/vc6msw.t b/distrib/msw/tmake/vc6msw.t index 5c9213fd9c..b42eeb5436 100644 --- a/distrib/msw/tmake/vc6msw.t +++ b/distrib/msw/tmake/vc6msw.t @@ -121,7 +121,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdllu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdllu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -147,7 +147,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W4 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdllud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdllud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -172,7 +172,7 @@ LINK32=link.exe # PROP Intermediate_Dir "../ReleaseUnicode" # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W4 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe @@ -195,7 +195,7 @@ LIB32=link.exe -lib # PROP Intermediate_Dir "../DebugUnicode" # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W4 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe @@ -219,7 +219,7 @@ LIB32=link.exe -lib # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdll" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdll" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -245,7 +245,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W4 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdlld" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdlld" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -270,7 +270,7 @@ LINK32=link.exe # PROP Intermediate_Dir "../Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W4 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/msw" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/msw" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe @@ -293,7 +293,7 @@ LIB32=link.exe -lib # PROP Intermediate_Dir "../Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W4 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswd" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswd" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe diff --git a/docs/latex/wx/cppconst.tex b/docs/latex/wx/cppconst.tex index f359723f7f..519b965b8e 100644 --- a/docs/latex/wx/cppconst.tex +++ b/docs/latex/wx/cppconst.tex @@ -7,7 +7,7 @@ by category (and sorted by alphabetical order inside each category). \begin{twocollist}\itemsep=0pt \twocolitem{\_\_WINDOWS\_\_}{any Windows, yom may also use \_\_WXMSW\_\_} -\twocolitem{\_\_WIN16\_\_}{Win16 API} +\twocolitem{\_\_WIN16\_\_}{Win16 API (not supported since wxWindows 2.6)} \twocolitem{\_\_WIN32\_\_}{Win32 API} \twocolitem{\_\_WIN95\_\_}{Windows 95 or NT 4.0 and above system (not NT 3.5x)} \twocolitem{\_\_WXGTK\_\_}{GTK} @@ -15,7 +15,8 @@ by category (and sorted by alphabetical order inside each category). \twocolitem{\_\_WXGTK20\_\_}{GTK 2.0 or higher} \twocolitem{\_\_WXMOTIF\_\_}{Motif} \twocolitem{\_\_WXMOTIF20\_\_}{Motif 2.0 or higher} -\twocolitem{\_\_WXMAC\_\_}{Mac OS whether Classic (Mac OS 8/9 TARGET\_CARBON == 0) or Carbon (including Mac OS X TARGET\_CARBON == 1)} +\twocolitem{\_\_WXMAC\_\_}{Mac OS whether Classic (Mac OS 8/9 TARGET\_CARBON +== 0) or Carbon (including Mac OS X TARGET\_CARBON == 1)} \twocolitem{\_\_WXMGL\_\_}{SciTech Soft MGL (\_\_WXUNIVERSAL\_\_ will be also defined)} \twocolitem{\_\_WXMSW\_\_}{Any Windows} @@ -31,9 +32,8 @@ to one of the symbols above so this should be tested first.} \twocolitem{\_\_X\_\_}{any X11-based GUI toolkit except GTK+} \end{twocollist} -In fact, they should better all start with \_\_WX instead of \_\_ only. The -only GUIs implemented for 2.0 are \_\_WXGTK\_\_, \_\_WXMSW\_\_ and -\_\_WXMOTIF\_\_ yet. Any new ones, please start the define with \_\_WX. +In fact, they should better all start with \_\_WX instead of \_\_ only, +so please start any new defines with \_\_WX. \subsection{Operating systems} @@ -47,6 +47,7 @@ only GUIs implemented for 2.0 are \_\_WXGTK\_\_, \_\_WXMSW\_\_ and \twocolitem{\_\_DOS\_GENERAL\_\_}{DOS (used with wxMGL only)} \twocolitem{\_\_FREEBSD\_\_}{FreeBSD} \twocolitem{\_\_HPUX\_\_}{HP-UX (Unix)} +\twocolitem{\_\_GNU\_\_}{GNU Hurd} \twocolitem{\_\_LINUX\_\_}{Linux} \twocolitem{\_\_MACH\_\_}{Mach-O Architecture (Mac OS X only builds)} \twocolitem{\_\_OSF\_\_}{OSF/1} @@ -99,6 +100,11 @@ the compiler version, $1100$ is $11.0$ and $1200$ is OpenWatcom.} \subsection{Miscellaneous} \begin{twocollist}\itemsep=0pt +\twocolitem{\_\_WXWINDOWS\_\_}{always defined in wxWindows applications, see +also \helpref{wxCHECK\_VERSION}{wxcheckversion}} +\twocolitem{\_\_WXBASE\_\_}{only used by wxWindows internally (defined when +building wxBase code, either as a standalone library or as part of the +monolithis wxWindows library, not defined when building GUI library only)} \twocolitem{\_\_WXDEBUG\_\_}{defined in debug mode, undefined in release mode} \twocolitem{wxUSE\_XXX}{if defined as $1$, feature XXX is active (the symbols of this form are always defined, use \#if and not \#ifdef to test diff --git a/include/wx/app.h b/include/wx/app.h index ac59394d3a..2a653d9560 100644 --- a/include/wx/app.h +++ b/include/wx/app.h @@ -27,13 +27,10 @@ #include "wx/window.h" // for wxTopLevelWindows #endif // wxUSE_GUI -#if WXWIN_COMPATIBILITY_2_2 - #include "wx/icon.h" -#endif - #include "wx/build.h" class WXDLLEXPORT wxApp; +class WXDLLEXPORT wxAppTraits; class WXDLLEXPORT wxCmdLineParser; class WXDLLEXPORT wxLog; class WXDLLEXPORT wxMessageOutput; @@ -49,8 +46,11 @@ typedef wxApp* (*wxAppInitializerFunction)(); // constants // ---------------------------------------------------------------------------- -static const int wxPRINT_WINDOWS = 1; -static const int wxPRINT_POSTSCRIPT = 2; +enum +{ + wxPRINT_WINDOWS = 1, + wxPRINT_POSTSCRIPT = 2 +}; // ---------------------------------------------------------------------------- // support for framebuffer ports @@ -76,108 +76,48 @@ private: unsigned m_width, m_height, m_depth; bool m_ok; }; -#endif +#endif // wxUSE_GUI // ---------------------------------------------------------------------------- -// the common part of wxApp implementations for all platforms +// wxAppConsole: wxApp for non-GUI applications // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxAppBase : public wxEvtHandler +class WXDLLEXPORT wxAppConsole : public wxEvtHandler { - DECLARE_NO_COPY_CLASS(wxAppBase) - public: - wxAppBase(); - virtual ~wxAppBase(); + // ctor and dtor + wxAppConsole(); + virtual ~wxAppConsole(); + // 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 in GUI application, rarely in console ones. + // Called before OnRun(), this is a good place to do initialization -- if + // anything fails, return false from here to prevent the program from + // continuing. The command line is normally parsed here, call the base + // class OnInit() to do it. virtual bool OnInit(); -#if wxUSE_GUI - // 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(); -#endif // wxUSE_GUI - - // 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. In console mode programs, the execution - // of the program really starts here - // - // Override: rarely in GUI applications, always in console ones. -#if wxUSE_GUI - virtual int OnRun(); -#else // !GUI + // This is the replacement for the normal main(): all program work should + // be done here. When OnRun() returns, the programs starts shutting down. virtual int OnRun() = 0; -#endif // wxUSE_GUI - // 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. + // This is only called if OnInit() returned true so it's a good place to do + // any cleanup matching the initializations done there. 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 - // 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. + // 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. virtual void OnFatalException() { } - // the worker functions - usually not used directly by the user code - // ----------------------------------------------------------------- + // Called from wxExit() function, should terminate the application a.s.a.p. + virtual void Exit(); -#if wxUSE_GUI - // 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; - - // process all currently pending events right now - // - // it is an error to call Yield() recursively unless the value of - // onlyIfNeeded is TRUE - // - // WARNING: this function is dangerous as it can lead to unexpected - // reentrancies (i.e. when called from an event handler it - // may result in calling the same event handler again), use - // with _extreme_ care or, better, don't use at all! - virtual bool Yield(bool onlyIfNeeded = FALSE) = 0; - - // this virtual function is called in the GUI mode when the application - // becomes idle and normally just sends wxIdleEvent to all interested - // parties - // - // it should return TRUE if more idle events are needed, FALSE if not - virtual bool ProcessIdle() = 0; -#endif // wxUSE_GUI // application info: name, description, vendor // ------------------------------------------- @@ -189,10 +129,7 @@ public: // set/get the application name wxString GetAppName() const { - if ( !m_appName ) - return m_className; - else - return m_appName; + return m_appName.empty() ? m_className : m_appName; } void SetAppName(const wxString& name) { m_appName = name; } @@ -204,40 +141,6 @@ public: const wxString& GetVendorName() const { return m_vendorName; } void SetVendorName(const wxString& name) { m_vendorName = name; } -#if wxUSE_GUI - // 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) - virtual 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 disable this behaviour - // (with SetExitOnFrameDelete(FALSE)), you'll have to call - // ExitMainLoop() explicitly from somewhere. - void SetExitOnFrameDelete(bool flag) - { m_exitOnFrameDelete = flag ? Yes : No; } - bool GetExitOnFrameDelete() const - { return m_exitOnFrameDelete == Yes; } - -#endif // wxUSE_GUI // cmd line parsing stuff // ---------------------- @@ -267,13 +170,24 @@ public: virtual bool OnCmdLineError(wxCmdLineParser& parser); #endif // wxUSE_CMDLINE_PARSER + // miscellaneous customization functions // ------------------------------------- + // create the app traits object to which we delegate for everything which + // either should be configurable by the user (then he can change the + // default behaviour simply by overriding CreateTraits() and returning his + // own traits object) or which is GUI/console dependent as then wxAppTraits + // allows us to abstract the differences behind the common façade + wxAppTraits *GetTraits(); + + // the functions below shouldn't be used now that we have wxAppTraits +#if WXWIN_COMPATIBILITY_2_4 + #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() + // object) -- this log object is used by default by all wxLogXXX() // functions. virtual wxLog *CreateLogTarget(); #endif // wxUSE_LOG @@ -282,38 +196,11 @@ public: // object virtual wxMessageOutput *CreateMessageOutput(); -#if wxUSE_GUI - -#if WXWIN_COMPATIBILITY_2_2 - // 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 WXUNUSED(which)) const { return wxNullIcon; } -#endif - - // Get display mode that is used use. This is only used in framebuffer wxWin ports - // (such as wxMGL). - virtual wxDisplayModeInfo GetDisplayMode() const { return wxDisplayModeInfo(); } - // Set display mode to use. This is only used in framebuffer wxWin ports - // (such as wxMGL). This method should be called from wxApp:OnInitGui - virtual bool SetDisplayMode(const wxDisplayModeInfo& WXUNUSED(info)) { return TRUE; } +#endif // WXWIN_COMPATIBILITY_2_4 - // 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 + // event processing functions + // -------------------------- // this method allows to filter all the events processed by the program, so // you should try to return quickly from it to avoid slowing down the @@ -324,6 +211,19 @@ public: // had been already processed or won't be processed at all, respectively virtual int FilterEvent(wxEvent& event); + // process all events in the wxPendingEvents list -- it is necessary to + // call this function to process posted events. This happens during each + // event loop iteration in GUI mode but if there is no main loop, it may be + // also called directly. + virtual void ProcessPendingEvents(); + + // doesn't do anything in this class, just a hook for GUI wxApp + virtual bool Yield(bool WXUNUSED(onlyIfNeeded) = false) { return true; } + + // make sure that idle events are sent again + virtual void WakeUpIdle() { } + + // debugging support // ----------------- @@ -345,45 +245,189 @@ public: // options of the library and abort if it doesn't static bool CheckBuildOptions(const wxBuildOptions& buildOptions); - // deprecated functions, please updae your code to not use them! - // ------------------------------------------------------------- - -#if WXWIN_COMPATIBILITY_2_2 - // used by obsolete wxDebugMsg only - void SetWantDebugOutput( bool flag ) { m_wantDebugOutput = flag; } - bool GetWantDebugOutput() const { return m_wantDebugOutput; } - - // TRUE if the application wants to get debug output - bool m_wantDebugOutput; -#endif // WXWIN_COMPATIBILITY_2_2 // implementation only from now on // ------------------------------- // helpers for dynamic wxApp construction static void SetInitializerFunction(wxAppInitializerFunction fn) - { m_appInitFn = fn; } + { ms_appInitFn = fn; } static wxAppInitializerFunction GetInitializerFunction() - { return m_appInitFn; } + { return ms_appInitFn; } - // process all events in the wxPendingEvents list - virtual void ProcessPendingEvents(); - // access to the command line arguments + // command line arguments (public for backwards compatibility) int argc; wxChar **argv; protected: + // the function which creates the traits object when GetTraits() needs it + // for the first time + virtual wxAppTraits *CreateTraits(); + + // function used for dynamic wxApp creation - static wxAppInitializerFunction m_appInitFn; + static wxAppInitializerFunction ms_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 + // the class defining the application behaviour, NULL initially and created + // by GetTraits() when first needed + wxAppTraits *m_traits; + + + // the application object is a singleton anyhow, there is no sense in + // copying it + DECLARE_NO_COPY_CLASS(wxAppConsole) +}; + +// ---------------------------------------------------------------------------- +// wxAppBase: the common part of wxApp implementations for all platforms +// ---------------------------------------------------------------------------- + #if wxUSE_GUI - // the main top level window - may be NULL + +class WXDLLEXPORT wxAppBase : public wxAppConsole +{ +public: + wxAppBase(); + virtual ~wxAppBase(); + + // the virtual functions which may/must be overridden in the derived class + // ----------------------------------------------------------------------- + + // 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(); + + // 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. In console mode programs, the execution + // of the program really starts here + // + // Override: rarely in GUI applications, always in console ones. + virtual int OnRun(); + + // exit the main loop thus terminating the application + virtual void Exit(); + + + // 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; + + // process all currently pending events right now + // + // it is an error to call Yield() recursively unless the value of + // onlyIfNeeded is TRUE + // + // WARNING: this function is dangerous as it can lead to unexpected + // reentrancies (i.e. when called from an event handler it + // may result in calling the same event handler again), use + // with _extreme_ care or, better, don't use at all! + virtual bool Yield(bool onlyIfNeeded = FALSE) = 0; + + // this virtual function is called in the GUI mode when the application + // becomes idle and normally just sends wxIdleEvent to all interested + // parties + // + // it should return TRUE if more idle events are needed, FALSE if not + virtual bool ProcessIdle() = 0; + + + // 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) + virtual 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 disable this behaviour + // (with SetExitOnFrameDelete(FALSE)), you'll have to call + // ExitMainLoop() explicitly from somewhere. + void SetExitOnFrameDelete(bool flag) + { m_exitOnFrameDelete = flag ? Yes : No; } + bool GetExitOnFrameDelete() const + { return m_exitOnFrameDelete == Yes; } + + + // display mode, visual, printing mode, ... + // ------------------------------------------------------------------------ + + // Get display mode that is used use. This is only used in framebuffer + // wxWin ports (such as wxMGL). + virtual wxDisplayModeInfo GetDisplayMode() const { return wxDisplayModeInfo(); } + // Set display mode to use. This is only used in framebuffer wxWin + // ports (such as wxMGL). This method should be called from + // wxApp::OnInitGui + virtual bool SetDisplayMode(const wxDisplayModeInfo& WXUNUSED(info)) { return TRUE; } + + // 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; } + + + // miscellaneous other stuff + // ------------------------------------------------------------------------ + + // 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); + + +protected: + // override base class method to use GUI traits + virtual wxAppTraits *CreateTraits(); + + + // the main top level window (may be NULL) wxWindow *m_topWindow; // if Yes, exit the main loop when the last top level window is deleted, if @@ -403,9 +447,13 @@ protected: // does any of our windows has focus? bool m_isActive; -#endif // wxUSE_GUI + + + DECLARE_NO_COPY_CLASS(wxAppBase) }; +#endif // wxUSE_GUI + // ---------------------------------------------------------------------------- // now include the declaration of the real class // ---------------------------------------------------------------------------- @@ -430,7 +478,7 @@ protected: #endif #else // !GUI // can't use typedef because wxApp forward declared as a class - class WXDLLEXPORT wxApp : public wxAppBase + class WXDLLEXPORT wxApp : public wxAppConsole { }; #endif // GUI/!GUI @@ -461,18 +509,6 @@ 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 diff --git a/include/wx/apptrait.h b/include/wx/apptrait.h new file mode 100644 index 0000000000..d49e549ca3 --- /dev/null +++ b/include/wx/apptrait.h @@ -0,0 +1,172 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/apptrait.h +// Purpose: declaration of wxAppTraits and derived classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.06.2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_APPTRAIT_H_ +#define _WX_APPTRAIT_H_ + +class WXDLLEXPORT wxAppTraits; +#if wxUSE_FONTMAP + class WXDLLEXPORT wxFontMapper; +#endif // wxUSE_FONTMAP +class WXDLLEXPORT wxLog; +class WXDLLEXPORT wxMessageOutput; + +// ---------------------------------------------------------------------------- +// wxAppTraits: this class defines various configurable aspects of wxApp +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAppTraitsBase +{ +public: + // wxAppTraits is an ABC, but we also provide 2 standard implementations of + // it, one for the console apps and the other for the GUI ones + static wxAppTraits *CreateConsole(); +#if wxUSE_GUI + static wxAppTraits *CreateGUI(); +#endif // wxUSE_GUI + + + // hooks for creating the global objects, may be overridden by the user + // ------------------------------------------------------------------------ + +#if wxUSE_LOG + // create the default log target + virtual wxLog *CreateLogTarget() = 0; +#endif // wxUSE_LOG + + // create the global object used for printing out messages + virtual wxMessageOutput *CreateMessageOutput() = 0; + +#if wxUSE_FONTMAP + // create the global font mapper object used for encodings/charset mapping + virtual wxFontMapper *CreateFontMapper() = 0; +#endif // wxUSE_FONTMAP + + + // functions abstracting differences between GUI and console modes + // ------------------------------------------------------------------------ + +#ifdef __WXDEBUG__ + // show the assert dialog with the specified message in GUI or just print + // the string to stderr in console mode + // + // base class version has an implementation (in spite of being pure + // virtual) in base/appbase.cpp which can be called as last resort. + // + // return true to suppress subsequent asserts, false to continue as before + virtual bool ShowAssertDialog(const wxString& msg) = 0; +#endif // __WXDEBUG__ + + // return true if fprintf(stderr) goes somewhere, false otherwise + virtual bool HasStderr() = 0; + + // managing "pending delete" list: in GUI mode we can't immediately delete + // some objects because there may be unprocessed events for them and so we + // only do it during the next idle loop iteration while this is, of course, + // unnecessary in wxBase, so we have a few functions to abstract these + // operations + + // add the object to the pending delete list in GUI, delete it immediately + // in wxBase + virtual void ScheduleForDestroy(wxObject *object) = 0; + + // remove this object from the pending delete list in GUI, do nothing in + // wxBase + virtual void RemoveFromPendingDelete(wxObject *object) = 0; +}; + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the class +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/apptbase.h" +#else + typedef + // wxAppTraits must be a class because it was forward declared as class + class WXDLLEXPORT wxAppTraits : public wxAppTraitsBase + { + }; +#endif // platform + +// ============================================================================ +// standard traits for console and GUI applications +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxConsoleAppTraitsBase: wxAppTraits implementation for the console apps +// ---------------------------------------------------------------------------- + +class wxConsoleAppTraitsBase : public wxAppTraits +{ +public: +#if wxUSE_LOG + virtual wxLog *CreateLogTarget(); +#endif // wxUSE_LOG + virtual wxMessageOutput *CreateMessageOutput(); +#if wxUSE_FONTMAP + virtual wxFontMapper *CreateFontMapper(); +#endif // wxUSE_FONTMAP + +#ifdef __WXDEBUG__ + virtual bool ShowAssertDialog(const wxString& msg); +#endif // __WXDEBUG__ + virtual bool HasStderr(); + + virtual void ScheduleForDestroy(wxObject *object); + virtual void RemoveFromPendingDelete(wxObject *object); +}; + +// ---------------------------------------------------------------------------- +// wxGUIAppTraitsBase: wxAppTraits implementation for the GUI apps +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class wxGUIAppTraitsBase : public wxAppTraits +{ +public: +#if wxUSE_LOG + virtual wxLog *CreateLogTarget(); +#endif // wxUSE_LOG + virtual wxMessageOutput *CreateMessageOutput(); +#if wxUSE_FONTMAP + virtual wxFontMapper *CreateFontMapper(); +#endif // wxUSE_FONTMAP + +#ifdef __WXDEBUG__ + virtual bool ShowAssertDialog(const wxString& msg); +#endif // __WXDEBUG__ + virtual bool HasStderr(); + + virtual void ScheduleForDestroy(wxObject *object); + virtual void RemoveFromPendingDelete(wxObject *object); +}; + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the classes above +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/apptrait.h" +#elif defined(__UNIX__) + #include "wx/unix/apptrait.h" +#else // no platform-specific methods to add to wxAppTraits + #if wxUSE_GUI + typedef wxGUIAppTraitsBase wxGUIAppTraits; + #endif // wxUSE_GUI + typedef wxConsoleAppTraitsBase wxConsoleAppTraits; +#endif // platform + +#endif // _WX_APPTRAIT_H_ + diff --git a/include/wx/build.h b/include/wx/build.h index 76b563a675..3d10bdfc53 100644 --- a/include/wx/build.h +++ b/include/wx/build.h @@ -14,6 +14,8 @@ #include "wx/version.h" +class WXDLLEXPORT wxAppConsole; + // ---------------------------------------------------------------------------- // wxBuildOptions // ---------------------------------------------------------------------------- @@ -48,7 +50,7 @@ private: bool m_isDebug; // actually only CheckBuildOptions() should be our friend but well... - friend class wxAppBase; + friend class wxAppConsole; }; #endif // _WX_BUILD_H_ diff --git a/include/wx/cocoa/app.h b/include/wx/cocoa/app.h index 9d4f65acd3..1e2453a0a5 100644 --- a/include/wx/cocoa/app.h +++ b/include/wx/cocoa/app.h @@ -50,8 +50,12 @@ public: virtual bool Initialized(); virtual bool Pending(); virtual void Dispatch(); + + virtual void Exit(); + virtual bool Yield(bool onlyIfNeeded = FALSE); virtual bool ProcessIdle(); + virtual bool WakeUpIdle() { CocoaRequestIdle(); } /* Idle Processing */ void OnIdle(wxIdleEvent& event); diff --git a/include/wx/event.h b/include/wx/event.h index a5542b3588..a177842ed5 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -2145,6 +2145,15 @@ private: DECLARE_DYNAMIC_CLASS(wxEvtHandler) }; +// 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") ); + + dest->AddPendingEvent(event); +} + typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); #if wxUSE_GUI typedef void (wxEvtHandler::*wxCommandEventFunction)(wxCommandEvent&); diff --git a/include/wx/fmappriv.h b/include/wx/fmappriv.h new file mode 100644 index 0000000000..a6b59d8ca3 --- /dev/null +++ b/include/wx/fmappriv.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fmappriv.h +// Purpose: private wxFontMapper stuff, not to be used by the library users +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 (extracted from common/fontmap.cpp) +// RCS-ID: $Id$ +// Copyright: (c) 1999-2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FMAPPRIV_H_ +#define _WX_FMAPPRIV_H_ + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// a special pseudo encoding which means "don't ask me about this charset +// any more" -- we need it to avoid driving the user crazy with asking him +// time after time about the same charset which he [presumably] doesn't +// have the fonts for +enum { wxFONTENCODING_UNKNOWN = -2 }; + +// the config paths we use +#if wxUSE_CONFIG + +#define FONTMAPPER_ROOT_PATH wxT("/wxWindows/FontMapper") +#define FONTMAPPER_CHARSET_PATH wxT("Charsets") +#define FONTMAPPER_CHARSET_ALIAS_PATH wxT("Aliases") + +#endif // wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// wxFontMapperPathChanger: change the config path during our lifetime +// ---------------------------------------------------------------------------- + +#if wxUSE_CONFIG + +class wxFontMapperPathChanger +{ +public: + wxFontMapperPathChanger(wxFontMapperBase *fontMapper, const wxString& path) + { + m_fontMapper = fontMapper; + m_ok = m_fontMapper->ChangePath(path, &m_pathOld); + } + + bool IsOk() const { return m_ok; } + + ~wxFontMapperPathChanger() + { + if ( IsOk() ) + m_fontMapper->RestorePath(m_pathOld); + } + +private: + // the fontmapper object we're working with + wxFontMapperBase *m_fontMapper; + + // the old path to be restored if m_ok + wxString m_pathOld; + + // have we changed the path successfully? + bool m_ok; + + + DECLARE_NO_COPY_CLASS(wxFontMapperPathChanger) +}; + +#endif // wxUSE_CONFIG + +#endif // _WX_FMAPPRIV_H_ + diff --git a/include/wx/fontmap.h b/include/wx/fontmap.h index af3e7b5603..a997e952ef 100644 --- a/include/wx/fontmap.h +++ b/include/wx/fontmap.h @@ -32,68 +32,64 @@ class WXDLLEXPORT wxConfigBase; #endif // wxUSE_CONFIG +class WXDLLEXPORT wxFontMapper; + #if wxUSE_GUI class WXDLLEXPORT wxWindow; #endif // wxUSE_GUI -// ---------------------------------------------------------------------------- -// wxFontMapper manages user-definable correspondence between logical font -// names and the fonts present on the machine. +// ============================================================================ +// wxFontMapper manages user-definable correspondence between wxWindows font +// encodings and the fonts present on the machine. // -// The default implementations of all functions will ask the user if they are -// not capable of finding the answer themselves and store the answer in a -// config file (configurable via SetConfigXXX functions). This behaviour may -// be disabled by giving the value of FALSE to "interactive" parameter. -// However, the functions will always consult the config file to allow the -// user-defined values override the default logic and there is no way to -// disable this - which shouldn't be ever needed because if "interactive" was -// never TRUE, the config file is never created anyhow. +// This is a singleton class, font mapper objects can only be accessed using +// wxFontMapper::Get(). +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFontMapperBase: this is a non-interactive class which just uses its built +// in knowledge of the encodings equivalence // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxFontMapper +class WXDLLEXPORT wxFontMapperBase { public: + // constructtor and such + // --------------------- + // default ctor - wxFontMapper(); + wxFontMapperBase(); - // virtual dtor for a base class - virtual ~wxFontMapper(); + // virtual dtor for any base class + virtual ~wxFontMapperBase(); // return instance of the wxFontMapper singleton static wxFontMapper *Get(); + // set the sigleton to 'mapper' instance and return previous one static wxFontMapper *Set(wxFontMapper *mapper); -#if wxUSE_GUI - // find an alternative for the given encoding (which is supposed to not be - // available on this system). If successful, return TRUE and fill info - // structure with the parameters required to create the font, otherwise - // return FALSE - virtual bool GetAltForEncoding(wxFontEncoding encoding, - wxNativeEncodingInfo *info, - const wxString& facename = wxEmptyString, - bool interactive = TRUE); - - // version better suitable for 'public' use. Returns wxFontEcoding - // that can be used it wxFont ctor - bool GetAltForEncoding(wxFontEncoding encoding, - wxFontEncoding *alt_encoding, - const wxString& facename = wxEmptyString, - bool interactive = TRUE); - // checks whether given encoding is available in given face or not. - // If no facename is given, - virtual bool IsEncodingAvailable(wxFontEncoding encoding, - const wxString& facename = wxEmptyString); -#endif // wxUSE_GUI + // translates charset strings to encoding + // -------------------------------------- // returns the encoding for the given charset (in the form of RFC 2046) or // wxFONTENCODING_SYSTEM if couldn't decode it + // + // interactive parameter is ignored in the base class, we behave as if it + // were always false virtual wxFontEncoding CharsetToEncoding(const wxString& charset, - bool interactive = TRUE); + bool interactive = true); + + + // information about supported encodings + // ------------------------------------- - // encoding names - // -------------- + // get the number of font encodings we know about + static size_t GetSupportedEncodingsCount(); + + // get the n-th supported encoding + static wxFontEncoding GetEncoding(size_t n); // return internal string identifier for the encoding (see also // GetEncodingDescription()) @@ -104,16 +100,6 @@ public: // NB: hard-coded now, but might change later (read it from config?) static wxString GetEncodingDescription(wxFontEncoding encoding); - // configure the appearance of the dialogs we may popup - // ---------------------------------------------------- - -#if wxUSE_GUI - // the parent window for modal dialogs - void SetDialogParent(wxWindow *parent) { m_windowParent = parent; } - - // the title for the dialogs (note that default is quite reasonable) - void SetDialogTitle(const wxString& title) { m_titleDialog = title; } -#endif // wxUSE_GUI // functions which allow to configure the config object used: by default, // the global one (from wxConfigBase::Get() will be used) and the default @@ -130,22 +116,21 @@ public: // return default config path static const wxChar *GetDefaultConfigPath(); -#endif +#endif // wxUSE_CONFIG -protected: +protected: #if wxUSE_CONFIG - // get the config object we're using - if it wasn't set explicitly, this + // get the config object we're using -- if it wasn't set explicitly, this // function will use wxConfig::Get() to get the global one wxConfigBase *GetConfig(); - // gets the root path for our settings - if itwasn't set explicitly, use + // gets the root path for our settings -- if it wasn't set explicitly, use // GetDefaultConfigPath() const wxString& GetConfigPath(); -#endif - // change to the given (relative) path in the config, return TRUE if ok - // (then GetConfig() will return something !NULL), FALSE if no config + // change to the given (relative) path in the config, return true if ok + // (then GetConfig() will return something !NULL), false if no config // object // // caller should provide a pointer to the string variable which should be @@ -155,7 +140,87 @@ protected: // restore the config path after use void RestorePath(const wxString& pathOld); + // config object and path (in it) to use + wxConfigBase *m_config; + bool m_configIsDummy; + + wxString m_configRootPath; +#endif // wxUSE_CONFIG + +private: + // the global fontmapper object or NULL + static wxFontMapper *sm_instance; + + friend class wxFontMapperPathChanger; + + DECLARE_NO_COPY_CLASS(wxFontMapperBase) +}; + +// ---------------------------------------------------------------------------- +// wxFontMapper: interactive extension of wxFontMapperBase +// +// The default implementations of all functions will ask the user if they are +// not capable of finding the answer themselves and store the answer in a +// config file (configurable via SetConfigXXX functions). This behaviour may +// be disabled by giving the value of false to "interactive" parameter. +// However, the functions will always consult the config file to allow the +// user-defined values override the default logic and there is no way to +// disable this -- which shouldn't be ever needed because if "interactive" was +// never true, the config file is never created anyhow. +// ---------------------------------------------------------------------------- + #if wxUSE_GUI + +class WXDLLEXPORT wxFontMapper : public wxFontMapperBase +{ +public: + // default ctor + wxFontMapper(); + + // virtual dtor for a base class + virtual ~wxFontMapper(); + + // working with the encodings + // -------------------------- + + // returns the encoding for the given charset (in the form of RFC 2046) or + // wxFONTENCODING_SYSTEM if couldn't decode it + virtual wxFontEncoding CharsetToEncoding(const wxString& charset, + bool interactive = true); + + // find an alternative for the given encoding (which is supposed to not be + // available on this system). If successful, return true and fill info + // structure with the parameters required to create the font, otherwise + // return false + virtual bool GetAltForEncoding(wxFontEncoding encoding, + wxNativeEncodingInfo *info, + const wxString& facename = wxEmptyString, + bool interactive = true); + + // version better suitable for 'public' use. Returns wxFontEcoding + // that can be used it wxFont ctor + bool GetAltForEncoding(wxFontEncoding encoding, + wxFontEncoding *alt_encoding, + const wxString& facename = wxEmptyString, + bool interactive = true); + + // checks whether given encoding is available in given face or not. + // If no facename is given, + virtual bool IsEncodingAvailable(wxFontEncoding encoding, + const wxString& facename = wxEmptyString); + + + // configure the appearance of the dialogs we may popup + // ---------------------------------------------------- + + // the parent window for modal dialogs + void SetDialogParent(wxWindow *parent) { m_windowParent = parent; } + + // the title for the dialogs (note that default is quite reasonable) + void SetDialogTitle(const wxString& title) { m_titleDialog = title; } + + +protected: // GetAltForEncoding() helper: tests for the existence of the given // encoding and saves the result in config if ok - this results in the // following (desired) behaviour: when an unknown/unavailable encoding is @@ -166,38 +231,31 @@ protected: bool TestAltEncoding(const wxString& configEntry, wxFontEncoding encReplacement, wxNativeEncodingInfo *info); -#endif // wxUSE_GUI -#if wxUSE_CONFIG - // config object and path (in it) to use - wxConfigBase *m_config; - bool m_configIsDummy; -#endif - - wxString m_configRootPath; - -#if wxUSE_GUI // the title for our dialogs wxString m_titleDialog; // the parent window for our dialogs wxWindow *m_windowParent; -#endif // wxUSE_GUI - friend class wxFontMapperPathChanger; - private: - static wxFontMapper *sm_instance; - DECLARE_NO_COPY_CLASS(wxFontMapper) }; +#else // !wxUSE_GUI + +class WXDLLEXPORT wxFontMapper : public wxFontMapperBase +{ +}; + +#endif // wxUSE_GUI/!wxUSE_GUI + // ---------------------------------------------------------------------------- // global variables // ---------------------------------------------------------------------------- -// the default font mapper for wxWindows programs -// do NOT use! This is for backward compatibility, use wxFontMapper::Get() instead +// the default font mapper for wxWindows programs do NOT use! This is for +// backward compatibility, use wxFontMapper::Get() instead #define wxTheFontMapper (wxFontMapper::Get()) #else // !wxUSE_FONTMAP @@ -210,3 +268,4 @@ private: #endif // wxUSE_FONTMAP/!wxUSE_FONTMAP #endif // _WX_FONTMAPPER_H_ + diff --git a/include/wx/fs_mem.h b/include/wx/fs_mem.h index 44cd4d489d..e304cd1143 100644 --- a/include/wx/fs_mem.h +++ b/include/wx/fs_mem.h @@ -23,47 +23,49 @@ #include "wx/filesys.h" -#if wxUSE_GUI - #include "wx/image.h" - #include "wx/bitmap.h" -#endif +class WXDLLEXPORT wxBitmap; +class WXDLLEXPORT wxImage; //-------------------------------------------------------------------------------- // wxMemoryFSHandler //-------------------------------------------------------------------------------- -class WXDLLEXPORT wxMemoryFSHandler : public wxFileSystemHandler +class WXDLLEXPORT wxMemoryFSHandlerBase : public wxFileSystemHandler { - public: - wxMemoryFSHandler(); - ~wxMemoryFSHandler(); +public: + wxMemoryFSHandlerBase(); + ~wxMemoryFSHandlerBase(); - // Add file to list of files stored in memory. Stored data (bitmap, text or raw data) - // will be copied into private memory stream and available under name "memory:" + filename -#if wxUSE_GUI - static void AddFile(const wxString& filename, wxImage& image, long type); - static void AddFile(const wxString& filename, const wxBitmap& bitmap, long type); -#endif - static void AddFile(const wxString& filename, const wxString& textdata); - static void AddFile(const wxString& filename, const void *binarydata, size_t size); + // Add file to list of files stored in memory. Stored data (bitmap, text or + // raw data) will be copied into private memory stream and available under + // name "memory:" + filename + static void AddFile(const wxString& filename, wxImage& image, long type); + static void AddFile(const wxString& filename, const wxString& textdata); + static void AddFile(const wxString& filename, const void *binarydata, size_t size); - // Remove file from memory FS and free occupied memory - static void RemoveFile(const wxString& filename); + // Remove file from memory FS and free occupied memory + static void RemoveFile(const wxString& filename); - virtual bool CanOpen(const wxString& location); - virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); - virtual wxString FindFirst(const wxString& spec, int flags = 0); - virtual wxString FindNext(); + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); - private: - static wxHashTable *m_Hash; +private: + static wxHashTable *m_Hash; - static bool CheckHash(const wxString& filename); + static bool CheckHash(const wxString& filename); }; -#endif - // wxUSE_FILESYSTEM +class wxMemoryFSHandler : public wxMemoryFSHandlerBase +{ +public: +#if wxUSE_GUI + static void AddFile(const wxString& filename, const wxBitmap& bitmap, long type); +#endif // wxUSE_GUI +}; +#endif // wxUSE_FILESYSTEM #endif // _WX_FS_MEM_H_ diff --git a/include/wx/gtk/app.h b/include/wx/gtk/app.h index 398275be71..fbd5a55e6a 100644 --- a/include/wx/gtk/app.h +++ b/include/wx/gtk/app.h @@ -46,8 +46,12 @@ public: virtual bool Initialized(); virtual bool Pending(); virtual void Dispatch(); + + virtual void Exit(); + virtual bool Yield(bool onlyIfNeeded = FALSE); virtual bool ProcessIdle(); + virtual void WakeUpIdle(); // implementation only from now on void OnIdle( wxIdleEvent &event ); diff --git a/include/wx/gtk1/app.h b/include/wx/gtk1/app.h index 398275be71..fbd5a55e6a 100644 --- a/include/wx/gtk1/app.h +++ b/include/wx/gtk1/app.h @@ -46,8 +46,12 @@ public: virtual bool Initialized(); virtual bool Pending(); virtual void Dispatch(); + + virtual void Exit(); + virtual bool Yield(bool onlyIfNeeded = FALSE); virtual bool ProcessIdle(); + virtual void WakeUpIdle(); // implementation only from now on void OnIdle( wxIdleEvent &event ); diff --git a/include/wx/mac/app.h b/include/wx/mac/app.h index 23b4cb0a60..389d6b0d8a 100644 --- a/include/wx/mac/app.h +++ b/include/wx/mac/app.h @@ -52,8 +52,12 @@ class WXDLLEXPORT wxApp: public wxAppBase virtual bool Initialized(); virtual bool Pending() ; virtual void Dispatch() ; + + virtual void Exit(); + virtual bool Yield(bool onlyIfNeeded = FALSE); virtual bool ProcessIdle(); + virtual void WakeUpIdle(); virtual void SetPrintMode(int mode) { m_printMode = mode; } virtual int GetPrintMode() const { return m_printMode; } diff --git a/include/wx/motif/app.h b/include/wx/motif/app.h index 95c087af98..1e24fb47ce 100644 --- a/include/wx/motif/app.h +++ b/include/wx/motif/app.h @@ -55,8 +55,12 @@ public: virtual bool Initialized(); virtual bool Pending(); virtual void Dispatch(); + + virtual void Exit(); + virtual bool Yield(bool onlyIfNeeded = FALSE); virtual bool ProcessIdle(); + virtual void WakeUpIdle(); // implemented in motif/evtloop.cpp virtual bool OnInitGui(); diff --git a/include/wx/msgout.h b/include/wx/msgout.h index 7a43ada630..f6422c6f38 100755 --- a/include/wx/msgout.h +++ b/include/wx/msgout.h @@ -74,6 +74,18 @@ public: #endif // wxUSE_GUI +// ---------------------------------------------------------------------------- +// implementation using the native way of outputting debug messages +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMessageOutputDebug : public wxMessageOutput +{ +public: + wxMessageOutputDebug() { } + + virtual void Printf(const wxChar* format, ...) ATTRIBUTE_PRINTF_2; +}; + // ---------------------------------------------------------------------------- // implementation using wxLog (mainly for backwards compatibility) // ---------------------------------------------------------------------------- diff --git a/include/wx/msw/app.h b/include/wx/msw/app.h index c85dcc4b83..8f384d947b 100644 --- a/include/wx/msw/app.h +++ b/include/wx/msw/app.h @@ -41,8 +41,10 @@ public: virtual bool Initialized(); virtual bool Pending(); virtual void Dispatch(); + virtual bool Yield(bool onlyIfNeeded = FALSE); virtual bool ProcessIdle(); + virtual void WakeUpIdle(); virtual void SetPrintMode(int mode) { m_printMode = mode; } virtual int GetPrintMode() const { return m_printMode; } diff --git a/include/wx/msw/apptbase.h b/include/wx/msw/apptbase.h new file mode 100644 index 0000000000..a080eea7b7 --- /dev/null +++ b/include/wx/msw/apptbase.h @@ -0,0 +1,46 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/apptbase.h +// Purpose: declaration of wxAppTraits for MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.06.2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_APPTBASE_H_ +#define _WX_MSW_APPTBASE_H_ + +// ---------------------------------------------------------------------------- +// wxAppTraits: the MSW version adds extra hooks needed by MSW-only code +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAppTraits : public wxAppTraitsBase +{ +public: + // wxExecute() support methods + // --------------------------- + + // called before starting to wait for the child termination, may return + // some opaque data which will be passed later to AfterChildWaitLoop() + virtual void *BeforeChildWaitLoop() = 0; + + // process pending Windows messages, even in console app + virtual void AlwaysYield() = 0; + + // called after starting to wait for the child termination, the parameter + // is the return value of BeforeChildWaitLoop() + virtual void AfterChildWaitLoop(void *data) = 0; + + + // wxThread helpers + // ---------------- + + // process a message while waiting for a(nother) thread, should return + // false if and only if we have to exit the application + virtual bool DoMessageFromThreadWait() = 0; +}; + +#endif // _WX_MSW_APPTBASE_H_ + diff --git a/include/wx/msw/apptrait.h b/include/wx/msw/apptrait.h new file mode 100644 index 0000000000..86e7a1014f --- /dev/null +++ b/include/wx/msw/apptrait.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/apptrait.h +// Purpose: class implementing wxAppTraits for MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_APPTRAIT_H_ +#define _WX_MSW_APPTRAIT_H_ + +// ---------------------------------------------------------------------------- +// wxGUI/ConsoleAppTraits: must derive from wxAppTraits, not wxAppTraitsBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxConsoleAppTraits : public wxConsoleAppTraitsBase +{ +public: + virtual void *BeforeChildWaitLoop(); + virtual void AlwaysYield(); + virtual void AfterChildWaitLoop(void *data); + + virtual bool DoMessageFromThreadWait(); +}; + +#if wxUSE_GUI + +class WXDLLEXPORT wxGUIAppTraits : public wxGUIAppTraitsBase +{ +public: + virtual void *BeforeChildWaitLoop(); + virtual void AlwaysYield(); + virtual void AfterChildWaitLoop(void *data); + + virtual bool DoMessageFromThreadWait(); +}; + +#endif // wxUSE_GUI + +#endif // _WX_MSW_APPTRAIT_H_ + diff --git a/include/wx/msw/missing.h b/include/wx/msw/missing.h index 516a68b863..e630907950 100644 --- a/include/wx/msw/missing.h +++ b/include/wx/msw/missing.h @@ -240,6 +240,50 @@ struct HH_AKLINK BOOL fIndexOnFail; }; +// ---------------------------------------------------------------------------- +// SHGetFileInfo-related things +// ---------------------------------------------------------------------------- + +#ifndef SHGetFileInfo + #ifdef UNICODE + #define SHGetFileInfo SHGetFileInfoW + #else + #define SHGetFileInfo SHGetFileInfoA + #endif +#endif + +#ifndef SHGFI_ATTRIBUTES + #define SHGFI_ATTRIBUTES 2048 +#endif + +#ifndef SFGAO_READONLY + #define SFGAO_READONLY 0x00040000L +#endif + +#ifndef SFGAO_REMOVABLE + #define SFGAO_REMOVABLE 0x02000000L +#endif + +#ifndef SHGFI_DISPLAYNAME + #define SHGFI_DISPLAYNAME 512 +#endif + +#ifndef SHGFI_ICON + #define SHGFI_ICON 256 +#endif + +#ifndef SHGFI_SMALLICON + #define SHGFI_SMALLICON 1 +#endif + +#ifndef SHGFI_SHELLICONSIZE + #define SHGFI_SHELLICONSIZE 4 +#endif + +#ifndef SHGFI_OPENICON + #define SHGFI_OPENICON 2 +#endif + // ---------------------------------------------------------------------------- // Rich text control // ---------------------------------------------------------------------------- @@ -319,7 +363,7 @@ typedef struct _paraformat2 { #endif -#endif +#endif // wxUSE_RICHEDIT // ---------------------------------------------------------------------------- // Misc stuff diff --git a/include/wx/os2/app.h b/include/wx/os2/app.h index fe2486b853..db41f62a49 100644 --- a/include/wx/os2/app.h +++ b/include/wx/os2/app.h @@ -76,8 +76,12 @@ public: virtual bool Initialized(void); virtual bool Pending(void) ; virtual void Dispatch(void); + + virtual void Exit(); + virtual bool Yield(bool onlyIfNeeded = FALSE); - virtual bool ProcessIdle(void); + virtual bool ProcessIdle(void); + virtual void WakeUpIdle(void); virtual void SetPrintMode(int mode) { m_nPrintMode = mode; } virtual int GetPrintMode(void) const { return m_nPrintMode; } diff --git a/include/wx/unix/apptbase.h b/include/wx/unix/apptbase.h new file mode 100644 index 0000000000..3832761d13 --- /dev/null +++ b/include/wx/unix/apptbase.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/apptbase.h +// Purpose: declaration of wxAppTraits for Unix systems +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.06.2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_APPTBASE_H_ +#define _WX_UNIX_APPTBASE_H_ + +class wxExecuteData; +class wxPipe; + +// ---------------------------------------------------------------------------- +// wxAppTraits: the Unix version adds extra hooks needed by Unix code +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAppTraits : public wxAppTraitsBase +{ +public: + // wxExecute() support methods + // --------------------------- + + // called before starting the child process and creates the pipe used for + // detecting the process termination asynchronously in GUI, does nothing in + // wxBase + // + // if it returns false, we should return from wxExecute() with an error + virtual bool CreateEndProcessPipe(wxExecuteData& execData) = 0; + + // test if the given descriptor is the end of the pipe create by the + // function above + virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd) = 0; + + // ensure that the write end of the pipe is not closed by wxPipe dtor + virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData) = 0; + + // wait for the process termination, return whatever wxExecute() must + // return + virtual int WaitForChild(wxExecuteData& execData) = 0; + + + // wxThread helpers + // ---------------- + + // TODO + + + // other miscellaneous helpers + // --------------------------- + + // wxGetOsVersion() behaves differently in GUI and non-GUI builds udner + // Unix: in the former case it returns the information about the toolkit + // and in the latter -- about the OS, so we need to virtualize it + virtual int GetOSVersion(int *verMaj, int *verMin) = 0; +}; + +#endif // _WX_UNIX_APPTBASE_H_ + diff --git a/include/wx/unix/apptrait.h b/include/wx/unix/apptrait.h new file mode 100644 index 0000000000..30b96497c1 --- /dev/null +++ b/include/wx/unix/apptrait.h @@ -0,0 +1,46 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/apptrait.h +// Purpose: standard implementations of wxAppTraits for Unix +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.06.2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_APPTRAIT_H_ +#define _WX_UNIX_APPTRAIT_H_ + +// ---------------------------------------------------------------------------- +// wxGUI/ConsoleAppTraits: must derive from wxAppTraits, not wxAppTraitsBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxConsoleAppTraits : public wxConsoleAppTraitsBase +{ +public: + virtual bool CreateEndProcessPipe(); + virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd); + virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData); + virtual int WaitForChild(wxExecuteData& execData); + + virtual int GetOSVersion(int *verMaj, int *verMin); +}; + +#if wxUSE_GUI + +class WXDLLEXPORT wxGUIAppTraits : public wxGUIAppTraitsBase +{ +public: + virtual bool CreateEndProcessPipe(wxExecuteData& execData); + virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd); + virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData); + virtual int WaitForChild(wxExecuteData& execData); + + virtual int GetOSVersion(int *verMaj, int *verMin); +}; + +#endif // wxUSE_GUI + +#endif // _WX_UNIX_APPTRAIT_H_ + diff --git a/include/wx/unix/execute.h b/include/wx/unix/execute.h index ef2869a512..fd4d026904 100644 --- a/include/wx/unix/execute.h +++ b/include/wx/unix/execute.h @@ -10,6 +10,11 @@ #ifndef _WX_UNIX_EXECUTE_H #define _WX_UNIX_EXECUTE_H +#include "wx/unix/pipe.h" + +class wxProcess; +class wxStreamTempInputBuffer; + // if pid > 0, the execution is async and the data is freed in the callback // executed when the process terminates, if pid < 0, the execution is // synchronous and the caller (wxExecute) frees the data @@ -21,6 +26,43 @@ struct wxEndProcessData int exitcode; // the exit code }; +// struct in which information is passed from wxExecute() to wxAppTraits +// methods +struct wxExecuteData +{ + wxExecuteData() + { + flags = + pid = 0; + + process = NULL; + +#if wxUSE_STREAMS + bufOut = + bufErr = NULL; +#endif // wxUSE_STREAMS + } + + // wxExecute() flags + int flags; + + // the pid of the child process + int pid; + + // the associated process object or NULL + wxProcess *process; + + // pipe used for end process detection + wxPipe pipeEndProcDetect; + +#if wxUSE_STREAMS + // the input buffer bufOut is connected to stdout, this is why it is + // called bufOut and not bufIn + wxStreamTempInputBuffer *bufOut, + *bufErr; +#endif // wxUSE_STREAMS +}; + // this function is called when the process terminates from port specific // callback function and is common to all ports (src/unix/utilsunx.cpp) extern void wxHandleProcessTermination(wxEndProcessData *proc_data); @@ -28,6 +70,7 @@ extern void wxHandleProcessTermination(wxEndProcessData *proc_data); // this function is called to associate the port-specific callback with the // child process. The return valus is port-specific. extern int wxAddProcessCallback(wxEndProcessData *proc_data, int fd); + // For ports (e.g. DARWIN) which can add callbacks based on the pid extern int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid); diff --git a/include/wx/unix/pipe.h b/include/wx/unix/pipe.h new file mode 100644 index 0000000000..a142b752a9 --- /dev/null +++ b/include/wx/unix/pipe.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/pipe.h +// Purpose: wxPipe class +// Author: Vadim Zeitlin +// Modified by: +// Created: 24.06.2003 (extracted from src/unix/utilsunx.cpp) +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_PIPE_H_ +#define _WX_UNIX_PIPE_H_ + +#include + +// ---------------------------------------------------------------------------- +// wxPipe: this class encapsulates pipe() system call +// ---------------------------------------------------------------------------- + +class wxPipe +{ +public: + // the symbolic names for the pipe ends + enum Direction + { + Read, + Write + }; + + enum + { + INVALID_FD = -1 + }; + + // default ctor doesn't do anything + wxPipe() { m_fds[Read] = m_fds[Write] = INVALID_FD; } + + // create the pipe, return TRUE if ok, FALSE on error + bool Create() + { + if ( pipe(m_fds) == -1 ) + { + wxLogSysError(_("Pipe creation failed")); + + return FALSE; + } + + return TRUE; + } + + // return TRUE if we were created successfully + bool IsOk() const { return m_fds[Read] != INVALID_FD; } + + // return the descriptor for one of the pipe ends + int operator[](Direction which) const + { + wxASSERT_MSG( which >= 0 && (size_t)which < WXSIZEOF(m_fds), + _T("invalid pipe index") ); + + return m_fds[which]; + } + + // detach a descriptor, meaning that the pipe dtor won't close it, and + // return it + int Detach(Direction which) + { + wxASSERT_MSG( which >= 0 && (size_t)which < WXSIZEOF(m_fds), + _T("invalid pipe index") ); + + int fd = m_fds[which]; + m_fds[which] = INVALID_FD; + + return fd; + } + + // close the pipe descriptors + void Close() + { + for ( size_t n = 0; n < WXSIZEOF(m_fds); n++ ) + { + if ( m_fds[n] != INVALID_FD ) + close(m_fds[n]); + } + } + + // dtor closes the pipe descriptors + ~wxPipe() { Close(); } + +private: + int m_fds[2]; +}; + +#endif // _WX_UNIX_PIPE_H_ + diff --git a/include/wx/volume.h b/include/wx/volume.h index 6d095f09f7..b54a945940 100644 --- a/include/wx/volume.h +++ b/include/wx/volume.h @@ -24,10 +24,6 @@ #if wxUSE_FSVOLUME -#if wxUSE_GUI - #include "wx/iconbndl.h" // for wxIconArray -#endif // wxUSE_GUI - // the volume flags enum { @@ -56,22 +52,7 @@ enum wxFSVolumeKind wxFS_VOL_MAX }; -#if wxUSE_GUI - -#include "wx/icon.h" - -enum wxFSIconType -{ - wxFS_VOL_ICO_SMALL = 0, - wxFS_VOL_ICO_LARGE, - wxFS_VOL_ICO_SEL_SMALL, - wxFS_VOL_ICO_SEL_LARGE, - wxFS_VOL_ICO_MAX -}; - -#endif // wxUSE_GUI - -class WXDLLEXPORT wxFSVolume +class WXDLLEXPORT wxFSVolumeBase { public: // return the array containing the names of the volumes @@ -88,8 +69,8 @@ public: // create the volume object with this name (should be one of those returned // by GetVolumes()). - wxFSVolume(); - wxFSVolume(const wxString& name); + wxFSVolumeBase(); + wxFSVolumeBase(const wxString& name); bool Create(const wxString& name); // accessors @@ -112,22 +93,61 @@ public: wxString GetName() const { return m_volName; } wxString GetDisplayName() const { return m_dispName; } -#if wxUSE_GUI - wxIcon GetIcon(wxFSIconType type) const; -#endif - // TODO: operatios (Mount(), Unmount(), Eject(), ...)? -private: +protected: + // the internal volume name wxString m_volName; + + // the volume name as it is displayed to the user wxString m_dispName; + + // have we been initialized correctly? + bool m_isOk; +}; + #if wxUSE_GUI + +#include "wx/icon.h" +#include "wx/iconbndl.h" // only for wxIconArray + +enum wxFSIconType +{ + wxFS_VOL_ICO_SMALL = 0, + wxFS_VOL_ICO_LARGE, + wxFS_VOL_ICO_SEL_SMALL, + wxFS_VOL_ICO_SEL_LARGE, + wxFS_VOL_ICO_MAX +}; + +// wxFSVolume adds GetIcon() to wxFSVolumeBase +class wxFSVolume : public wxFSVolumeBase +{ +public: + wxFSVolume() : wxFSVolumeBase() { InitIcons(); } + wxFSVolume(const wxString& name) : wxFSVolumeBase(name) { InitIcons(); } + + wxIcon GetIcon(wxFSIconType type) const; + +private: + void InitIcons(); + + // the different icons for this volume (created on demand) wxIconArray m_icons; -#endif - bool m_isOk; +}; + +#else // !wxUSE_GUI +// wxFSVolume is the same thing as wxFSVolume in wxBase +class wxFSVolume : public wxFSVolumeBase +{ +public: + wxFSVolume() : wxFSVolumeBase() { } + wxFSVolume(const wxString& name) : wxFSVolumeBase(name) { } }; +#endif // wxUSE_GUI/!wxUSE_GUI + #endif // wxUSE_FSVOLUME #endif // _WX_FSVOLUME_H_ diff --git a/include/wx/x11/app.h b/include/wx/x11/app.h index 80b3eafff0..20e3dfb2b5 100644 --- a/include/wx/x11/app.h +++ b/include/wx/x11/app.h @@ -55,8 +55,12 @@ public: virtual bool Initialized(); virtual bool Pending(); virtual void Dispatch(); + + virtual void Exit(); + virtual bool Yield(bool onlyIfNeeded = FALSE); virtual bool ProcessIdle(); + virtual void WakeUpIdle(); virtual bool OnInitGui(); diff --git a/src/cocoa/app.mm b/src/cocoa/app.mm index 08a8e44355..a63730b2ee 100644 --- a/src/cocoa/app.mm +++ b/src/cocoa/app.mm @@ -205,20 +205,11 @@ int wxEntry( int argc, char *argv[]) return retValue; } -// ---------------------------------------------------------------------------- -// other functions -// ---------------------------------------------------------------------------- -void wxWakeUpIdle() -{ - wxTheApp->CocoaRequestIdle(); -} - -void wxExit() +void wxApp::Exit() { - wxLogError(_("Fatal error: exiting")); - wxApp::CleanUp(); - exit(1); + + wxAppConsole::Exit(); } // ============================================================================ diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp new file mode 100644 index 0000000000..1d63e99672 --- /dev/null +++ b/src/common/appbase.cpp @@ -0,0 +1,735 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/base/appbase.cpp +// Purpose: implements wxAppConsole class +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.06.2003 (extracted from common/appcmn.cpp) +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #if wxUSE_LOG + #include "wx/log.h" + #endif // wxUSE_LOG +#endif //WX_PRECOMP + +#include "wx/apptrait.h" +#include "wx/cmdline.h" +#include "wx/confbase.h" +#if wxUSE_FONTMAP + #include "wx/fontmap.h" +#endif // wxUSE_FONTMAP +#include "wx/msgout.h" +#include "wx/tokenzr.h" + +#if !defined(__WXMSW__) || defined(__WXMICROWIN__) + #include // for SIGTRAP used by wxTrap() +#endif //Win/Unix + +#if defined(__WXMSW__) + #include "wx/msw/private.h" // includes windows.h for MessageBox() +#endif + +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + +// ---------------------------------------------------------------------------- +// private functions prototypes +// ---------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ + // really just show the assert dialog + static bool DoShowAssertDialog(const wxString& msg); + + // prepare for showing the assert dialog, use the given traits or + // DoShowAssertDialog() as last fallback to really show it + static + void ShowAssertDialog(const wxChar *szFile, + int nLine, + const wxChar *szCond, + const wxChar *szMsg, + wxAppTraits *traits = NULL); + + // turn on the trace masks specified in the env variable WXTRACE + static void LINKAGEMODE SetTraceMasks(); +#endif // __WXDEBUG__ + +// ---------------------------------------------------------------------------- +// global vars +// ---------------------------------------------------------------------------- + +wxApp *wxTheApp = NULL; + +wxAppInitializerFunction wxAppConsole::ms_appInitFn = NULL; + +// ============================================================================ +// wxAppConsole implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// ctor/dtor +// ---------------------------------------------------------------------------- + +wxAppConsole::wxAppConsole() +{ + m_traits = NULL; + + wxTheApp = (wxApp *)this; + +#ifdef __WXDEBUG__ + SetTraceMasks(); +#endif +} + +wxAppConsole::~wxAppConsole() +{ + delete m_traits; +} + +// ---------------------------------------------------------------------------- +// OnXXX() callbacks +// ---------------------------------------------------------------------------- + +bool wxAppConsole::OnInit() +{ +#if wxUSE_CMDLINE_PARSER + wxCmdLineParser parser(argc, argv); + + OnInitCmdLine(parser); + + bool cont; + switch ( parser.Parse(FALSE /* don't show usage */) ) + { + case -1: + cont = OnCmdLineHelp(parser); + break; + + case 0: + cont = OnCmdLineParsed(parser); + break; + + default: + cont = OnCmdLineError(parser); + break; + } + + if ( !cont ) + return FALSE; +#endif // wxUSE_CMDLINE_PARSER + + return TRUE; +} + +int wxAppConsole::OnExit() +{ +#if wxUSE_CONFIG + // delete the config object if any (don't use Get() here, but Set() + // because Get() could create a new config object) + delete wxConfigBase::Set((wxConfigBase *) NULL); +#endif // wxUSE_CONFIG + +#ifdef __WXUNIVERSAL__ + delete wxTheme::Set(NULL); +#endif // __WXUNIVERSAL__ + + // use Set(NULL) and not Get() to avoid creating a message output object on + // demand when we just want to delete it + delete wxMessageOutput::Set(NULL); + + return 0; +} + +void wxAppConsole::Exit() +{ + exit(-1); +} + +// ---------------------------------------------------------------------------- +// traits stuff +// ---------------------------------------------------------------------------- + +wxAppTraits *wxAppConsole::CreateTraits() +{ + return wxAppTraits::CreateConsole(); +} + +wxAppTraits *wxAppConsole::GetTraits() +{ + // FIXME-MT: protect this with a CS? + if ( !m_traits ) + { + m_traits = CreateTraits(); + + wxASSERT_MSG( m_traits, _T("wxApp::CreateTraits() failed?") ); + } + + return m_traits; +} + +// we must implement CreateXXX() in wxApp itself for backwards compatibility +#if WXWIN_COMPATIBILITY_2_4 + +#if wxUSE_LOG + +wxLog *wxAppConsole::CreateLogTarget() +{ + wxAppTraits *traits = GetTraits(); + return traits ? traits->CreateLogTarget() : NULL; +} + +#endif // wxUSE_LOG + +wxMessageOutput *wxAppConsole::CreateMessageOutput() +{ + wxAppTraits *traits = GetTraits(); + return traits ? traits->CreateMessageOutput() : NULL; +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// event processing +// ---------------------------------------------------------------------------- + +void wxAppConsole::ProcessPendingEvents() +{ + // ensure that we're the only thread to modify the pending events list + wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + + if ( !wxPendingEvents ) + { + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + return; + } + + // iterate until the list becomes empty + wxNode *node = wxPendingEvents->GetFirst(); + while (node) + { + wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); + delete node; + + // In ProcessPendingEvents(), new handlers might be add + // and we can safely leave the critical section here. + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + handler->ProcessPendingEvents(); + wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + + node = wxPendingEvents->GetFirst(); + } + + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); +} + +int wxAppConsole::FilterEvent(wxEvent& WXUNUSED(event)) +{ + // process the events normally by default + return -1; +} + +// ---------------------------------------------------------------------------- +// cmd line parsing +// ---------------------------------------------------------------------------- + +#if wxUSE_CMDLINE_PARSER + +#define OPTION_VERBOSE _T("verbose") +#define OPTION_THEME _T("theme") +#define OPTION_MODE _T("mode") + +void wxAppConsole::OnInitCmdLine(wxCmdLineParser& parser) +{ + // the standard command line options + static const wxCmdLineEntryDesc cmdLineDesc[] = + { + { + wxCMD_LINE_SWITCH, + _T("h"), + _T("help"), + gettext_noop("show this help message"), + wxCMD_LINE_VAL_NONE, + wxCMD_LINE_OPTION_HELP + }, + +#if wxUSE_LOG + { + wxCMD_LINE_SWITCH, + _T(""), + OPTION_VERBOSE, + gettext_noop("generate verbose log messages"), + wxCMD_LINE_VAL_NONE, + 0x0 + }, +#endif // wxUSE_LOG + +#ifdef __WXUNIVERSAL__ + { + wxCMD_LINE_OPTION, + _T(""), + OPTION_THEME, + gettext_noop("specify the theme to use"), + wxCMD_LINE_VAL_STRING, + 0x0 + }, +#endif // __WXUNIVERSAL__ + +#if defined(__WXMGL__) + // VS: this is not specific to wxMGL, all fullscreen (framebuffer) ports + // should provide this option. That's why it is in common/appcmn.cpp + // and not mgl/app.cpp + { + wxCMD_LINE_OPTION, + _T(""), + OPTION_MODE, + gettext_noop("specify display mode to use (e.g. 640x480-16)"), + wxCMD_LINE_VAL_STRING, + 0x0 + }, +#endif // __WXMGL__ + + // terminator + { + wxCMD_LINE_NONE, + _T(""), + _T(""), + _T(""), + wxCMD_LINE_VAL_NONE, + 0x0 + } + }; + + parser.SetDesc(cmdLineDesc); +} + +bool wxAppConsole::OnCmdLineParsed(wxCmdLineParser& parser) +{ +#if wxUSE_LOG + if ( parser.Found(OPTION_VERBOSE) ) + { + wxLog::SetVerbose(TRUE); + } +#endif // wxUSE_LOG + +#ifdef __WXUNIVERSAL__ + wxString themeName; + if ( parser.Found(OPTION_THEME, &themeName) ) + { + wxTheme *theme = wxTheme::Create(themeName); + if ( !theme ) + { + wxLogError(_("Unsupported theme '%s'."), themeName.c_str()); + return FALSE; + } + + // Delete the defaultly created theme and set the new theme. + delete wxTheme::Get(); + wxTheme::Set(theme); + } +#endif // __WXUNIVERSAL__ + +#if defined(__WXMGL__) + wxString modeDesc; + if ( parser.Found(OPTION_MODE, &modeDesc) ) + { + unsigned w, h, bpp; + if ( wxSscanf(modeDesc.c_str(), _T("%ux%u-%u"), &w, &h, &bpp) != 3 ) + { + wxLogError(_("Invalid display mode specification '%s'."), modeDesc.c_str()); + return FALSE; + } + + if ( !SetDisplayMode(wxDisplayModeInfo(w, h, bpp)) ) + return FALSE; + } +#endif // __WXMGL__ + + return TRUE; +} + +bool wxAppConsole::OnCmdLineHelp(wxCmdLineParser& parser) +{ + parser.Usage(); + + return FALSE; +} + +bool wxAppConsole::OnCmdLineError(wxCmdLineParser& parser) +{ + parser.Usage(); + + return FALSE; +} + +#endif // wxUSE_CMDLINE_PARSER + +// ---------------------------------------------------------------------------- +// debugging support +// ---------------------------------------------------------------------------- + +/* static */ +bool wxAppConsole::CheckBuildOptions(const wxBuildOptions& opts) +{ +#define wxCMP(what) (what == opts.m_ ## what) + + bool +#ifdef __WXDEBUG__ + isDebug = TRUE; +#else + isDebug = FALSE; +#endif + + int verMaj = wxMAJOR_VERSION, + verMin = wxMINOR_VERSION; + + if ( !(wxCMP(isDebug) && wxCMP(verMaj) && wxCMP(verMin)) ) + { + wxString msg; + wxString libDebug, progDebug; + + if (isDebug) + libDebug = wxT("debug"); + else + libDebug = wxT("no debug"); + + if (opts.m_isDebug) + progDebug = wxT("debug"); + else + progDebug = wxT("no debug"); + + msg.Printf(_T("Mismatch between the program and library build versions detected.\nThe library used %d.%d (%s), and your program used %d.%d (%s)."), + verMaj, verMin, libDebug.c_str(), opts.m_verMaj, opts.m_verMin, progDebug.c_str()); + + wxLogFatalError(msg); + + // normally wxLogFatalError doesn't return + return FALSE; + } +#undef wxCMP + + return TRUE; +} + +#ifdef __WXDEBUG__ + +void wxAppConsole::OnAssert(const wxChar *file, + int line, + const wxChar *cond, + const wxChar *msg) +{ + ShowAssertDialog(file, line, cond, msg, m_traits); +} + +#endif // __WXDEBUG__ + +// ============================================================================ +// other classes implementations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxConsoleAppTraitsBase +// ---------------------------------------------------------------------------- + +#if wxUSE_LOG + +wxLog *wxConsoleAppTraitsBase::CreateLogTarget() +{ + return new wxLogStderr; +} + +#endif // wxUSE_LOG + +wxMessageOutput *wxConsoleAppTraitsBase::CreateMessageOutput() +{ + return new wxMessageOutputStderr; +} + +#if wxUSE_FONTMAP + +wxFontMapper *wxConsoleAppTraitsBase::CreateFontMapper() +{ + return (wxFontMapper *)new wxFontMapperBase; +} + +#endif // wxUSE_FONTMAP + +bool wxConsoleAppTraitsBase::ShowAssertDialog(const wxString& msg) +{ + return wxAppTraitsBase::ShowAssertDialog(msg); +} + +bool wxConsoleAppTraitsBase::HasStderr() +{ + // console applications always have stderr, even under Mac/Windows + return true; +} + +void wxConsoleAppTraitsBase::ScheduleForDestroy(wxObject *object) +{ + delete object; +} + +void wxConsoleAppTraitsBase::RemoveFromPendingDelete(wxObject * WXUNUSED(object)) +{ + // nothing to do +} + +// ---------------------------------------------------------------------------- +// wxAppTraits +// ---------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ + +bool wxAppTraitsBase::ShowAssertDialog(const wxString& msg) +{ + return DoShowAssertDialog(msg); +} + +#endif // __WXDEBUG__ + +wxAppTraits *wxAppTraitsBase::CreateConsole() +{ + return new wxConsoleAppTraits; +} + +// ============================================================================ +// global functions implementation +// ============================================================================ + +void wxExit() +{ + if ( wxTheApp ) + { + wxTheApp->Exit(); + } + else + { + // what else can we do? + exit(-1); + } +} + +void wxWakeUpIdle() +{ + if ( wxTheApp ) + { + wxTheApp->WakeUpIdle(); + } + //else: do nothing, what can we do? +} + +#ifdef __WXDEBUG__ + +// wxASSERT() helper +bool wxAssertIsEqual(int x, int y) +{ + return x == y; +} + +// break into the debugger +void wxTrap() +{ +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + DebugBreak(); +#elif defined(__WXMAC__) && !defined(__DARWIN__) + #if __powerc + Debugger(); + #else + SysBreak(); + #endif +#elif defined(__UNIX__) + raise(SIGTRAP); +#else + // TODO +#endif // Win/Unix +} + +void wxAssert(int cond, + const wxChar *szFile, + int nLine, + const wxChar *szCond, + const wxChar *szMsg) +{ + if ( !cond ) + wxOnAssert(szFile, nLine, szCond, szMsg); +} + +// this function is called when an assert fails +void wxOnAssert(const wxChar *szFile, + int nLine, + const wxChar *szCond, + const wxChar *szMsg) +{ + // FIXME MT-unsafe + static bool s_bInAssert = FALSE; + + if ( s_bInAssert ) + { + // He-e-e-e-elp!! we're trapped in endless loop + wxTrap(); + + s_bInAssert = FALSE; + + return; + } + + s_bInAssert = TRUE; + + if ( !wxTheApp ) + { + // by default, show the assert dialog box -- we can't customize this + // behaviour + ShowAssertDialog(szFile, nLine, szCond, szMsg); + } + else + { + // let the app process it as it wants + wxTheApp->OnAssert(szFile, nLine, szCond, szMsg); + } + + s_bInAssert = FALSE; +} + +#endif // __WXDEBUG__ + +// ============================================================================ +// private functions implementation +// ============================================================================ + +#ifdef __WXDEBUG__ + +static void LINKAGEMODE SetTraceMasks() +{ +#if wxUSE_LOG + wxString mask; + if ( wxGetEnv(wxT("WXTRACE"), &mask) ) + { + wxStringTokenizer tkn(mask, wxT(",;:")); + while ( tkn.HasMoreTokens() ) + wxLog::AddTraceMask(tkn.GetNextToken()); + } +#endif // wxUSE_LOG +} + +bool DoShowAssertDialog(const wxString& msg) +{ + // under MSW we can show the dialog even in the console mode +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + wxString msgDlg(msg); + + // this message is intentionally not translated -- it is for + // developpers only + msgDlg += wxT("\nDo you want to stop the program?\n") + wxT("You can also choose [Cancel] to suppress ") + wxT("further warnings."); + + switch ( ::MessageBox(NULL, msgDlg, _T("wxWindows Debug Alert"), + MB_YESNOCANCEL | MB_ICONSTOP ) ) + { + case IDYES: + wxTrap(); + break; + + case IDCANCEL: + // stop the asserts + return true; + + //case IDNO: nothing to do + } +#else // !__WXMSW__ + wxFprintf(stderr, wxT("%s\n"), msg.c_str()); + fflush(stderr); + + // TODO: ask the user to enter "Y" or "N" on the console? + wxTrap(); +#endif // __WXMSW__/!__WXMSW__ + + // continue with the asserts + return false; +} + +// show the assert modal dialog +static +void ShowAssertDialog(const wxChar *szFile, + int nLine, + const wxChar *szCond, + const wxChar *szMsg, + wxAppTraits *traits) +{ + // this variable can be set to true to suppress "assert failure" messages + static bool s_bNoAsserts = FALSE; + + wxString msg; + msg.reserve(2048); + + // make life easier for people using VC++ IDE by using this format: like + // this, clicking on the message will take us immediately to the place of + // the failed assert + msg.Printf(wxT("%s(%d): assert \"%s\" failed"), szFile, nLine, szCond); + + if ( szMsg ) + { + msg << _T(": ") << szMsg; + } + else // no message given + { + msg << _T('.'); + } + +#if wxUSE_THREADS + // if we are not in the main thread, output the assert directly and trap + // since dialogs cannot be displayed + if ( !wxThread::IsMain() ) + { + msg += wxT(" [in child thread]"); + +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + msg << wxT("\r\n"); + OutputDebugString(msg ); +#else + // send to stderr + wxFprintf(stderr, wxT("%s\n"), msg.c_str()); + fflush(stderr); +#endif + // He-e-e-e-elp!! we're asserting in a child thread + wxTrap(); + } +#endif // wxUSE_THREADS + + if ( !s_bNoAsserts ) + { + // send it to the normal log destination + wxLogDebug(_T("%s"), msg); + + if ( traits ) + { + // delegate showing assert dialog (if possible) to that class + s_bNoAsserts = traits->ShowAssertDialog(msg); + } + else // no traits object + { + // fall back to the function of last resort + s_bNoAsserts = DoShowAssertDialog(msg); + } + } +} + +#endif // __WXDEBUG__ + diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 25bda2572b..2652222813 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: common/appcmn.cpp -// Purpose: wxAppBase methods common to all platforms +// Purpose: wxAppConsole and wxAppBase methods common to all platforms // Author: Vadim Zeitlin // Modified by: // Created: 18.10.99 @@ -32,45 +32,20 @@ #include "wx/app.h" #include "wx/intl.h" #include "wx/list.h" - #if wxUSE_LOG - #include "wx/log.h" - #endif // wxUSE_LOG - #if wxUSE_GUI - #include "wx/msgdlg.h" - #endif // wxUSE_GUI + #include "wx/msgdlg.h" #endif -#include "wx/cmdline.h" +#include "wx/apptrait.h" +#if wxUSE_FONTMAP + #include "wx/fontmap.h" +#endif // wxUSE_FONTMAP +#include "wx/msgout.h" #include "wx/thread.h" -#include "wx/confbase.h" -#include "wx/tokenzr.h" #include "wx/utils.h" -#include "wx/msgout.h" - -#if wxUSE_GUI - #include "wx/artprov.h" -#endif // wxUSE_GUI - -#if !defined(__WXMSW__) || defined(__WXMICROWIN__) - #include // for SIGTRAP used by wxTrap() -#endif //Win/Unix - -#if defined(__WXMSW__) - #include "wx/msw/private.h" // includes windows.h for MessageBox() -#endif -#if defined(__WXMAC__) - #include "wx/mac/private.h" // includes mac headers -#endif - -// private functions prototypes -#ifdef __WXDEBUG__ - static void LINKAGEMODE SetTraceMasks(); -#endif // __WXDEBUG__ - -// =========================================================================== -// implementation -// =========================================================================== +// ============================================================================ +// wxAppBase implementation +// ============================================================================ // ---------------------------------------------------------------------------- // initialization and termination @@ -78,13 +53,6 @@ wxAppBase::wxAppBase() { - wxTheApp = (wxApp *)this; - -#if WXWIN_COMPATIBILITY_2_2 - m_wantDebugOutput = FALSE; -#endif // WXWIN_COMPATIBILITY_2_2 - -#if wxUSE_GUI m_topWindow = (wxWindow *)NULL; m_useBestVisual = FALSE; m_isActive = TRUE; @@ -102,11 +70,6 @@ wxAppBase::wxAppBase() // safely (i.e. without losing the effect of the users SetExitOnFrameDelete // call) overwrite in OnRun() m_exitOnFrameDelete = Later; -#endif // wxUSE_GUI - -#ifdef __WXDEBUG__ - SetTraceMasks(); -#endif } wxAppBase::~wxAppBase() @@ -114,8 +77,6 @@ wxAppBase::~wxAppBase() // this destructor is required for Darwin } -#if wxUSE_GUI - bool wxAppBase::OnInitGui() { #ifdef __WXUNIVERSAL__ @@ -139,103 +100,20 @@ int wxAppBase::OnRun() return MainLoop(); } -#endif // wxUSE_GUI - -int wxAppBase::OnExit() +void wxAppBase::Exit() { -#if wxUSE_CONFIG - // delete the config object if any (don't use Get() here, but Set() - // because Get() could create a new config object) - delete wxConfigBase::Set((wxConfigBase *) NULL); -#endif // wxUSE_CONFIG - -#ifdef __WXUNIVERSAL__ - delete wxTheme::Set(NULL); -#endif // __WXUNIVERSAL__ - - // use Set(NULL) and not Get() to avoid creating a message output object on - // demand when we just want to delete it - delete wxMessageOutput::Set(NULL); - - return 0; + ExitMainLoop(); } -// ---------------------------------------------------------------------------- -// customization hooks -// ---------------------------------------------------------------------------- - -#if wxUSE_LOG - -wxLog *wxAppBase::CreateLogTarget() +wxAppTraits *wxAppBase::CreateTraits() { -#if wxUSE_GUI && wxUSE_LOGGUI && !defined(__WXMICROWIN__) - return new wxLogGui; -#else // !GUI - return new wxLogStderr; -#endif // wxUSE_GUI -} - -#endif // wxUSE_LOG - -wxMessageOutput *wxAppBase::CreateMessageOutput() -{ - // The standard way of printing help on command line arguments (app --help) - // is (according to common practice): - // - console apps: to stderr (on any platform) - // - GUI apps: stderr on Unix platforms (!) - // message box under Windows and others -#if wxUSE_GUI && !defined(__UNIX__) - // wxMessageOutputMessageBox doesn't work under Motif - #ifdef __WXMOTIF__ - return new wxMessageOutputLog; - #else - return new wxMessageOutputMessageBox; - #endif -#else // !wxUSE_GUI || __UNIX__ - return new wxMessageOutputStderr; -#endif -} - -// --------------------------------------------------------------------------- -// wxAppBase -// ---------------------------------------------------------------------------- - -void wxAppBase::ProcessPendingEvents() -{ - // ensure that we're the only thread to modify the pending events list - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); - - if ( !wxPendingEvents ) - { - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); - return; - } - - // iterate until the list becomes empty - wxNode *node = wxPendingEvents->GetFirst(); - while (node) - { - wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); - delete node; - - // In ProcessPendingEvents(), new handlers might be add - // and we can safely leave the critical section here. - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); - handler->ProcessPendingEvents(); - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); - - node = wxPendingEvents->GetFirst(); - } - - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + return wxAppTraits::CreateGUI(); } // ---------------------------------------------------------------------------- // misc // ---------------------------------------------------------------------------- -#if wxUSE_GUI - void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) { if ( active == m_isActive ) @@ -249,414 +127,112 @@ void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) (void)ProcessEvent(event); } -#endif // wxUSE_GUI - -int wxAppBase::FilterEvent(wxEvent& WXUNUSED(event)) -{ - // process the events normally by default - return -1; -} - // ---------------------------------------------------------------------------- -// cmd line parsing +// wxGUIAppTraitsBase // ---------------------------------------------------------------------------- -bool wxAppBase::OnInit() -{ -#if wxUSE_CMDLINE_PARSER - wxCmdLineParser parser(argc, argv); - - OnInitCmdLine(parser); - - bool cont; - switch ( parser.Parse(FALSE /* don't show usage */) ) - { - case -1: - cont = OnCmdLineHelp(parser); - break; - - case 0: - cont = OnCmdLineParsed(parser); - break; - - default: - cont = OnCmdLineError(parser); - break; - } - - if ( !cont ) - return FALSE; -#endif // wxUSE_CMDLINE_PARSER - - return TRUE; -} - -#if wxUSE_CMDLINE_PARSER - -#define OPTION_VERBOSE _T("verbose") -#define OPTION_THEME _T("theme") -#define OPTION_MODE _T("mode") - -void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) -{ - // the standard command line options - static const wxCmdLineEntryDesc cmdLineDesc[] = - { - { - wxCMD_LINE_SWITCH, - _T("h"), - _T("help"), - gettext_noop("show this help message"), - wxCMD_LINE_VAL_NONE, - wxCMD_LINE_OPTION_HELP - }, - #if wxUSE_LOG - { - wxCMD_LINE_SWITCH, - _T(""), - OPTION_VERBOSE, - gettext_noop("generate verbose log messages"), - wxCMD_LINE_VAL_NONE, - 0x0 - }, -#endif // wxUSE_LOG -#ifdef __WXUNIVERSAL__ - { - wxCMD_LINE_OPTION, - _T(""), - OPTION_THEME, - gettext_noop("specify the theme to use"), - wxCMD_LINE_VAL_STRING, - 0x0 - }, -#endif // __WXUNIVERSAL__ - -#if defined(__WXMGL__) - // VS: this is not specific to wxMGL, all fullscreen (framebuffer) ports - // should provide this option. That's why it is in common/appcmn.cpp - // and not mgl/app.cpp - { - wxCMD_LINE_OPTION, - _T(""), - OPTION_MODE, - gettext_noop("specify display mode to use (e.g. 640x480-16)"), - wxCMD_LINE_VAL_STRING, - 0x0 - }, -#endif // __WXMGL__ - - // terminator - { - wxCMD_LINE_NONE, - _T(""), - _T(""), - _T(""), - wxCMD_LINE_VAL_NONE, - 0x0 - } - }; - - parser.SetDesc(cmdLineDesc); +wxLog *wxGUIAppTraitsBase::CreateLogTarget() +{ + return new wxLogGui; } -bool wxAppBase::OnCmdLineParsed(wxCmdLineParser& parser) -{ -#if wxUSE_LOG - if ( parser.Found(OPTION_VERBOSE) ) - { - wxLog::SetVerbose(TRUE); - } #endif // wxUSE_LOG -#ifdef __WXUNIVERSAL__ - wxString themeName; - if ( parser.Found(OPTION_THEME, &themeName) ) - { - wxTheme *theme = wxTheme::Create(themeName); - if ( !theme ) - { - wxLogError(_("Unsupported theme '%s'."), themeName.c_str()); - return FALSE; - } - - // Delete the defaultly created theme and set the new theme. - delete wxTheme::Get(); - wxTheme::Set(theme); - } -#endif // __WXUNIVERSAL__ - -#if defined(__WXMGL__) - wxString modeDesc; - if ( parser.Found(OPTION_MODE, &modeDesc) ) - { - unsigned w, h, bpp; - if ( wxSscanf(modeDesc.c_str(), _T("%ux%u-%u"), &w, &h, &bpp) != 3 ) - { - wxLogError(_("Invalid display mode specification '%s'."), modeDesc.c_str()); - return FALSE; - } - - if ( !SetDisplayMode(wxDisplayModeInfo(w, h, bpp)) ) - return FALSE; - } -#endif // __WXMGL__ - - return TRUE; -} - -bool wxAppBase::OnCmdLineHelp(wxCmdLineParser& parser) +wxMessageOutput *wxGUIAppTraitsBase::CreateMessageOutput() { - parser.Usage(); - - return FALSE; + // The standard way of printing help on command line arguments (app --help) + // is (according to common practice): + // - console apps: to stderr (on any platform) + // - GUI apps: stderr on Unix platforms (!) + // message box under Windows and others +#ifdef __UNIX__ + return new wxMessageOutputStderr; +#else // !__UNIX__ + // wxMessageOutputMessageBox doesn't work under Motif + #ifdef __WXMOTIF__ + return new wxMessageOutputLog; + #else + return new wxMessageOutputMessageBox; + #endif +#endif // __UNIX__/!__UNIX__ } -bool wxAppBase::OnCmdLineError(wxCmdLineParser& parser) -{ - parser.Usage(); +#if wxUSE_FONTMAP - return FALSE; +wxFontMapper *wxGUIAppTraitsBase::CreateFontMapper() +{ + return new wxFontMapper; } -#endif // wxUSE_CMDLINE_PARSER +#endif // wxUSE_FONTMAP -// ---------------------------------------------------------------------------- -// debugging support -// ---------------------------------------------------------------------------- - -/* static */ -bool wxAppBase::CheckBuildOptions(const wxBuildOptions& opts) -{ -#define wxCMP(what) (what == opts.m_ ## what) - - bool #ifdef __WXDEBUG__ - isDebug = TRUE; -#else - isDebug = FALSE; -#endif - - int verMaj = wxMAJOR_VERSION, - verMin = wxMINOR_VERSION; - - if ( !(wxCMP(isDebug) && wxCMP(verMaj) && wxCMP(verMin)) ) - { - wxString msg; - wxString libDebug, progDebug; - - if (isDebug) - libDebug = wxT("debug"); - else - libDebug = wxT("no debug"); - - if (opts.m_isDebug) - progDebug = wxT("debug"); - else - progDebug = wxT("no debug"); - - msg.Printf(_T("Mismatch between the program and library build versions detected.\nThe library used %d.%d (%s), and your program used %d.%d (%s)."), - verMaj, verMin, libDebug.c_str(), opts.m_verMaj, opts.m_verMin, progDebug.c_str()); - - wxLogFatalError(msg); - - // normally wxLogFatalError doesn't return - return FALSE; - } -#undef wxCMP - return TRUE; -} +bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg) +{ + // under MSW we prefer to use the base class version using ::MessageBox() + // even if wxMessageBox() is available because it has less chances to + // double fault our app than our wxMessageBox() +#if defined(__WXMSW__) || !wxUSE_MSGDLG + return wxAppTraitsBase::ShowAssertDialog(msg); +#else // wxUSE_MSGDLG + // this message is intentionally not translated -- it is for + // developpers only + wxString msgDlg(msg); + msgDlg += wxT("\nDo you want to stop the program?\n") + wxT("You can also choose [Cancel] to suppress ") + wxT("further warnings."); + + switch ( wxMessageBox(msgDlg, wxT("wxWindows Debug Alert"), + wxYES_NO | wxCANCEL | wxICON_STOP ) ) + { + case wxYES: + wxTrap(); + break; -#ifdef __WXDEBUG__ + case wxCANCEL: + // no more asserts + return true; -static void LINKAGEMODE SetTraceMasks() -{ -#if wxUSE_LOG - wxString mask; - if ( wxGetEnv(wxT("WXTRACE"), &mask) ) - { - wxStringTokenizer tkn(mask, wxT(",")); - while ( tkn.HasMoreTokens() ) - wxLog::AddTraceMask(tkn.GetNextToken()); + //case wxNO: nothing to do } -#endif // wxUSE_LOG -} -// wxASSERT() helper -bool wxAssertIsEqual(int x, int y) -{ - return x == y; + return false; +#endif // !wxUSE_MSGDLG/wxUSE_MSGDLG } -// break into the debugger -void wxTrap() +#endif // __WXDEBUG__ + +bool wxGUIAppTraitsBase::HasStderr() { -#if defined(__WXMSW__) && !defined(__WXMICROWIN__) - DebugBreak(); -#elif defined(__WXMAC__) && !defined(__DARWIN__) -#if __powerc - Debugger(); + // we consider that under Unix stderr always goes somewhere, even if the + // user doesn't always see it under GUI desktops +#ifdef __UNIX__ + return true; #else - SysBreak(); + return false; #endif -#elif defined(__UNIX__) - raise(SIGTRAP); -#else - // TODO -#endif // Win/Unix } - -void wxAssert(int cond, - const wxChar *szFile, - int nLine, - const wxChar *szCond, - const wxChar *szMsg) -{ - if ( !cond ) - wxOnAssert(szFile, nLine, szCond, szMsg); -} - -// show the assert modal dialog -static -void ShowAssertDialog(const wxChar *szFile, - int nLine, - const wxChar *szCond, - const wxChar *szMsg) +void wxGUIAppTraitsBase::ScheduleForDestroy(wxObject *object) { - // this variable can be set to true to suppress "assert failure" messages - static bool s_bNoAsserts = FALSE; - - wxChar szBuf[4096]; - - // make life easier for people using VC++ IDE by using this format: like - // this, clicking on the message will take us immediately to the place of - // the failed assert - wxSnprintf(szBuf, WXSIZEOF(szBuf), - wxT("%s(%d): assert \"%s\" failed"), - szFile, nLine, szCond); - - if ( szMsg != NULL ) - { - wxStrcat(szBuf, wxT(": ")); - wxStrcat(szBuf, szMsg); - } - else // no message given - { - wxStrcat(szBuf, wxT(".")); - } - -#if wxUSE_THREADS - // if we are not in the main thread, - // output the assert directly and trap since dialogs cannot be displayed - if (!wxThread::IsMain()) { - wxStrcat(szBuf, wxT(" [in child thread]")); -#if defined(__WXMSW__) && !defined(__WXMICROWIN__) - wxStrcat(szBuf, wxT("\r\n")); - OutputDebugString(szBuf); -#else - // send to stderr - wxFprintf(stderr, wxT("%s\n"), szBuf); - fflush(stderr); -#endif - // He-e-e-e-elp!! we're asserting in a child thread - wxTrap(); - } -#endif // wxUSE_THREADS - - if ( !s_bNoAsserts ) - { - // send it to the normal log destination - wxLogDebug(szBuf); - -#if (wxUSE_GUI && wxUSE_MSGDLG) || defined(__WXMSW__) - // this message is intentionally not translated - it is for - // developpers only - wxStrcat(szBuf, wxT("\nDo you want to stop the program?\nYou can also choose [Cancel] to suppress further warnings.")); - - // use the native message box if available: this is more robust than - // using our own -#if defined(__WXMSW__) && !defined(__WXMICROWIN__) - switch ( ::MessageBox(NULL, szBuf, _T("Debug"), - MB_YESNOCANCEL | MB_ICONSTOP ) ) - { - case IDYES: - wxTrap(); - break; - - case IDCANCEL: - s_bNoAsserts = TRUE; - break; - - //case IDNO: nothing to do - } -#else // !MSW - switch ( wxMessageBox(szBuf, wxT("Debug"), - wxYES_NO | wxCANCEL | wxICON_STOP ) ) - { - case wxYES: - wxTrap(); - break; - - case wxCANCEL: - s_bNoAsserts = TRUE; - break; - - //case wxNO: nothing to do - } -#endif // GUI or MSW - -#else // !GUI - wxTrap(); -#endif // GUI/!GUI - } + if ( !wxPendingDelete.Member(object) ) + wxPendingDelete.Append(object); } -// this function is called when an assert fails -void wxOnAssert(const wxChar *szFile, - int nLine, - const wxChar *szCond, - const wxChar *szMsg) +void wxGUIAppTraitsBase::RemoveFromPendingDelete(wxObject *object) { - // FIXME MT-unsafe - static bool s_bInAssert = FALSE; - - if ( s_bInAssert ) - { - // He-e-e-e-elp!! we're trapped in endless loop - wxTrap(); - - s_bInAssert = FALSE; - - return; - } - - s_bInAssert = TRUE; - - if ( !wxTheApp ) - { - // by default, show the assert dialog box - we can't customize this - // behaviour - ShowAssertDialog(szFile, nLine, szCond, szMsg); - } - else - { - // let the app process it as it wants - wxTheApp->OnAssert(szFile, nLine, szCond, szMsg); - } - - s_bInAssert = FALSE; + wxPendingDelete.DeleteObject(object); } -void wxAppBase::OnAssert(const wxChar *file, - int line, - const wxChar *cond, - const wxChar *msg) +// ---------------------------------------------------------------------------- +// wxAppTraits +// ---------------------------------------------------------------------------- + +wxAppTraits *wxAppTraitsBase::CreateGUI() { - ShowAssertDialog(file, line, cond, msg); + return new wxGUIAppTraits; } -#endif //WXDEBUG - diff --git a/src/common/artstd.cpp b/src/common/artstd.cpp index a2c7b2d2de..8349c70cb2 100644 --- a/src/common/artstd.cpp +++ b/src/common/artstd.cpp @@ -50,23 +50,6 @@ protected: #define ART(artId, xpmRc) \ if ( id == artId ) return wxBitmap(xpmRc##_xpm); -// Compatibility hack to use wxApp::GetStdIcon of overriden by the user -#if WXWIN_COMPATIBILITY_2_2 - #define GET_STD_ICON_FROM_APP(iconId) \ - if ( client == wxART_MESSAGE_BOX ) \ - { \ - wxIcon icon = wxTheApp->GetStdIcon(iconId); \ - if ( icon.Ok() ) \ - { \ - wxBitmap bmp; \ - bmp.CopyFromIcon(icon); \ - return bmp; \ - } \ - } -#else - #define GET_STD_ICON_FROM_APP(iconId) -#endif - // There are two ways of getting the standard icon: either via XPMs or via // wxIcon ctor. This depends on the platform: #if defined(__WXUNIVERSAL__) @@ -87,7 +70,6 @@ protected: #define ART_MSGBOX(artId, iconId, xpmRc) \ if ( id == artId ) \ { \ - GET_STD_ICON_FROM_APP(iconId) \ CREATE_STD_ICON(#iconId, xpmRc) \ } diff --git a/src/common/fmapbase.cpp b/src/common/fmapbase.cpp new file mode 100644 index 0000000000..7d6cb2f11e --- /dev/null +++ b/src/common/fmapbase.cpp @@ -0,0 +1,642 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/fmapbase.cpp +// Purpose: wxFontMapperBase class implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 (extracted from common/fontmap.cpp) +// RCS-ID: $Id$ +// Copyright: (c) 1999-2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FONTMAP + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/intl.h" +#endif //WX_PRECOMP + +#include "wx/fontmap.h" +#include "wx/fmappriv.h" + +#include "wx/apptrait.h" +#include "wx/module.h" + +#if wxUSE_CONFIG + #include "wx/config.h" + #include "wx/memconf.h" +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// encodings supported by GetEncodingDescription +static wxFontEncoding gs_encodings[] = +{ + wxFONTENCODING_ISO8859_1, + wxFONTENCODING_ISO8859_2, + wxFONTENCODING_ISO8859_3, + wxFONTENCODING_ISO8859_4, + wxFONTENCODING_ISO8859_5, + wxFONTENCODING_ISO8859_6, + wxFONTENCODING_ISO8859_7, + wxFONTENCODING_ISO8859_8, + wxFONTENCODING_ISO8859_9, + wxFONTENCODING_ISO8859_10, + wxFONTENCODING_ISO8859_11, + wxFONTENCODING_ISO8859_12, + wxFONTENCODING_ISO8859_13, + wxFONTENCODING_ISO8859_14, + wxFONTENCODING_ISO8859_15, + wxFONTENCODING_KOI8, + wxFONTENCODING_CP932, + wxFONTENCODING_CP936, + wxFONTENCODING_CP949, + wxFONTENCODING_CP950, + wxFONTENCODING_CP1250, + wxFONTENCODING_CP1251, + wxFONTENCODING_CP1252, + wxFONTENCODING_CP1253, + wxFONTENCODING_CP1254, + wxFONTENCODING_CP1255, + wxFONTENCODING_CP1256, + wxFONTENCODING_CP1257, + wxFONTENCODING_CP437, + wxFONTENCODING_UTF7, + wxFONTENCODING_UTF8, + wxFONTENCODING_EUC_JP, +}; + +// the descriptions for them +static const wxChar* gs_encodingDescs[] = +{ + wxTRANSLATE( "Western European (ISO-8859-1)" ), + wxTRANSLATE( "Central European (ISO-8859-2)" ), + wxTRANSLATE( "Esperanto (ISO-8859-3)" ), + wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ), + wxTRANSLATE( "Cyrillic (ISO-8859-5)" ), + wxTRANSLATE( "Arabic (ISO-8859-6)" ), + wxTRANSLATE( "Greek (ISO-8859-7)" ), + wxTRANSLATE( "Hebrew (ISO-8859-8)" ), + wxTRANSLATE( "Turkish (ISO-8859-9)" ), + wxTRANSLATE( "Nordic (ISO-8859-10)" ), + wxTRANSLATE( "Thai (ISO-8859-11)" ), + wxTRANSLATE( "Indian (ISO-8859-12)" ), + wxTRANSLATE( "Baltic (ISO-8859-13)" ), + wxTRANSLATE( "Celtic (ISO-8859-14)" ), + wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ), + wxTRANSLATE( "KOI8-R" ), + wxTRANSLATE( "Windows Japanese (CP 932)" ), + wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ), + wxTRANSLATE( "Windows Korean (CP 949)" ), + wxTRANSLATE( "Windows Chinese Traditional (CP 950)" ), + wxTRANSLATE( "Windows Central European (CP 1250)" ), + wxTRANSLATE( "Windows Cyrillic (CP 1251)" ), + wxTRANSLATE( "Windows Western European (CP 1252)" ), + wxTRANSLATE( "Windows Greek (CP 1253)" ), + wxTRANSLATE( "Windows Turkish (CP 1254)" ), + wxTRANSLATE( "Windows Hebrew (CP 1255)" ), + wxTRANSLATE( "Windows Arabic (CP 1256)" ), + wxTRANSLATE( "Windows Baltic (CP 1257)" ), + wxTRANSLATE( "Windows/DOS OEM (CP 437)" ), + wxTRANSLATE( "Unicode 7 bit (UTF-7)" ), + wxTRANSLATE( "Unicode 8 bit (UTF-8)" ), + wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ), +}; + +// and the internal names (these are not translated on purpose!) +static const wxChar* gs_encodingNames[] = +{ + wxT( "iso-8859-1" ), + wxT( "iso-8859-2" ), + wxT( "iso-8859-3" ), + wxT( "iso-8859-4" ), + wxT( "iso-8859-5" ), + wxT( "iso-8859-6" ), + wxT( "iso-8859-7" ), + wxT( "iso-8859-8" ), + wxT( "iso-8859-9" ), + wxT( "iso-8859-10" ), + wxT( "iso-8859-11" ), + wxT( "iso-8859-12" ), + wxT( "iso-8859-13" ), + wxT( "iso-8859-14" ), + wxT( "iso-8859-15" ), + wxT( "koi8-r" ), + wxT( "windows-932" ), + wxT( "windows-936" ), + wxT( "windows-949" ), + wxT( "windows-950" ), + wxT( "windows-1250" ), + wxT( "windows-1251" ), + wxT( "windows-1252" ), + wxT( "windows-1253" ), + wxT( "windows-1254" ), + wxT( "windows-1255" ), + wxT( "windows-1256" ), + wxT( "windows-1257" ), + wxT( "windows-437" ), + wxT( "utf-7" ), + wxT( "utf-8" ), + wxT( "euc-jp" ), +}; + +wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs) == WXSIZEOF(gs_encodings) && + WXSIZEOF(gs_encodingNames) == WXSIZEOF(gs_encodings), + EncodingsArraysNotInSync ); + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// clean up the font mapper object +class wxFontMapperModule : public wxModule +{ +public: + wxFontMapperModule() : wxModule() { } + virtual bool OnInit() { return TRUE; } + virtual void OnExit() { delete wxFontMapper::Set(NULL); } + + DECLARE_DYNAMIC_CLASS(wxFontMapperModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxFontMapperModule, wxModule) + + +// ============================================================================ +// wxFontMapperBase implementation +// ============================================================================ + +wxFontMapper *wxFontMapperBase::sm_instance = NULL; + +// ---------------------------------------------------------------------------- +// ctor and dtor +// ---------------------------------------------------------------------------- + +wxFontMapperBase::wxFontMapperBase() +{ +#if wxUSE_CONFIG + m_config = NULL; + m_configIsDummy = FALSE; +#endif // wxUSE_CONFIG +} + +wxFontMapperBase::~wxFontMapperBase() +{ +#if wxUSE_CONFIG + if ( m_configIsDummy ) + delete m_config; +#endif // wxUSE_CONFIG +} + +/* static */ +wxFontMapper *wxFontMapperBase::Get() +{ + if ( !sm_instance ) + { + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + { + sm_instance = traits->CreateFontMapper(); + + wxASSERT_MSG( sm_instance, + _T("wxAppTraits::CreateFontMapper() failed") ); + } + + if ( !sm_instance ) + { + // last resort: we must create something because the existing code + // relies on always having a valid font mapper object + sm_instance = (wxFontMapper *)new wxFontMapperBase; + } + } + + return sm_instance; +} + +/* static */ +wxFontMapper *wxFontMapperBase::Set(wxFontMapper *mapper) +{ + wxFontMapper *old = sm_instance; + sm_instance = mapper; + return old; +} + +#if wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// config usage customisation +// ---------------------------------------------------------------------------- + +/* static */ +const wxChar *wxFontMapperBase::GetDefaultConfigPath() +{ + return FONTMAPPER_ROOT_PATH; +} + +void wxFontMapperBase::SetConfigPath(const wxString& prefix) +{ + wxCHECK_RET( !prefix.IsEmpty() && prefix[0] == wxCONFIG_PATH_SEPARATOR, + wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") ); + + m_configRootPath = prefix; +} + +// ---------------------------------------------------------------------------- +// get config object and path for it +// ---------------------------------------------------------------------------- + +wxConfigBase *wxFontMapperBase::GetConfig() +{ + if ( !m_config ) + { + // try the default + m_config = wxConfig::Get(FALSE /*don't create on demand*/ ); + + if ( !m_config ) + { + // we still want to have a config object because otherwise we would + // keep asking the user the same questions in the interactive mode, + // so create a dummy config which won't write to any files/registry + // but will allow us to remember the results of the questions at + // least during this run + m_config = new wxMemoryConfig; + m_configIsDummy = TRUE; + // VS: we can't call wxConfig::Set(m_config) here because that would + // disable automatic wxConfig instance creation if this code was + // called before wxApp::OnInit (this happens in wxGTK -- it sets + // default wxFont encoding in wxApp::Initialize()) + } + } + + if ( m_configIsDummy && wxConfig::Get(FALSE) != NULL ) + { + // VS: in case we created dummy m_config (see above), we want to switch back + // to the real one as soon as one becomes available. + delete m_config; + m_config = wxConfig::Get(FALSE); + m_configIsDummy = FALSE; + // FIXME: ideally, we should add keys from dummy config to the real one now, + // but it is a low-priority task because typical wxWin application + // either doesn't use wxConfig at all or creates wxConfig object in + // wxApp::OnInit(), before any real interaction with the user takes + // place... + } + + return m_config; +} + +const wxString& wxFontMapperBase::GetConfigPath() +{ + if ( !m_configRootPath ) + { + // use the default + m_configRootPath = GetDefaultConfigPath(); + } + + return m_configRootPath; +} + +// ---------------------------------------------------------------------------- +// config helpers +// ---------------------------------------------------------------------------- + +bool wxFontMapperBase::ChangePath(const wxString& pathNew, wxString *pathOld) +{ + wxConfigBase *config = GetConfig(); + if ( !config ) + return FALSE; + + *pathOld = config->GetPath(); + + wxString path = GetConfigPath(); + if ( path.IsEmpty() || path.Last() != wxCONFIG_PATH_SEPARATOR ) + { + path += wxCONFIG_PATH_SEPARATOR; + } + + wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR), + wxT("should be a relative path") ); + + path += pathNew; + + config->SetPath(path); + + return TRUE; +} + +void wxFontMapperBase::RestorePath(const wxString& pathOld) +{ + GetConfig()->SetPath(pathOld); +} + +// ---------------------------------------------------------------------------- +// charset/encoding correspondence +// ---------------------------------------------------------------------------- + +wxFontEncoding +wxFontMapperBase::CharsetToEncoding(const wxString& charset, + bool WXUNUSED(interactive)) +{ + wxFontEncoding encoding = wxFONTENCODING_SYSTEM; + + // we're going to modify it, make a copy + wxString cs = charset; + +#if wxUSE_CONFIG + // first try the user-defined settings + wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH); + if ( path.IsOk() ) + { + wxConfigBase *config = GetConfig(); + + // do we have an encoding for this charset? + long value = config->Read(charset, -1l); + if ( value != -1 ) + { + if ( value == wxFONTENCODING_UNKNOWN ) + { + // don't try to find it, in particular don't ask the user + return wxFONTENCODING_SYSTEM; + } + + if ( value >= 0 && value <= wxFONTENCODING_MAX ) + { + encoding = (wxFontEncoding)value; + } + else + { + wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"), + value, charset.c_str()); + } + } + + if ( encoding == wxFONTENCODING_SYSTEM ) + { + // may be we have an alias? + config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH); + + wxString alias = config->Read(charset); + if ( !!alias ) + { + // yes, we do - use it instead + cs = alias; + } + } + } +#endif // wxUSE_CONFIG + + // if didn't find it there, try to recognize it ourselves + if ( encoding == wxFONTENCODING_SYSTEM ) + { + // trim any spaces + cs.Trim(true); + cs.Trim(false); + + // discard the optional quotes + if ( !cs.empty() ) + { + if ( cs[0u] == _T('"') && cs.Last() == _T('"') ) + { + cs = wxString(cs.c_str(), cs.length() - 1); + } + } + + cs.MakeUpper(); + + if ( cs.empty() || cs == _T("US-ASCII") ) + { + encoding = wxFONTENCODING_DEFAULT; + } + else if ( cs == wxT("UTF-7") ) + { + encoding = wxFONTENCODING_UTF7; + } + else if ( cs == wxT("UTF-8") ) + { + encoding = wxFONTENCODING_UTF8; + } + else if ( cs == wxT("GB2312") ) + { + encoding = wxFONTENCODING_GB2312; + } + else if ( cs == wxT("BIG5") ) + { + encoding = wxFONTENCODING_BIG5; + } + else if ( cs == wxT("SJIS") || + cs == wxT("SHIFT_JIS") || + cs == wxT("SHIFT-JIS") ) + { + encoding = wxFONTENCODING_SHIFT_JIS; + } + else if ( cs == wxT("EUC-JP") || + cs == wxT("EUC_JP") ) + { + encoding = wxFONTENCODING_EUC_JP; + } + else if ( cs == wxT("KOI8-R") || + cs == wxT("KOI8-U") || + cs == wxT("KOI8-RU") ) + { + // although koi8-ru is not strictly speaking the same as koi8-r, + // they are similar enough to make mapping it to koi8 better than + // not reckognizing it at all + encoding = wxFONTENCODING_KOI8; + } + else if ( cs.Left(3) == wxT("ISO") ) + { + // the dash is optional (or, to be exact, it is not, but + // several brokenmails "forget" it) + const wxChar *p = cs.c_str() + 3; + if ( *p == wxT('-') ) + p++; + + // printf( "iso %s\n", (const char*) cs.ToAscii() ); + + unsigned int value; + if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) + { + // printf( "value %d\n", (int)value ); + + // make it 0 based and check that it is strictly positive in + // the process (no such thing as iso8859-0 encoding) + if ( (value-- > 0) && + (value < wxFONTENCODING_ISO8859_MAX - + wxFONTENCODING_ISO8859_1) ) + { + // it's a valid ISO8859 encoding + value += wxFONTENCODING_ISO8859_1; + encoding = (wxFontEncoding)value; + } + } + } + else if ( cs.Left(4) == wxT("8859") ) + { + const wxChar *p = cs.c_str(); + + unsigned int value; + if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) + { + // printf( "value %d\n", (int)value ); + + // make it 0 based and check that it is strictly positive in + // the process (no such thing as iso8859-0 encoding) + if ( (value-- > 0) && + (value < wxFONTENCODING_ISO8859_MAX - + wxFONTENCODING_ISO8859_1) ) + { + // it's a valid ISO8859 encoding + value += wxFONTENCODING_ISO8859_1; + encoding = (wxFontEncoding)value; + } + } + } + else // check for Windows charsets + { + size_t len; + if ( cs.Left(7) == wxT("WINDOWS") ) + { + len = 7; + } + else if ( cs.Left(2) == wxT("CP") ) + { + len = 2; + } + else // not a Windows encoding + { + len = 0; + } + + if ( len ) + { + const wxChar *p = cs.c_str() + len; + if ( *p == wxT('-') ) + p++; + + int value; + if ( wxSscanf(p, wxT("%u"), &value) == 1 ) + { + if ( value >= 1250 ) + { + value -= 1250; + if ( value < wxFONTENCODING_CP12_MAX - + wxFONTENCODING_CP1250 ) + { + // a valid Windows code page + value += wxFONTENCODING_CP1250; + encoding = (wxFontEncoding)value; + } + } + + switch ( value ) + { + case 932: + encoding = wxFONTENCODING_CP932; + break; + + case 936: + encoding = wxFONTENCODING_CP936; + break; + + case 949: + encoding = wxFONTENCODING_CP949; + break; + + case 950: + encoding = wxFONTENCODING_CP950; + break; + } + } + } + } + //else: unknown + } + + return encoding; +} + +/* static */ +size_t wxFontMapperBase::GetSupportedEncodingsCount() +{ + return WXSIZEOF(gs_encodings); +} + +/* static */ +wxFontEncoding wxFontMapperBase::GetEncoding(size_t n) +{ + wxCHECK_MSG( n < WXSIZEOF(gs_encodings), wxFONTENCODING_SYSTEM, + _T("wxFontMapper::GetEncoding(): invalid index") ); + + return gs_encodings[n]; +} + +/* static */ +wxString wxFontMapperBase::GetEncodingDescription(wxFontEncoding encoding) +{ + if ( encoding == wxFONTENCODING_DEFAULT ) + { + return _("Default encoding"); + } + + const size_t count = WXSIZEOF(gs_encodingDescs); + + for ( size_t i = 0; i < count; i++ ) + { + if ( gs_encodings[i] == encoding ) + { + return wxGetTranslation(gs_encodingDescs[i]); + } + } + + wxString str; + str.Printf(_("Unknown encoding (%d)"), encoding); + + return str; +} + +/* static */ +wxString wxFontMapperBase::GetEncodingName(wxFontEncoding encoding) +{ + if ( encoding == wxFONTENCODING_DEFAULT ) + { + return _("default"); + } + + const size_t count = WXSIZEOF(gs_encodingNames); + + for ( size_t i = 0; i < count; i++ ) + { + if ( gs_encodings[i] == encoding ) + { + return gs_encodingNames[i]; + } + } + + wxString str; + str.Printf(_("unknown-%d"), encoding); + + return str; +} + +#endif // wxUSE_CONFIG + +#endif // wxUSE_FONTMAP + diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index b546c19151..d858e43dd0 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -5,7 +5,7 @@ // Modified by: // Created: 04.11.99 // RCS-ID: $Id$ -// Copyright: (c) Vadim Zeitlin +// Copyright: (c) 1999-2003 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -36,20 +36,17 @@ #include "wx/intl.h" #endif // PCH -#include "wx/module.h" #include "wx/fontmap.h" +#include "wx/fmappriv.h" #if wxUSE_CONFIG #include "wx/config.h" - #include "wx/memconf.h" -#endif +#endif // wxUSE_CONFIG -#if wxUSE_GUI - #include "wx/fontutil.h" - #include "wx/msgdlg.h" - #include "wx/fontdlg.h" - #include "wx/choicdlg.h" -#endif // wxUSE_GUI +#include "wx/fontutil.h" +#include "wx/msgdlg.h" +#include "wx/fontdlg.h" +#include "wx/choicdlg.h" #include "wx/encconv.h" @@ -59,160 +56,31 @@ // the config paths we use #if wxUSE_CONFIG -static const wxChar* FONTMAPPER_ROOT_PATH = wxT("/wxWindows/FontMapper"); -static const wxChar* FONTMAPPER_CHARSET_PATH = wxT("Charsets"); -static const wxChar* FONTMAPPER_CHARSET_ALIAS_PATH = wxT("Aliases"); - -// we only ask questions in GUI mode -#if wxUSE_GUI - static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings"); - static const wxChar* FONTMAPPER_FONT_DONT_ASK = wxT("none"); -#endif // wxUSE_GUI -#endif // wxUSE_CONFIG -// encodings supported by GetEncodingDescription -static wxFontEncoding gs_encodings[] = -{ - wxFONTENCODING_ISO8859_1, - wxFONTENCODING_ISO8859_2, - wxFONTENCODING_ISO8859_3, - wxFONTENCODING_ISO8859_4, - wxFONTENCODING_ISO8859_5, - wxFONTENCODING_ISO8859_6, - wxFONTENCODING_ISO8859_7, - wxFONTENCODING_ISO8859_8, - wxFONTENCODING_ISO8859_9, - wxFONTENCODING_ISO8859_10, - wxFONTENCODING_ISO8859_11, - wxFONTENCODING_ISO8859_12, - wxFONTENCODING_ISO8859_13, - wxFONTENCODING_ISO8859_14, - wxFONTENCODING_ISO8859_15, - wxFONTENCODING_KOI8, - wxFONTENCODING_CP932, - wxFONTENCODING_CP936, - wxFONTENCODING_CP949, - wxFONTENCODING_CP950, - wxFONTENCODING_CP1250, - wxFONTENCODING_CP1251, - wxFONTENCODING_CP1252, - wxFONTENCODING_CP1253, - wxFONTENCODING_CP1254, - wxFONTENCODING_CP1255, - wxFONTENCODING_CP1256, - wxFONTENCODING_CP1257, - wxFONTENCODING_CP437, - wxFONTENCODING_UTF7, - wxFONTENCODING_UTF8, - wxFONTENCODING_EUC_JP, -}; - -// the descriptions for them -static const wxChar* gs_encodingDescs[] = -{ - wxTRANSLATE( "Western European (ISO-8859-1)" ), - wxTRANSLATE( "Central European (ISO-8859-2)" ), - wxTRANSLATE( "Esperanto (ISO-8859-3)" ), - wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ), - wxTRANSLATE( "Cyrillic (ISO-8859-5)" ), - wxTRANSLATE( "Arabic (ISO-8859-6)" ), - wxTRANSLATE( "Greek (ISO-8859-7)" ), - wxTRANSLATE( "Hebrew (ISO-8859-8)" ), - wxTRANSLATE( "Turkish (ISO-8859-9)" ), - wxTRANSLATE( "Nordic (ISO-8859-10)" ), - wxTRANSLATE( "Thai (ISO-8859-11)" ), - wxTRANSLATE( "Indian (ISO-8859-12)" ), - wxTRANSLATE( "Baltic (ISO-8859-13)" ), - wxTRANSLATE( "Celtic (ISO-8859-14)" ), - wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ), - wxTRANSLATE( "KOI8-R" ), - wxTRANSLATE( "Windows Japanese (CP 932)" ), - wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ), - wxTRANSLATE( "Windows Korean (CP 949)" ), - wxTRANSLATE( "Windows Chinese Traditional (CP 950)" ), - wxTRANSLATE( "Windows Central European (CP 1250)" ), - wxTRANSLATE( "Windows Cyrillic (CP 1251)" ), - wxTRANSLATE( "Windows Western European (CP 1252)" ), - wxTRANSLATE( "Windows Greek (CP 1253)" ), - wxTRANSLATE( "Windows Turkish (CP 1254)" ), - wxTRANSLATE( "Windows Hebrew (CP 1255)" ), - wxTRANSLATE( "Windows Arabic (CP 1256)" ), - wxTRANSLATE( "Windows Baltic (CP 1257)" ), - wxTRANSLATE( "Windows/DOS OEM (CP 437)" ), - wxTRANSLATE( "Unicode 7 bit (UTF-7)" ), - wxTRANSLATE( "Unicode 8 bit (UTF-8)" ), - wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ), -}; - -// and the internal names (these are not translated on purpose!) -static const wxChar* gs_encodingNames[] = -{ - wxT( "iso-8859-1" ), - wxT( "iso-8859-2" ), - wxT( "iso-8859-3" ), - wxT( "iso-8859-4" ), - wxT( "iso-8859-5" ), - wxT( "iso-8859-6" ), - wxT( "iso-8859-7" ), - wxT( "iso-8859-8" ), - wxT( "iso-8859-9" ), - wxT( "iso-8859-10" ), - wxT( "iso-8859-11" ), - wxT( "iso-8859-12" ), - wxT( "iso-8859-13" ), - wxT( "iso-8859-14" ), - wxT( "iso-8859-15" ), - wxT( "koi8-r" ), - wxT( "windows-932" ), - wxT( "windows-936" ), - wxT( "windows-949" ), - wxT( "windows-950" ), - wxT( "windows-1250" ), - wxT( "windows-1251" ), - wxT( "windows-1252" ), - wxT( "windows-1253" ), - wxT( "windows-1254" ), - wxT( "windows-1255" ), - wxT( "windows-1256" ), - wxT( "windows-1257" ), - wxT( "windows-437" ), - wxT( "utf-7" ), - wxT( "utf-8" ), - wxT( "euc-jp" ), -}; +static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings"); +static const wxChar* FONTMAPPER_FONT_DONT_ASK = wxT("none"); -wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs) == WXSIZEOF(gs_encodings) && - WXSIZEOF(gs_encodingNames) == WXSIZEOF(gs_encodings), - EncodingsArraysNotInSync ); +#endif // wxUSE_CONFIG // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- -// change the config path during the lifetime of this object -class wxFontMapperPathChanger +// it may happen that while we're showing a dialog asking the user about +// something, another request for an encoding mapping arrives: in this case it +// is best to not do anything because otherwise we risk to enter an infinite +// loop so we create an object of this class on stack to test for this in all +// interactive functions +class ReentrancyBlocker { public: - wxFontMapperPathChanger(wxFontMapper *fontMapper, const wxString& path) - { - m_fontMapper = fontMapper; - m_ok = m_fontMapper->ChangePath(path, &m_pathOld); - } - - bool IsOk() const { return m_ok; } - - ~wxFontMapperPathChanger() - { - if ( IsOk() ) - m_fontMapper->RestorePath(m_pathOld); - } + ReentrancyBlocker(bool& flag) : m_flagOld(flag), m_flag(flag) + { m_flag = true; } + ~ReentrancyBlocker() { m_flag = m_flagOld; } private: - wxFontMapper *m_fontMapper; - bool m_ok; - wxString m_pathOld; - - DECLARE_NO_COPY_CLASS(wxFontMapperPathChanger) + bool m_flagOld; + bool& m_flag; }; // ============================================================================ @@ -225,443 +93,21 @@ private: wxFontMapper::wxFontMapper() { -#if wxUSE_CONFIG - m_config = NULL; - m_configIsDummy = FALSE; -#endif // wxUSE_CONFIG - -#if wxUSE_GUI m_windowParent = NULL; -#endif // wxUSE_GUI } wxFontMapper::~wxFontMapper() { -#if wxUSE_CONFIG - if ( m_configIsDummy ) - delete m_config; -#endif // wxUSE_CONFIG -} - -wxFontMapper *wxFontMapper::sm_instance = NULL; - -/*static*/ wxFontMapper *wxFontMapper::Get() -{ - if ( !sm_instance ) - sm_instance = new wxFontMapper; - return sm_instance; -} - -/*static*/ wxFontMapper *wxFontMapper::Set(wxFontMapper *mapper) -{ - wxFontMapper *old = sm_instance; - sm_instance = mapper; - return old; -} - -class wxFontMapperModule: public wxModule -{ -public: - wxFontMapperModule() : wxModule() {} - virtual bool OnInit() { return TRUE; } - virtual void OnExit() { delete wxFontMapper::Set(NULL); } - - DECLARE_DYNAMIC_CLASS(wxFontMapperModule) -}; - -IMPLEMENT_DYNAMIC_CLASS(wxFontMapperModule, wxModule) - -// ---------------------------------------------------------------------------- -// customisation -// ---------------------------------------------------------------------------- - -#if wxUSE_CONFIG - -/* static */ const wxChar *wxFontMapper::GetDefaultConfigPath() -{ - return FONTMAPPER_ROOT_PATH; -} - -void wxFontMapper::SetConfigPath(const wxString& prefix) -{ - wxCHECK_RET( !prefix.IsEmpty() && prefix[0] == wxCONFIG_PATH_SEPARATOR, - wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") ); - - m_configRootPath = prefix; } -// ---------------------------------------------------------------------------- -// get config object and path for it -// ---------------------------------------------------------------------------- - -wxConfigBase *wxFontMapper::GetConfig() +wxFontEncoding +wxFontMapper::CharsetToEncoding(const wxString& charset, bool interactive) { - if ( !m_config ) - { - // try the default - m_config = wxConfig::Get(FALSE /*don't create on demand*/ ); - - if ( !m_config ) - { - // we still want to have a config object because otherwise we would - // keep asking the user the same questions in the interactive mode, - // so create a dummy config which won't write to any files/registry - // but will allow us to remember the results of the questions at - // least during this run - m_config = new wxMemoryConfig; - m_configIsDummy = TRUE; - // VS: we can't call wxConfig::Set(m_config) here because that would - // disable automatic wxConfig instance creation if this code was - // called before wxApp::OnInit (this happens in wxGTK -- it sets - // default wxFont encoding in wxApp::Initialize()) - } - } - - if ( m_configIsDummy && wxConfig::Get(FALSE) != NULL ) - { - // VS: in case we created dummy m_config (see above), we want to switch back - // to the real one as soon as one becomes available. - delete m_config; - m_config = wxConfig::Get(FALSE); - m_configIsDummy = FALSE; - // FIXME: ideally, we should add keys from dummy config to the real one now, - // but it is a low-priority task because typical wxWin application - // either doesn't use wxConfig at all or creates wxConfig object in - // wxApp::OnInit(), before any real interaction with the user takes - // place... - } - - return m_config; -} - -const wxString& wxFontMapper::GetConfigPath() -{ - if ( !m_configRootPath ) - { - // use the default - m_configRootPath = GetDefaultConfigPath(); - } - - return m_configRootPath; -} -#endif - -bool wxFontMapper::ChangePath(const wxString& pathNew, wxString *pathOld) -{ -#if wxUSE_CONFIG - wxConfigBase *config = GetConfig(); - if ( !config ) - return FALSE; - - *pathOld = config->GetPath(); - - wxString path = GetConfigPath(); - if ( path.IsEmpty() || path.Last() != wxCONFIG_PATH_SEPARATOR ) - { - path += wxCONFIG_PATH_SEPARATOR; - } - - wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR), - wxT("should be a relative path") ); - - path += pathNew; - - config->SetPath(path); - - return TRUE; -#else - return FALSE; -#endif -} - -void wxFontMapper::RestorePath(const wxString& pathOld) -{ -#if wxUSE_CONFIG - GetConfig()->SetPath(pathOld); -#else -#endif -} - -// ---------------------------------------------------------------------------- -// charset/encoding correspondence -// ---------------------------------------------------------------------------- - -/* static */ -wxString wxFontMapper::GetEncodingDescription(wxFontEncoding encoding) -{ - if ( encoding == wxFONTENCODING_DEFAULT ) - { - return _("Default encoding"); - } - - const size_t count = WXSIZEOF(gs_encodingDescs); - - for ( size_t i = 0; i < count; i++ ) - { - if ( gs_encodings[i] == encoding ) - { - return wxGetTranslation(gs_encodingDescs[i]); - } - } - - wxString str; - str.Printf(_("Unknown encoding (%d)"), encoding); - - return str; -} - -/* static */ -wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding) -{ - if ( encoding == wxFONTENCODING_DEFAULT ) - { - return _("default"); - } - - const size_t count = WXSIZEOF(gs_encodingNames); - - for ( size_t i = 0; i < count; i++ ) - { - if ( gs_encodings[i] == encoding ) - { - return gs_encodingNames[i]; - } - } + // try the ways not needing the users intervention first + wxFontEncoding + encoding = wxFontMapperBase::CharsetToEncoding(charset, interactive); - wxString str; - str.Printf(_("unknown-%d"), encoding); - - return str; -} - -wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, - bool interactive) -{ - // a special pseudo encoding which means "don't ask me about this charset - // any more" - we need it to avoid driving the user crazy with asking him - // time after time about the same charset which he [presumably] doesn't - // have the fonts fot - static const int wxFONTENCODING_UNKNOWN = -2; - - wxFontEncoding encoding = wxFONTENCODING_SYSTEM; - - // we're going to modify it, make a copy - wxString cs = charset; - -#if wxUSE_CONFIG - // first try the user-defined settings - wxString pathOld; - if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) ) - { - wxConfigBase *config = GetConfig(); - - // do we have an encoding for this charset? - long value = config->Read(charset, -1l); - if ( value != -1 ) - { - if ( value == wxFONTENCODING_UNKNOWN ) - { - // don't try to find it, in particular don't ask the user - return wxFONTENCODING_SYSTEM; - } - - if ( value >= 0 && value <= wxFONTENCODING_MAX ) - { - encoding = (wxFontEncoding)value; - } - else - { - wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"), - value, charset.c_str()); - } - } - - if ( encoding == wxFONTENCODING_SYSTEM ) - { - // may be we have an alias? - config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH); - - wxString alias = config->Read(charset); - if ( !!alias ) - { - // yes, we do - use it instead - cs = alias; - } - } - - RestorePath(pathOld); - } -#endif // wxUSE_CONFIG - - // if didn't find it there, try to recognize it ourselves - if ( encoding == wxFONTENCODING_SYSTEM ) - { - // trim any spaces - cs.Trim(TRUE); - cs.Trim(FALSE); - - // discard the optional quotes - if ( !cs.empty() ) - { - if ( cs[0u] == _T('"') && cs.Last() == _T('"') ) - { - cs = wxString(cs.c_str(), cs.length() - 1); - } - } - - cs.MakeUpper(); - - if ( cs.empty() || cs == _T("US-ASCII") ) - { - encoding = wxFONTENCODING_DEFAULT; - } - else if ( cs == wxT("UTF-7") ) - { - encoding = wxFONTENCODING_UTF7; - } - else if ( cs == wxT("UTF-8") ) - { - encoding = wxFONTENCODING_UTF8; - } - else if ( cs == wxT("GB2312") ) - { - encoding = wxFONTENCODING_GB2312; - } - else if ( cs == wxT("BIG5") ) - { - encoding = wxFONTENCODING_BIG5; - } - else if ( cs == wxT("SJIS") || - cs == wxT("SHIFT_JIS") || - cs == wxT("SHIFT-JIS") ) - { - encoding = wxFONTENCODING_SHIFT_JIS; - } - else if ( cs == wxT("EUC-JP") || - cs == wxT("EUC_JP") ) - { - encoding = wxFONTENCODING_EUC_JP; - } - else if ( cs == wxT("KOI8-R") || - cs == wxT("KOI8-U") || - cs == wxT("KOI8-RU") ) - { - // although koi8-ru is not strictly speaking the same as koi8-r, - // they are similar enough to make mapping it to koi8 better than - // not reckognizing it at all - encoding = wxFONTENCODING_KOI8; - } - else if ( cs.Left(3) == wxT("ISO") ) - { - // the dash is optional (or, to be exact, it is not, but - // several brokenmails "forget" it) - const wxChar *p = cs.c_str() + 3; - if ( *p == wxT('-') ) - p++; - - // printf( "iso %s\n", (const char*) cs.ToAscii() ); - - unsigned int value; - if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) - { - // printf( "value %d\n", (int)value ); - - // make it 0 based and check that it is strictly positive in - // the process (no such thing as iso8859-0 encoding) - if ( (value-- > 0) && - (value < wxFONTENCODING_ISO8859_MAX - - wxFONTENCODING_ISO8859_1) ) - { - // it's a valid ISO8859 encoding - value += wxFONTENCODING_ISO8859_1; - encoding = (wxFontEncoding)value; - } - } - } - else if ( cs.Left(4) == wxT("8859") ) - { - const wxChar *p = cs.c_str(); - - unsigned int value; - if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) - { - // printf( "value %d\n", (int)value ); - - // make it 0 based and check that it is strictly positive in - // the process (no such thing as iso8859-0 encoding) - if ( (value-- > 0) && - (value < wxFONTENCODING_ISO8859_MAX - - wxFONTENCODING_ISO8859_1) ) - { - // it's a valid ISO8859 encoding - value += wxFONTENCODING_ISO8859_1; - encoding = (wxFontEncoding)value; - } - } - } - else // check for Windows charsets - { - size_t len; - if ( cs.Left(7) == wxT("WINDOWS") ) - { - len = 7; - } - else if ( cs.Left(2) == wxT("CP") ) - { - len = 2; - } - else // not a Windows encoding - { - len = 0; - } - - if ( len ) - { - const wxChar *p = cs.c_str() + len; - if ( *p == wxT('-') ) - p++; - - int value; - if ( wxSscanf(p, wxT("%u"), &value) == 1 ) - { - if ( value >= 1250 ) - { - value -= 1250; - if ( value < wxFONTENCODING_CP12_MAX - - wxFONTENCODING_CP1250 ) - { - // a valid Windows code page - value += wxFONTENCODING_CP1250; - encoding = (wxFontEncoding)value; - } - } - - switch ( value ) - { - case 932: - encoding = wxFONTENCODING_CP932; - break; - - case 936: - encoding = wxFONTENCODING_CP936; - break; - - case 949: - encoding = wxFONTENCODING_CP949; - break; - - case 950: - encoding = wxFONTENCODING_CP950; - break; - } - } - } - } - //else: unknown - } - -#if wxUSE_GUI - // if still no luck, ask the user - unless disabled + // if we failed to find the encoding, ask the user -- unless disabled if ( (encoding == wxFONTENCODING_SYSTEM) && interactive ) { // prepare the dialog data @@ -676,13 +122,13 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, msg.Printf(_("The charset '%s' is unknown. You may select\nanother charset to replace it with or choose\n[Cancel] if it cannot be replaced"), charset.c_str()); // the list of choices - const size_t count = WXSIZEOF(gs_encodingDescs); + const size_t count = GetSupportedEncodingsCount(); wxString *encodingNamesTranslated = new wxString[count]; for ( size_t i = 0; i < count; i++ ) { - encodingNamesTranslated[i] = wxGetTranslation(gs_encodingDescs[i]); + encodingNamesTranslated[i] = GetEncodingDescription(GetEncoding(i)); } // the parent window @@ -700,28 +146,26 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, if ( n != -1 ) { - encoding = gs_encodings[n]; + encoding = GetEncoding(n); } #if wxUSE_CONFIG // save the result in the config now - if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) ) + wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH); + if ( path.IsOk() ) { wxConfigBase *config = GetConfig(); - // remember the alt encoding for this charset - or remember that + // remember the alt encoding for this charset -- or remember that // we don't know it long value = n == -1 ? wxFONTENCODING_UNKNOWN : (long)encoding; if ( !config->Write(charset, value) ) { wxLogError(_("Failed to remember the encoding for the charset '%s'."), charset.c_str()); } - - RestorePath(pathOld); } #endif // wxUSE_CONFIG } -#endif // wxUSE_GUI return encoding; } @@ -732,8 +176,6 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, // correspond to which is used by GetFontForEncoding() function // ---------------------------------------------------------------------------- -#if wxUSE_GUI - bool wxFontMapper::TestAltEncoding(const wxString& configEntry, wxFontEncoding encReplacement, wxNativeEncodingInfo *info) @@ -750,26 +192,12 @@ bool wxFontMapper::TestAltEncoding(const wxString& configEntry, GetConfig()->Write(configEntry, info->ToString()); } #endif // wxUSE_CONFIG - return TRUE; + return true; } - return FALSE; + return false; } -#if wxUSE_GUI -class ReentrancyBlocker -{ -public: - ReentrancyBlocker(bool& flag) : m_flagOld(flag), m_flag(flag) - { m_flag = TRUE; } - ~ReentrancyBlocker() { m_flag = m_flagOld; } - -private: - bool m_flagOld; - bool& m_flag; -}; -#endif // wxUSE_GUI - bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, wxNativeEncodingInfo *info, const wxString& facename, @@ -780,20 +208,20 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, // example, when GetAltForEncoding() is called from an OnPaint() handler: // in this case, wxYield() which is called from wxMessageBox() we use here // will lead to another call of OnPaint() and hence to another call of - // GetAltForEncoding() - and it is impossible to catch this from the user + // GetAltForEncoding() -- and it is impossible to catch this from the user // code because we are called from wxFont ctor implicitly. // assume we're always called from the main thread, so that it is safe to // use a static var - static bool s_inGetAltForEncoding = FALSE; + static bool s_inGetAltForEncoding = false; if ( interactive && s_inGetAltForEncoding ) - return FALSE; + return false; ReentrancyBlocker blocker(s_inGetAltForEncoding); #endif // wxUSE_GUI - wxCHECK_MSG( info, FALSE, wxT("bad pointer in GetAltForEncoding") ); + wxCHECK_MSG( info, false, wxT("bad pointer in GetAltForEncoding") ); info->facename = facename; @@ -803,7 +231,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, } // if we failed to load the system default encoding, something is really - // wrong and we'd better stop now - otherwise we will go into endless + // wrong and we'd better stop now -- otherwise we will go into endless // recursion trying to create the font in the msg box with the error // message if ( encoding == wxFONTENCODING_SYSTEM ) @@ -823,50 +251,47 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, #if wxUSE_CONFIG // do we have a font spec for this encoding? - wxString pathOld; - if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) + wxString fontinfo; + wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path.IsOk() ) { - wxConfigBase *config = GetConfig(); - - wxString fontinfo = config->Read(configEntry); - - RestorePath(pathOld); + fontinfo = GetConfig()->Read(configEntry); + } - // this special value means that we don't know of fonts for this - // encoding but, moreover, have already asked the user as well and he - // didn't specify any font neither - if ( fontinfo == FONTMAPPER_FONT_DONT_ASK ) + // this special value means that we don't know of fonts for this + // encoding but, moreover, have already asked the user as well and he + // didn't specify any font neither + if ( fontinfo == FONTMAPPER_FONT_DONT_ASK ) + { + interactive = false; + } + else // use the info entered the last time + { + if ( !!fontinfo && !!facename ) { - interactive = FALSE; + // we tried to find a match with facename -- now try without it + fontinfo = GetConfig()->Read(encName); } - else // use the info entered the last time - { - if ( !!fontinfo && !!facename ) - { - // we tried to find a match with facename - now try without it - fontinfo = config->Read(encName); - } - if ( !!fontinfo ) + if ( !!fontinfo ) + { + if ( info->FromString(fontinfo) ) { - if ( info->FromString(fontinfo) ) - { - if ( wxTestFontEncoding(*info) ) - { - // ok, got something - return TRUE; - } - //else: no such fonts, look for something else - // (should we erase the outdated value?) - } - else + if ( wxTestFontEncoding(*info) ) { - wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"), - fontinfo.c_str()); + // ok, got something + return true; } + //else: no such fonts, look for something else + // (should we erase the outdated value?) + } + else + { + wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"), + fontinfo.c_str()); } - //else: there is no information in config about this encoding } + //else: there is no information in config about this encoding } #endif // wxUSE_CONFIG @@ -874,7 +299,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, // system wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding); size_t count = equiv.GetCount(); - bool foundEquivEncoding = FALSE; + bool foundEquivEncoding = false; wxFontEncoding equivEncoding = wxFONTENCODING_SYSTEM; if ( count ) { @@ -888,7 +313,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, { equivEncoding = equiv[i]; - foundEquivEncoding = TRUE; + foundEquivEncoding = true; } } } @@ -938,15 +363,15 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, #if wxUSE_CONFIG // remember this in the config - if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) + wxFontMapperPathChanger path(this, + FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path.IsOk() ) { GetConfig()->Write(configEntry, info->ToString()); - - RestorePath(pathOld); } #endif // wxUSE_CONFIG - return TRUE; + return true; } //else: the user canceled the font selection dialog } @@ -957,7 +382,9 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, // // remember it to avoid asking the same question again later #if wxUSE_CONFIG - if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) + wxFontMapperPathChanger path(this, + FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path.IsOk() ) { GetConfig()->Write ( @@ -965,8 +392,6 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, foundEquivEncoding ? info->ToString().c_str() : FONTMAPPER_FONT_DONT_ASK ); - - RestorePath(pathOld); } #endif // wxUSE_CONFIG } @@ -978,14 +403,20 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, } bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, - wxFontEncoding *alt_encoding, + wxFontEncoding *encodingAlt, const wxString& facename, bool interactive) { wxNativeEncodingInfo info; - bool r = GetAltForEncoding(encoding, &info, facename, interactive); - *alt_encoding = info.encoding; - return r; + if ( !GetAltForEncoding(encoding, &info, facename, interactive) ) + return false; + + wxCHECK_MSG( encodingAlt, false, + _T("wxFontEncoding::GetAltForEncoding(): NULL pointer") ); + + *encodingAlt = info.encoding; + + return true; } bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, @@ -993,15 +424,11 @@ bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, { wxNativeEncodingInfo info; - if (wxGetNativeFontEncoding(encoding, &info)) - { - info.facename = facename; - return wxTestFontEncoding(info); - } + if ( !wxGetNativeFontEncoding(encoding, &info) ) + return false; - return FALSE; + info.facename = facename; + return wxTestFontEncoding(info); } -#endif // wxUSE_GUI - #endif // wxUSE_FONTMAP diff --git a/src/common/fs_mem.cpp b/src/common/fs_mem.cpp index 29c730164c..30995f3d05 100644 --- a/src/common/fs_mem.cpp +++ b/src/common/fs_mem.cpp @@ -19,14 +19,18 @@ #if wxUSE_FILESYSTEM && wxUSE_STREAMS +#include "wx/image.h" +#include "wx/bitmap.h" +#include "wx/fs_mem.h" + +#ifdef __WXBASE__ + #ifndef WXPRECOMP #include "wx/intl.h" #include "wx/log.h" #include "wx/hash.h" #endif -#include "wx/filesys.h" -#include "wx/fs_mem.h" #include "wx/mstream.h" class MemFSHashObj : public wxObject @@ -77,28 +81,31 @@ class MemFSHashObj : public wxObject //-------------------------------------------------------------------------------- -wxHashTable *wxMemoryFSHandler::m_Hash = NULL; +wxHashTable *wxMemoryFSHandlerBase::m_Hash = NULL; -wxMemoryFSHandler::wxMemoryFSHandler() : wxFileSystemHandler() +wxMemoryFSHandlerBase::wxMemoryFSHandlerBase() : wxFileSystemHandler() { } -wxMemoryFSHandler::~wxMemoryFSHandler() +wxMemoryFSHandlerBase::~wxMemoryFSHandlerBase() { // as only one copy of FS handler is supposed to exist, we may silently // delete static data here. (There is no way how to remove FS handler from // wxFileSystem other than releasing _all_ handlers.) - if (m_Hash) delete m_Hash; - m_Hash = NULL; + if (m_Hash) + { + delete m_Hash; + m_Hash = NULL; + } } -bool wxMemoryFSHandler::CanOpen(const wxString& location) +bool wxMemoryFSHandlerBase::CanOpen(const wxString& location) { wxString p = GetProtocol(location); return (p == wxT("memory")); @@ -107,7 +114,7 @@ bool wxMemoryFSHandler::CanOpen(const wxString& location) -wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) +wxFSFile* wxMemoryFSHandlerBase::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) { if (m_Hash) { @@ -127,25 +134,25 @@ wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString -wxString wxMemoryFSHandler::FindFirst(const wxString& WXUNUSED(spec), +wxString wxMemoryFSHandlerBase::FindFirst(const wxString& WXUNUSED(spec), int WXUNUSED(flags)) { - wxFAIL_MSG(wxT("wxMemoryFSHandler::FindFirst not implemented")); + wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindFirst not implemented")); return wxEmptyString; } -wxString wxMemoryFSHandler::FindNext() +wxString wxMemoryFSHandlerBase::FindNext() { - wxFAIL_MSG(wxT("wxMemoryFSHandler::FindNext not implemented")); + wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindNext not implemented")); return wxEmptyString; } -bool wxMemoryFSHandler::CheckHash(const wxString& filename) +bool wxMemoryFSHandlerBase::CheckHash(const wxString& filename) { if (m_Hash == NULL) { @@ -166,9 +173,8 @@ bool wxMemoryFSHandler::CheckHash(const wxString& filename) -#if wxUSE_GUI - -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, wxImage& image, long type) +/*static*/ void +wxMemoryFSHandlerBase::AddFile(const wxString& filename, wxImage& image, long type) { if (!CheckHash(filename)) return; @@ -186,21 +192,13 @@ bool wxMemoryFSHandler::CheckHash(const wxString& filename) } -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxBitmap& bitmap, long type) -{ - wxImage img = bitmap.ConvertToImage(); - AddFile(filename, img, type); -} - -#endif - -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxString& textdata) +/*static*/ void wxMemoryFSHandlerBase::AddFile(const wxString& filename, const wxString& textdata) { AddFile(filename, (const void*) textdata.mb_str(), textdata.Length()); } -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const void *binarydata, size_t size) +/*static*/ void wxMemoryFSHandlerBase::AddFile(const wxString& filename, const void *binarydata, size_t size) { if (!CheckHash(filename)) return; m_Hash -> Put(filename, new MemFSHashObj(binarydata, size)); @@ -208,7 +206,7 @@ bool wxMemoryFSHandler::CheckHash(const wxString& filename) -/*static*/ void wxMemoryFSHandler::RemoveFile(const wxString& filename) +/*static*/ void wxMemoryFSHandlerBase::RemoveFile(const wxString& filename) { if (m_Hash == NULL || m_Hash -> Get(filename) == NULL) @@ -222,6 +220,18 @@ bool wxMemoryFSHandler::CheckHash(const wxString& filename) delete m_Hash -> Delete(filename); } +#endif // __WXBASE__ + +#if wxUSE_GUI + +/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxBitmap& bitmap, long type) +{ + wxImage img = bitmap.ConvertToImage(); + AddFile(filename, img, type); +} + +#endif #endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP + diff --git a/src/common/init.cpp b/src/common/init.cpp index 4f0aed6e49..b3cd9aa66d 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -32,23 +32,15 @@ #include "wx/module.h" -// ---------------------------------------------------------------------------- -// global vars -// ---------------------------------------------------------------------------- - -WXDLLEXPORT wxApp *wxTheApp = NULL; - -wxAppInitializerFunction - wxAppBase::m_appInitFn = (wxAppInitializerFunction)NULL; - // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- -class /* no WXDLLEXPORT */ wxConsoleApp : public wxApp +// we need a dummy app object if the user doesn't want to create a real one +class wxDummyConsoleApp : public wxApp { public: - virtual int OnRun() { wxFAIL_MSG(wxT("unreachable")); return 0; } + virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } }; // ---------------------------------------------------------------------------- @@ -68,21 +60,6 @@ static size_t gs_nInitCount = 0; // implementation // ============================================================================ -// ---------------------------------------------------------------------------- -// stubs for some GUI functions -// ---------------------------------------------------------------------------- - -void WXDLLEXPORT wxExit() -{ - abort(); -} - -// Yield to other apps/messages -void WXDLLEXPORT wxWakeUpIdle() -{ - // do nothing -} - // ---------------------------------------------------------------------------- // wxBase-specific functions // ---------------------------------------------------------------------------- @@ -103,7 +80,7 @@ bool WXDLLEXPORT wxInitialize() return FALSE; } - wxTheApp = new wxConsoleApp; + wxTheApp = new wxDummyConsoleApp; if ( !wxTheApp ) { diff --git a/src/common/log.cpp b/src/common/log.cpp index 06b2283ad4..53de91f046 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -18,57 +18,38 @@ // ---------------------------------------------------------------------------- #ifdef __GNUG__ - #pragma implementation "log.h" + #pragma implementation "log.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_LOG + // wxWindows #ifndef WX_PRECOMP - #include "wx/string.h" - #include "wx/intl.h" #include "wx/app.h" - - #if wxUSE_GUI - #include "wx/window.h" - #include "wx/msgdlg.h" - #ifdef __WXMSW__ - #include "wx/msw/private.h" - #endif - #endif + #include "wx/intl.h" + #include "wx/string.h" #endif //WX_PRECOMP -#include "wx/file.h" -#include "wx/textfile.h" -#include "wx/utils.h" -#include "wx/wxchar.h" -#include "wx/log.h" -#include "wx/thread.h" - -#if wxUSE_LOG +#include "wx/apptrait.h" +#include "wx/file.h" +#include "wx/log.h" +#include "wx/msgout.h" +#include "wx/textfile.h" +#include "wx/thread.h" +#include "wx/utils.h" +#include "wx/wxchar.h" // other standard headers -#include -#include -#include - -#if defined(__WXMSW__) - #include "wx/msw/private.h" // includes windows.h for OutputDebugString -#endif - -#if defined(__WXMAC__) - #include "wx/mac/private.h" // includes mac headers -#endif - -#if defined(__MWERKS__) && wxUSE_UNICODE - #include -#endif - +#include +#include +#include // ---------------------------------------------------------------------------- // non member functions @@ -524,192 +505,6 @@ wxLogStderr::wxLogStderr(FILE *fp) m_fp = fp; } -#if defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400) - -// MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds... - -#ifndef __MetroNubUtils__ -#include "MetroNubUtils.h" -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __GESTALT__ -#include -#endif - -#ifndef true -#define true 1 -#endif - -#ifndef false -#define false 0 -#endif - -#if TARGET_API_MAC_CARBON - - #include - - EXTERN_API_C( long ) - CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...); - - ProcPtr gCallUniversalProc_Proc = NULL; - -#endif - -static MetroNubUserEntryBlock* gMetroNubEntry = NULL; - -static long fRunOnce = false; - -Boolean IsCompatibleVersion(short inVersion); - -/* --------------------------------------------------------------------------- - IsCompatibleVersion - --------------------------------------------------------------------------- */ - -Boolean IsCompatibleVersion(short inVersion) -{ - Boolean result = false; - - if (fRunOnce) - { - MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result; - - result = (inVersion <= block->apiHiVersion); - } - - return result; -} - -/* --------------------------------------------------------------------------- - IsMetroNubInstalled - --------------------------------------------------------------------------- */ - -Boolean IsMetroNubInstalled() -{ - if (!fRunOnce) - { - long result, value; - - fRunOnce = true; - gMetroNubEntry = NULL; - - if (Gestalt(gestaltSystemVersion, &value) == noErr && value < 0x1000) - { - /* look for MetroNub's Gestalt selector */ - if (Gestalt(kMetroNubUserSignature, &result) == noErr) - { - - #if TARGET_API_MAC_CARBON - if (gCallUniversalProc_Proc == NULL) - { - CFragConnectionID connectionID; - Ptr mainAddress; - Str255 errorString; - ProcPtr symbolAddress; - OSErr err; - CFragSymbolClass symbolClass; - - symbolAddress = NULL; - err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag, - &connectionID, &mainAddress, errorString); - - if (err != noErr) - { - gCallUniversalProc_Proc = NULL; - goto end; - } - - err = FindSymbol(connectionID, "\pCallUniversalProc", - (Ptr *) &gCallUniversalProc_Proc, &symbolClass); - - if (err != noErr) - { - gCallUniversalProc_Proc = NULL; - goto end; - } - } - #endif - - { - MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result; - - /* make sure the version of the API is compatible */ - if (block->apiLowVersion <= kMetroNubUserAPIVersion && - kMetroNubUserAPIVersion <= block->apiHiVersion) - gMetroNubEntry = block; /* success! */ - } - - } - } - } - -end: - -#if TARGET_API_MAC_CARBON - return (gMetroNubEntry != NULL && gCallUniversalProc_Proc != NULL); -#else - return (gMetroNubEntry != NULL); -#endif -} - -/* --------------------------------------------------------------------------- - IsMWDebuggerRunning [v1 API] - --------------------------------------------------------------------------- */ - -Boolean IsMWDebuggerRunning() -{ - if (IsMetroNubInstalled()) - return CallIsDebuggerRunningProc(gMetroNubEntry->isDebuggerRunning); - else - return false; -} - -/* --------------------------------------------------------------------------- - AmIBeingMWDebugged [v1 API] - --------------------------------------------------------------------------- */ - -Boolean AmIBeingMWDebugged() -{ - if (IsMetroNubInstalled()) - return CallAmIBeingDebuggedProc(gMetroNubEntry->amIBeingDebugged); - else - return false; -} - -/* --------------------------------------------------------------------------- - UserSetWatchPoint [v2 API] - --------------------------------------------------------------------------- */ - -OSErr UserSetWatchPoint (Ptr address, long length, WatchPointIDT* watchPointID) -{ - if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion)) - return CallUserSetWatchPointProc(gMetroNubEntry->userSetWatchPoint, - address, length, watchPointID); - else - return errProcessIsNotClient; -} - -/* --------------------------------------------------------------------------- - ClearWatchPoint [v2 API] - --------------------------------------------------------------------------- */ - -OSErr ClearWatchPoint (WatchPointIDT watchPointID) -{ - if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion)) - return CallClearWatchPointProc(gMetroNubEntry->clearWatchPoint, watchPointID); - else - return errProcessIsNotClient; -} - -#ifdef __cplusplus - } -#endif - -#endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400) - void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { wxString str; @@ -720,43 +515,18 @@ void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) fputc(_T('\n'), m_fp); fflush(m_fp); - // under Windows, programs usually don't have stderr at all, so show the - // messages also under debugger (unless it's a console program which does - // have stderr or unless this is a file logger which doesn't use stderr at - // all) -#if defined(__WXMSW__) && wxUSE_GUI && !defined(__WXMICROWIN__) + // under GUI systems such as Windows or Mac, programs usually don't have + // stderr at all, so show the messages also somewhere else, typically in + // the debugger window so that they go at least somewhere instead of being + // simply lost if ( m_fp == stderr ) { - str += wxT("\r\n") ; - OutputDebugString(str.c_str()); - } -#endif // MSW - -#if defined(__WXMAC__) && !defined(__DARWIN__) && wxUSE_GUI - Str255 pstr ; - wxString output = str + wxT(";g") ; - wxMacStringToPascal( output.c_str() , pstr ) ; - - Boolean running = false ; - -#if defined(__MWERKS__) && (__MWERKS__ >= 0x2400) - - if ( IsMWDebuggerRunning() && AmIBeingMWDebugged() ) - { - running = true ; - } - -#endif - - if (running) - { -#ifdef __powerc - DebugStr(pstr); -#else - SysBreakStr(pstr); -#endif + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits && !traits->HasStderr() ) + { + wxMessageOutputDebug().Printf(_T("%s"), str.c_str()); + } } -#endif // Mac } // ---------------------------------------------------------------------------- @@ -870,11 +640,7 @@ wxLogLevel wxLog::ms_logLevel = wxLOG_Max; // log everything by defaul size_t wxLog::ms_suspendCount = 0; -#if wxUSE_GUI - const wxChar *wxLog::ms_timestamp = wxT("%X"); // time only, no date -#else - const wxChar *wxLog::ms_timestamp = NULL; // save space -#endif +const wxChar *wxLog::ms_timestamp = wxT("%X"); // time only, no date wxTraceMask wxLog::ms_ulTraceMask = (wxTraceMask)0; wxArrayString wxLog::ms_aTraceMasks; @@ -989,6 +755,5 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode) #endif // Win/Unix } -#endif //wxUSE_LOG +#endif // wxUSE_LOG -// vi:sts=4:sw=4:et diff --git a/src/common/msgout.cpp b/src/common/msgout.cpp index e6a079969e..2baffdcf32 100755 --- a/src/common/msgout.cpp +++ b/src/common/msgout.cpp @@ -48,6 +48,12 @@ // implementation // =========================================================================== +#ifdef __WXBASE__ + +// ---------------------------------------------------------------------------- +// wxMessageOutput +// ---------------------------------------------------------------------------- + wxMessageOutput* wxMessageOutput::ms_msgOut = 0; wxMessageOutput* wxMessageOutput::Get() @@ -84,34 +90,42 @@ void wxMessageOutputStderr::Printf(const wxChar* format, ...) } // ---------------------------------------------------------------------------- -// wxMessageOutputMessageBox +// wxMessageOutputDebug // ---------------------------------------------------------------------------- -#if wxUSE_GUI - -void wxMessageOutputMessageBox::Printf(const wxChar* format, ...) +void wxMessageOutputDebug::Printf(const wxChar* format, ...) { + wxString out; + va_list args; va_start(args, format); - wxString out; out.PrintfV(format, args); va_end(args); - // the native MSW msg box understands the TABs, others don't -#ifndef __WXMSW__ +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) out.Replace(wxT("\t"), wxT(" ")); -#endif - - wxString title; - if ( wxTheApp ) - title.Printf(_("%s message"), wxTheApp->GetAppName().c_str()); - - ::wxMessageBox(out, title); + out += _T("\r\n"); + ::OutputDebugString(out); +#elif defined(__WXMAC__) && !defined(__DARWIN__) + if ( wxIsDebuggerRunning() ) + { + Str255 pstr; + wxString output = str + wxT(";g") ; + wxMacStringToPascal(output.c_str(), pstr); + + #ifdef __powerc + DebugStr(pstr); + #else + SysBreakStr(pstr); + #endif + } +#else // !MSW, !Mac + wxFputs(out, stderr); + fflush(stderr); +#endif // platform } -#endif // wxUSE_GUI - // ---------------------------------------------------------------------------- // wxMessageOutputLog // ---------------------------------------------------------------------------- @@ -130,3 +144,35 @@ void wxMessageOutputLog::Printf(const wxChar* format, ...) ::wxLogMessage(wxT("%s"), out.c_str()); } + +#endif // __WXBASE__ + +// ---------------------------------------------------------------------------- +// wxMessageOutputMessageBox +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +void wxMessageOutputMessageBox::Printf(const wxChar* format, ...) +{ + va_list args; + va_start(args, format); + wxString out; + + out.PrintfV(format, args); + va_end(args); + + // the native MSW msg box understands the TABs, others don't +#ifndef __WXMSW__ + out.Replace(wxT("\t"), wxT(" ")); +#endif + + wxString title; + if ( wxTheApp ) + title.Printf(_("%s message"), wxTheApp->GetAppName().c_str()); + + ::wxMessageBox(out, title); +} + +#endif // wxUSE_GUI + diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 0136da4a20..b25ca3fd31 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -27,6 +27,7 @@ #if wxUSE_SOCKETS #include "wx/app.h" +#include "wx/apptrait.h" #include "wx/defs.h" #include "wx/object.h" #include "wx/string.h" @@ -37,10 +38,6 @@ #include "wx/intl.h" #include "wx/event.h" -#if wxUSE_GUI - #include "wx/gdicmn.h" // for wxPendingDelete -#endif // wxUSE_GUI - #include "wx/sckaddr.h" #include "wx/socket.h" @@ -51,30 +48,24 @@ // discard buffer #define MAX_DISCARD_SIZE (10 * 1024) -// what to do within waits: in wxBase we don't do anything as we don't have -// the event loop anyhow (for now). In GUI apps we have 2 cases: from the main -// thread itself we have to call wxYield() to let the events (including the -// GUI events and the low-level (not wxWindows) events from GSocket) be -// processed. From another thread it is enough to just call wxThread::Yield() -// which will give away the rest of our time slice: the explanation is that -// the events will be processed by the main thread anyhow, without calling -// wxYield(), but we don't want to eat the CPU time uselessly while sitting -// in the loop waiting for the data -#if wxUSE_GUI - #if wxUSE_THREADS - #define PROCESS_EVENTS() \ - { \ - if ( wxThread::IsMain() ) \ - wxYield(); \ - else \ - wxThread::Yield(); \ - } - #else // !wxUSE_THREADS - #define PROCESS_EVENTS() wxYield() - #endif // wxUSE_THREADS/!wxUSE_THREADS -#else // !wxUSE_GUI - #define PROCESS_EVENTS() -#endif // wxUSE_GUI/!wxUSE_GUI +// what to do within waits: we have 2 cases: from the main thread itself we +// have to call wxYield() to let the events (including the GUI events and the +// low-level (not wxWindows) events from GSocket) be processed. From another +// thread it is enough to just call wxThread::Yield() which will give away the +// rest of our time slice: the explanation is that the events will be processed +// by the main thread anyhow, without calling wxYield(), but we don't want to +// eat the CPU time uselessly while sitting in the loop waiting for the data +#if wxUSE_THREADS + #define PROCESS_EVENTS() \ + { \ + if ( wxThread::IsMain() ) \ + wxYield(); \ + else \ + wxThread::Yield(); \ + } +#else // !wxUSE_THREADS + #define PROCESS_EVENTS() wxYield() +#endif // wxUSE_THREADS/!wxUSE_THREADS #define wxTRACE_Socket _T("wxSocket") @@ -213,9 +204,9 @@ wxSocketBase::~wxSocketBase() { // Just in case the app called Destroy() *and* then deleted // the socket immediately: don't leave dangling pointers. -#if wxUSE_GUI - wxPendingDelete.DeleteObject(this); -#endif + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + traits->RemoveFromPendingDelete(this); // Shutdown and close the socket if (!m_beingDeleted) @@ -243,12 +234,18 @@ bool wxSocketBase::Destroy() // Supress events from now on Notify(FALSE); -#if wxUSE_GUI - if ( !wxPendingDelete.Member(this) ) - wxPendingDelete.Append(this); -#else - delete this; -#endif + // schedule this object for deletion + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + { + // let the traits object decide what to do with us + traits->ScheduleForDestroy(this); + } + else // no app or no traits + { + // in wxBase we might have no app object at all, don't leak memory + delete this; + } return TRUE; } diff --git a/src/common/stopwatch.cpp b/src/common/stopwatch.cpp new file mode 100644 index 0000000000..d22e49184c --- /dev/null +++ b/src/common/stopwatch.cpp @@ -0,0 +1,344 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/stopwatch.cpp +// Purpose: wxStopWatch and other non-GUI stuff from wx/timer.h +// Author: +// Original version by Julian Smart +// Vadim Zeitlin got rid of all ifdefs (11.12.99) +// Sylvain Bougnoux added wxStopWatch class +// Guillermo Rodriguez rewrote from scratch (Dic/99) +// Modified by: +// Created: 20.06.2003 (extracted from common/timercmn.cpp) +// RCS-ID: $Id$ +// Copyright: (c) 1998-2003 wxWindows Team +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/timer.h" +#include "wx/longlong.h" + +// ---------------------------------------------------------------------------- +// System headers +// ---------------------------------------------------------------------------- + +#if defined(__WIN32__) + #include +#endif + +#if defined(__WIN32__) && !defined(HAVE_FTIME) && !defined(__MWERKS__) + #define HAVE_FTIME +#endif + +#if defined(__VISAGECPP__) && !defined(HAVE_FTIME) + #define HAVE_FTIME +# if __IBMCPP__ >= 400 + # define ftime(x) _ftime(x) +# endif +#endif + +#if defined(__MWERKS__) && defined(__WXMSW__) +# undef HAVE_FTIME +# undef HAVE_GETTIMEOFDAY +#endif + +#include +#ifndef __WXMAC__ + #include // for time_t +#endif + +#if defined(HAVE_GETTIMEOFDAY) + #include + #include +#elif defined(HAVE_FTIME) + #include +#endif + +#ifdef __WXMAC__ + #include + #include +#endif + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// on some really old systems gettimeofday() doesn't have the second argument, +// define wxGetTimeOfDay() to hide this difference +#ifdef HAVE_GETTIMEOFDAY + #ifdef WX_GETTIMEOFDAY_NO_TZ + struct timezone; + #define wxGetTimeOfDay(tv, tz) gettimeofday(tv) + #else + #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz)) + #endif +#endif // HAVE_GETTIMEOFDAY + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxStopWatch +// ---------------------------------------------------------------------------- + +#if wxUSE_STOPWATCH + +void wxStopWatch::Start(long t) +{ + m_t0 = wxGetLocalTimeMillis() - t; + m_pause = 0; + m_pauseCount = 0; +} + +long wxStopWatch::GetElapsedTime() const +{ + return (wxGetLocalTimeMillis() - m_t0).GetLo(); +} + +long wxStopWatch::Time() const +{ + return m_pauseCount ? m_pause : GetElapsedTime(); +} + +#endif // wxUSE_STOPWATCH + +// ---------------------------------------------------------------------------- +// old timer functions superceded by wxStopWatch +// ---------------------------------------------------------------------------- + +#if wxUSE_LONGLONG + +static wxLongLong wxStartTime = 0l; + +// starts the global timer +void wxStartTimer() +{ + wxStartTime = wxGetLocalTimeMillis(); +} + +// Returns elapsed time in milliseconds +long wxGetElapsedTime(bool resetTimer) +{ + wxLongLong oldTime = wxStartTime; + wxLongLong newTime = wxGetLocalTimeMillis(); + + if ( resetTimer ) + wxStartTime = newTime; + + return (newTime - oldTime).GetLo(); +} + +#endif // wxUSE_LONGLONG + +// ---------------------------------------------------------------------------- +// the functions to get the current time and timezone info +// ---------------------------------------------------------------------------- + +// Get local time as seconds since 00:00:00, Jan 1st 1970 +long wxGetLocalTime() +{ + struct tm tm; + time_t t0, t1; + + // This cannot be made static because mktime can overwrite it. + // + memset(&tm, 0, sizeof(tm)); + tm.tm_year = 70; + tm.tm_mon = 0; + tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; // let mktime guess + + // Note that mktime assumes that the struct tm contains local time. + // + t1 = time(&t1); // now + t0 = mktime(&tm); // origin + + // Return the difference in seconds. + // + if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) + return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); + + wxLogSysError(_("Failed to get the local system time")); + return -1; +} + +// Get UTC time as seconds since 00:00:00, Jan 1st 1970 +long wxGetUTCTime() +{ + struct tm tm; + struct tm *ptm; + time_t t0, t1; + + // This cannot be made static because mktime can overwrite it + // + memset(&tm, 0, sizeof(tm)); + tm.tm_year = 70; + tm.tm_mon = 0; + tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; // let mktime guess + + // Note that mktime assumes that the struct tm contains local time. + // + t1 = time(&t1); // now + t0 = mktime(&tm); // origin in localtime + + if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) + { + // To get t0 as GMT we convert to a struct tm with gmtime, + // and then back again. + // + ptm = gmtime(&t0); + + if (ptm) + { + memcpy(&tm, ptm, sizeof(tm)); + t0 = mktime(&tm); + + if (t0 != (time_t)-1 ) + return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); + wxLogSysError(_("mktime() failed")); + } + else + { + wxLogSysError(_("gmtime() failed")); + } + } + + wxLogError(_("Failed to get the UTC system time.")); + + return -1; +} + +#if wxUSE_LONGLONG + +// Get local time as milliseconds since 00:00:00, Jan 1st 1970 +wxLongLong wxGetLocalTimeMillis() +{ + wxLongLong val = 1000l; + + // If possible, use a function which avoids conversions from + // broken-up time structures to milliseconds + +#if defined(__WXMSW__) && defined(__MWERKS__) + // This should probably be the way all WXMSW compilers should do it + // Go direct to the OS for time + + SYSTEMTIME thenst = { 1970, 1, 4, 1, 0, 0, 0, 0 }; // 00:00:00 Jan 1st 1970 + FILETIME thenft; + SystemTimeToFileTime( &thenst, &thenft ); + wxLongLong then( thenft.dwHighDateTime, thenft.dwLowDateTime ); // time in 100 nanoseconds + + SYSTEMTIME nowst; + GetLocalTime( &nowst ); + FILETIME nowft; + SystemTimeToFileTime( &nowst, &nowft ); + wxLongLong now( nowft.dwHighDateTime, nowft.dwLowDateTime ); // time in 100 nanoseconds + + return ( now - then ) / 10000.0; // time from 00:00:00 Jan 1st 1970 to now in milliseconds + +#elif defined(HAVE_GETTIMEOFDAY) + struct timeval tp; + if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) + { + val *= tp.tv_sec; + return (val + (tp.tv_usec / 1000)); + } + else + { + wxLogError(_("wxGetTimeOfDay failed.")); + return 0; + } +#elif defined(HAVE_FTIME) + struct timeb tp; + + // ftime() is void and not int in some mingw32 headers, so don't + // test the return code (well, it shouldn't fail anyhow...) + (void)ftime(&tp); + val *= tp.time; + return (val + tp.millitm); +#elif defined(__WXMAC__) + + static UInt64 gMilliAtStart = 0; + + Nanoseconds upTime = AbsoluteToNanoseconds( UpTime() ); + + if ( gMilliAtStart == 0 ) + { + time_t start = time(NULL); + gMilliAtStart = ((UInt64) start) * 1000000L; + gMilliAtStart -= upTime.lo / 1000 ; + gMilliAtStart -= ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); + } + + UInt64 millival = gMilliAtStart; + millival += upTime.lo / (1000 * 1000); + millival += ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); + val = millival; + + return val; +#else // no gettimeofday() nor ftime() + // We use wxGetLocalTime() to get the seconds since + // 00:00:00 Jan 1st 1970 and then whatever is available + // to get millisecond resolution. + // + // NOTE that this might lead to a problem if the clocks + // use different sources, so this approach should be + // avoided where possible. + + val *= wxGetLocalTime(); + +// GRG: This will go soon as all WIN32 seem to have ftime +#if defined (__WIN32__) + // If your platform/compiler needs to use two different functions + // to get ms resolution, please do NOT just shut off these warnings, + // drop me a line instead at + #warning "Possible clock skew bug in wxGetLocalTimeMillis()!" + + SYSTEMTIME st; + ::GetLocalTime(&st); + val += st.wMilliseconds; +#else // !Win32 + // If your platform/compiler does not support ms resolution please + // do NOT just shut off these warnings, drop me a line instead at + // + + #if defined(__VISUALC__) || defined (__WATCOMC__) + #pragma message("wxStopWatch will be up to second resolution!") + #elif defined(__BORLANDC__) + #pragma message "wxStopWatch will be up to second resolution!" + #else + #warning "wxStopWatch will be up to second resolution!" + #endif // compiler +#endif + + return val; + +#endif // time functions +} + +#endif // wxUSE_LONGLONG + + diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index b6e7e918dd..7371b1ffbf 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,12 +1,8 @@ ///////////////////////////////////////////////////////////////////////////// // Name: common/timercmn.cpp -// Purpose: Common timer implementation -// Author: -// Original version by Julian Smart -// Vadim Zeitlin got rid of all ifdefs (11.12.99) -// Sylvain Bougnoux added wxStopWatch class -// Guillermo Rodriguez rewrote from scratch (Dic/99) -// Modified by: +// Purpose: wxTimerBase implementation +// Author: Julian Smart, Guillermo Rodriguez, Vadim Zeitlin +// Modified by: VZ: extracted all non-wxTimer stuff in stopwatch.cpp (20.06.03) // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart @@ -33,88 +29,21 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/intl.h" - #include "wx/log.h" - #include "wx/thread.h" -#endif - -#include "wx/timer.h" -#include "wx/longlong.h" - -// ---------------------------------------------------------------------------- -// System headers -// ---------------------------------------------------------------------------- - -#if defined(__WIN32__) - #include -#endif - -#if defined(__WIN32__) && !defined(HAVE_FTIME) && !defined(__MWERKS__) - #define HAVE_FTIME -#endif - -#if defined(__VISAGECPP__) && !defined(HAVE_FTIME) - #define HAVE_FTIME -# if __IBMCPP__ >= 400 - # define ftime(x) _ftime(x) -# endif -#endif - -#if defined(__MWERKS__) && defined(__WXMSW__) -# undef HAVE_FTIME -# undef HAVE_GETTIMEOFDAY -#endif - -#include -#ifndef __WXMAC__ - #include // for time_t -#endif +#if wxUSE_TIMER -#if defined(HAVE_GETTIMEOFDAY) - #include - #include -#elif defined(HAVE_FTIME) - #include +#ifndef WX_PRECOMP #endif -#ifdef __WXMAC__ - #include - #include -#endif // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- -#if wxUSE_GUI && wxUSE_TIMER - IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) -#endif // wxUSE_GUI - -// ---------------------------------------------------------------------------- -// macros -// ---------------------------------------------------------------------------- - -// on some really old systems gettimeofday() doesn't have the second argument, -// define wxGetTimeOfDay() to hide this difference -#ifdef HAVE_GETTIMEOFDAY - #ifdef WX_GETTIMEOFDAY_NO_TZ - struct timezone; - #define wxGetTimeOfDay(tv, tz) gettimeofday(tv) - #else - #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz)) - #endif -#endif // HAVE_GETTIMEOFDAY +IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) // ============================================================================ -// implementation +// wxTimerBase implementation // ============================================================================ -// ---------------------------------------------------------------------------- -// wxTimerBase -// ---------------------------------------------------------------------------- - -#if wxUSE_GUI && wxUSE_TIMER - wxTimerBase::~wxTimerBase() { // this destructor is required for Darwin @@ -157,252 +86,5 @@ bool wxTimerBase::Start(int milliseconds, bool oneShot) return TRUE; } -#endif // wxUSE_GUI - -// ---------------------------------------------------------------------------- -// wxStopWatch -// ---------------------------------------------------------------------------- - -#if wxUSE_STOPWATCH && wxUSE_LONGLONG - -void wxStopWatch::Start(long t) -{ - m_t0 = wxGetLocalTimeMillis() - t; - m_pause = 0; - m_pauseCount = 0; -} - -long wxStopWatch::GetElapsedTime() const -{ - return (wxGetLocalTimeMillis() - m_t0).GetLo(); -} - -long wxStopWatch::Time() const -{ - return m_pauseCount ? m_pause : GetElapsedTime(); -} - -#endif // wxUSE_LONGLONG - -// ---------------------------------------------------------------------------- -// old timer functions superceded by wxStopWatch -// ---------------------------------------------------------------------------- - -#if wxUSE_LONGLONG - -static wxLongLong wxStartTime = 0l; - -// starts the global timer -void wxStartTimer() -{ - wxStartTime = wxGetLocalTimeMillis(); -} - -// Returns elapsed time in milliseconds -long wxGetElapsedTime(bool resetTimer) -{ - wxLongLong oldTime = wxStartTime; - wxLongLong newTime = wxGetLocalTimeMillis(); - - if ( resetTimer ) - wxStartTime = newTime; - - return (newTime - oldTime).GetLo(); -} - -#endif // wxUSE_LONGLONG - -// ---------------------------------------------------------------------------- -// the functions to get the current time and timezone info -// ---------------------------------------------------------------------------- - -// Get local time as seconds since 00:00:00, Jan 1st 1970 -long wxGetLocalTime() -{ - struct tm tm; - time_t t0, t1; - - // This cannot be made static because mktime can overwrite it. - // - memset(&tm, 0, sizeof(tm)); - tm.tm_year = 70; - tm.tm_mon = 0; - tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; // let mktime guess - - // Note that mktime assumes that the struct tm contains local time. - // - t1 = time(&t1); // now - t0 = mktime(&tm); // origin - - // Return the difference in seconds. - // - if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) - return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); - - wxLogSysError(_("Failed to get the local system time")); - return -1; -} - -// Get UTC time as seconds since 00:00:00, Jan 1st 1970 -long wxGetUTCTime() -{ - struct tm tm; - struct tm *ptm; - time_t t0, t1; - - // This cannot be made static because mktime can overwrite it - // - memset(&tm, 0, sizeof(tm)); - tm.tm_year = 70; - tm.tm_mon = 0; - tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; // let mktime guess - - // Note that mktime assumes that the struct tm contains local time. - // - t1 = time(&t1); // now - t0 = mktime(&tm); // origin in localtime - - if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) - { - // To get t0 as GMT we convert to a struct tm with gmtime, - // and then back again. - // - ptm = gmtime(&t0); - - if (ptm) - { - memcpy(&tm, ptm, sizeof(tm)); - t0 = mktime(&tm); - - if (t0 != (time_t)-1 ) - return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); - wxLogSysError(_("mktime() failed")); - } - else - { - wxLogSysError(_("gmtime() failed")); - } - } - - wxLogError(_("Failed to get the UTC system time.")); - - return -1; -} - -#if wxUSE_LONGLONG - -// Get local time as milliseconds since 00:00:00, Jan 1st 1970 -wxLongLong wxGetLocalTimeMillis() -{ - wxLongLong val = 1000l; - - // If possible, use a function which avoids conversions from - // broken-up time structures to milliseconds - -#if defined(__WXMSW__) && defined(__MWERKS__) - // This should probably be the way all WXMSW compilers should do it - // Go direct to the OS for time - - SYSTEMTIME thenst = { 1970, 1, 4, 1, 0, 0, 0, 0 }; // 00:00:00 Jan 1st 1970 - FILETIME thenft; - SystemTimeToFileTime( &thenst, &thenft ); - wxLongLong then( thenft.dwHighDateTime, thenft.dwLowDateTime ); // time in 100 nanoseconds - - SYSTEMTIME nowst; - GetLocalTime( &nowst ); - FILETIME nowft; - SystemTimeToFileTime( &nowst, &nowft ); - wxLongLong now( nowft.dwHighDateTime, nowft.dwLowDateTime ); // time in 100 nanoseconds - - return ( now - then ) / 10000.0; // time from 00:00:00 Jan 1st 1970 to now in milliseconds - -#elif defined(HAVE_GETTIMEOFDAY) - struct timeval tp; - if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) - { - val *= tp.tv_sec; - return (val + (tp.tv_usec / 1000)); - } - else - { - wxLogError(_("wxGetTimeOfDay failed.")); - return 0; - } -#elif defined(HAVE_FTIME) - struct timeb tp; - - // ftime() is void and not int in some mingw32 headers, so don't - // test the return code (well, it shouldn't fail anyhow...) - (void)ftime(&tp); - val *= tp.time; - return (val + tp.millitm); -#elif defined(__WXMAC__) - - static UInt64 gMilliAtStart = 0; - - Nanoseconds upTime = AbsoluteToNanoseconds( UpTime() ); - - if ( gMilliAtStart == 0 ) - { - time_t start = time(NULL); - gMilliAtStart = ((UInt64) start) * 1000000L; - gMilliAtStart -= upTime.lo / 1000 ; - gMilliAtStart -= ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); - } - - UInt64 millival = gMilliAtStart; - millival += upTime.lo / (1000 * 1000); - millival += ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); - val = millival; - - return val; -#else // no gettimeofday() nor ftime() - // We use wxGetLocalTime() to get the seconds since - // 00:00:00 Jan 1st 1970 and then whatever is available - // to get millisecond resolution. - // - // NOTE that this might lead to a problem if the clocks - // use different sources, so this approach should be - // avoided where possible. - - val *= wxGetLocalTime(); - -// GRG: This will go soon as all WIN32 seem to have ftime -#if defined (__WIN32__) - // If your platform/compiler needs to use two different functions - // to get ms resolution, please do NOT just shut off these warnings, - // drop me a line instead at - #warning "Possible clock skew bug in wxGetLocalTimeMillis()!" - - SYSTEMTIME st; - ::GetLocalTime(&st); - val += st.wMilliseconds; -#else // !Win32 - // If your platform/compiler does not support ms resolution please - // do NOT just shut off these warnings, drop me a line instead at - // - - #if defined(__VISUALC__) || defined (__WATCOMC__) - #pragma message("wxStopWatch will be up to second resolution!") - #elif defined(__BORLANDC__) - #pragma message "wxStopWatch will be up to second resolution!" - #else - #warning "wxStopWatch will be up to second resolution!" - #endif // compiler -#endif - - return val; - -#endif // time functions -} - -#endif // #if wxUSE_STOPWATCH && wxUSE_LONGLONG +#endif // wxUSE_TIMER diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 1bf855421b..006a066446 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -92,15 +92,6 @@ extern bool g_isIdle; void wxapp_install_idle_handler(); -//----------------------------------------------------------------------------- -// wxExit -//----------------------------------------------------------------------------- - -void wxExit() -{ - gtk_main_quit(); -} - //----------------------------------------------------------------------------- // wxYield //----------------------------------------------------------------------------- @@ -168,20 +159,15 @@ bool wxApp::Yield(bool onlyIfNeeded) // wxWakeUpIdle //----------------------------------------------------------------------------- -static bool gs_WakeUpIdle = false; - -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { #if wxUSE_THREADS if (!wxThread::IsMain()) wxMutexGuiEnter(); #endif - if (g_isIdle) { - gs_WakeUpIdle = true; + if (g_isIdle) wxapp_install_idle_handler(); - gs_WakeUpIdle = false; - } #if wxUSE_THREADS if (!wxThread::IsMain()) @@ -660,6 +646,13 @@ int wxApp::MainLoop() return 0; } +void wxApp::Exit() +{ + // VZ: no idea why is it different from ExitMainLoop() but this is what + // wxExit() used to do + gtk_main_quit(); +} + void wxApp::ExitMainLoop() { if (gtk_main_level() > 0) diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index 1bf855421b..006a066446 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -92,15 +92,6 @@ extern bool g_isIdle; void wxapp_install_idle_handler(); -//----------------------------------------------------------------------------- -// wxExit -//----------------------------------------------------------------------------- - -void wxExit() -{ - gtk_main_quit(); -} - //----------------------------------------------------------------------------- // wxYield //----------------------------------------------------------------------------- @@ -168,20 +159,15 @@ bool wxApp::Yield(bool onlyIfNeeded) // wxWakeUpIdle //----------------------------------------------------------------------------- -static bool gs_WakeUpIdle = false; - -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { #if wxUSE_THREADS if (!wxThread::IsMain()) wxMutexGuiEnter(); #endif - if (g_isIdle) { - gs_WakeUpIdle = true; + if (g_isIdle) wxapp_install_idle_handler(); - gs_WakeUpIdle = false; - } #if wxUSE_THREADS if (!wxThread::IsMain()) @@ -660,6 +646,13 @@ int wxApp::MainLoop() return 0; } +void wxApp::Exit() +{ + // VZ: no idea why is it different from ExitMainLoop() but this is what + // wxExit() used to do + gtk_main_quit(); +} + void wxApp::ExitMainLoop() { if (gtk_main_level() > 0) diff --git a/src/mac/app.cpp b/src/mac/app.cpp index ad2eb4d5ea..31ac4e6910 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -1226,7 +1226,7 @@ void wxApp::OnIdle(wxIdleEvent& event) wxMenuBar::MacGetCommonMenuBar()->MacInstallMenuBar(); } -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { wxMacWakeUp() ; } @@ -1289,10 +1289,8 @@ void wxApp::DeletePendingObjects() } } -void wxExit() +void wxApp::Exit() { - wxLogError(_("Fatal error: exiting")); - wxApp::CleanUp(); ::ExitToShell() ; } diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index ad2eb4d5ea..31ac4e6910 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -1226,7 +1226,7 @@ void wxApp::OnIdle(wxIdleEvent& event) wxMenuBar::MacGetCommonMenuBar()->MacInstallMenuBar(); } -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { wxMacWakeUp() ; } @@ -1289,10 +1289,8 @@ void wxApp::DeletePendingObjects() } } -void wxExit() +void wxApp::Exit() { - wxLogError(_("Fatal error: exiting")); - wxApp::CleanUp(); ::ExitToShell() ; } diff --git a/src/mgl/app.cpp b/src/mgl/app.cpp index e81251b5e7..149cd4e01c 100644 --- a/src/mgl/app.cpp +++ b/src/mgl/app.cpp @@ -45,11 +45,7 @@ wxApp *wxTheApp = NULL; wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL; -//----------------------------------------------------------------------------- -// wxExit -//----------------------------------------------------------------------------- - -void wxExit() +void wxApp::Exit() { MGL_exit(); exit(0); @@ -108,14 +104,15 @@ bool wxApp::Yield(bool onlyIfNeeded) // wxWakeUpIdle //----------------------------------------------------------------------------- -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { #if wxUSE_THREADS if (!wxThread::IsMain()) wxMutexGuiEnter(); #endif - while (wxTheApp->ProcessIdle()) {} + while (wxTheApp->ProcessIdle()) + ; #if wxUSE_THREADS if (!wxThread::IsMain()) diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 6dffbd1e12..061f4c57a5 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -161,6 +161,13 @@ void wxApp::CleanUp() delete wxLog::SetActiveTarget(NULL); } +void wxApp::Exit() +{ + wxApp::CleanUp(); + + wxAppConsole::Exit(); +} + // ============================================================================ // wxEntry* // ============================================================================ @@ -593,21 +600,6 @@ void wxApp::SetTopLevelWidget(WXDisplay* display, WXWidget widget) (*m_perDisplayData)[display].m_topLevelWidget = (Widget)widget; } -void wxExit() -{ - int retValue = 0; - if (wxTheApp) - retValue = wxTheApp->OnExit(); - - wxApp::CleanUp(); - /* - * Exit in some platform-specific way. - * Not recommended that the app calls this: - * only for emergencies. - */ - exit(retValue); -} - // Yield to other processes bool wxApp::Yield(bool onlyIfNeeded) diff --git a/src/motif/evtloop.cpp b/src/motif/evtloop.cpp index 41c575d343..f3964a17fd 100644 --- a/src/motif/evtloop.cpp +++ b/src/motif/evtloop.cpp @@ -463,7 +463,7 @@ static void wxBreakDispatch() write( idleFds[1], &dummy, 1 ); } -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { ::wxBreakDispatch(); } diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 0ece73173d..1b2e4f96ba 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -48,6 +48,7 @@ #include "wx/log.h" #endif +#include "wx/apptrait.h" #include "wx/cmdline.h" #include "wx/filename.h" #include "wx/module.h" @@ -130,7 +131,6 @@ extern void wxSetKeyboardHook(bool doIt); #endif MSG s_currentMsg; -wxApp *wxTheApp = NULL; // NB: all "NoRedraw" classes must have the same names as the "normal" classes // with NR suffix - wxWindow::MSWCreate() supposes this @@ -168,11 +168,92 @@ LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM); #endif // =========================================================================== -// implementation +// wxGUIAppTraits implementation +// =========================================================================== + +// private class which we use to pass parameters from BeforeChildWaitLoop() to +// AfterChildWaitLoop() +struct ChildWaitLoopData +{ + ChildWaitLoopData(wxWindowDisabler *wd_, wxWindow *winActive_) + { + wd = wd_; + winActive = winActive_; + } + + wxWindowDisabler *wd; + wxWindow *winActive; +}; + +void *wxGUIAppTraits::BeforeChildWaitLoop() +{ + /* + We use a dirty hack here to disable all application windows (which we + must do because otherwise the calls to wxYield() could lead to some very + unexpected reentrancies in the users code) but to avoid losing + focus/activation entirely when the child process terminates which would + happen if we simply disabled everything using wxWindowDisabler. Indeed, + remember that Windows will never activate a disabled window and when the + last childs window is closed and Windows looks for a window to activate + all our windows are still disabled. There is no way to enable them in + time because we don't know when the childs windows are going to be + closed, so the solution we use here is to keep one special tiny frame + enabled all the time. Then when the child terminates it will get + activated and when we close it below -- after reenabling all the other + windows! -- the previously active window becomes activated again and + everything is ok. + */ + wxBeginBusyCursor(); + + // first disable all existing windows + wxWindowDisabler *wd = new wxWindowDisabler; + + // then create an "invisible" frame: it has minimal size, is positioned + // (hopefully) outside the screen and doesn't appear on the taskbar + wxWindow *winActive = new wxFrame + ( + wxTheApp->GetTopWindow(), + -1, + _T(""), + wxPoint(32600, 32600), + wxSize(1, 1), + wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR + ); + winActive->Show(); + + return new ChildWaitLoopData(wd, winActive); +} + +void wxGUIAppTraits::AlwaysYield() +{ + wxYield(); +} + +void wxGUIAppTraits::AfterChildWaitLoop(void *dataOrig) +{ + wxEndBusyCursor(); + + const ChildWaitLoopData * const data = (ChildWaitLoopData *)dataOrig; + + delete data->wd; + + // finally delete the dummy frame and, as wd has been already destroyed and + // the other windows reenabled, the activation is going to return to the + // window which had had it before + data->winActive->Destroy(); +} + +bool wxGUIAppTraits::DoMessageFromThreadWait() +{ + return !wxTheApp || wxTheApp->DoMessage(); +} + +// =========================================================================== +// wxApp implementation // =========================================================================== // --------------------------------------------------------------------------- -// wxApp +// wxWin macros // --------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler) @@ -799,8 +880,6 @@ int wxEntry(WXHINSTANCE hInstance) //// Static member initialization -wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL; - wxApp::wxApp() { argc = 0; @@ -1146,6 +1225,23 @@ bool wxApp::SendIdleEvents(wxWindow* win) return needMore; } +void wxApp::WakeUpIdle() +{ + // Send the top window a dummy message so idle handler processing will + // start up again. Doing it this way ensures that the idle handler + // wakes up in the right thread (see also wxWakeUpMainThread() which does + // the same for the main app thread only) + wxWindow *topWindow = wxTheApp->GetTopWindow(); + if ( topWindow ) + { + if ( !::PostMessage(GetHwndOf(topWindow), WM_NULL, 0, 0) ) + { + // should never happen + wxLogLastError(wxT("PostMessage(WM_NULL)")); + } + } +} + void wxApp::DeletePendingObjects() { wxNode *node = wxPendingDelete.GetFirst(); @@ -1295,19 +1391,6 @@ int wxApp::GetComCtl32Version() #endif } -void wxExit() -{ - if ( wxTheApp ) - { - wxTheApp->ExitMainLoop(); - } - else - { - // what else can we do? - exit(-1); - } -} - // Yield to incoming messages bool wxApp::Yield(bool onlyIfNeeded) @@ -1375,27 +1458,6 @@ bool wxHandleFatalExceptions(bool doit) #endif } -//----------------------------------------------------------------------------- -// wxWakeUpIdle -//----------------------------------------------------------------------------- - -void wxWakeUpIdle() -{ - // Send the top window a dummy message so idle handler processing will - // start up again. Doing it this way ensures that the idle handler - // wakes up in the right thread (see also wxWakeUpMainThread() which does - // the same for the main app thread only) - wxWindow *topWindow = wxTheApp->GetTopWindow(); - if ( topWindow ) - { - if ( !::PostMessage(GetHwndOf(topWindow), WM_NULL, 0, 0) ) - { - // should never happen - wxLogLastError(wxT("PostMessage(WM_NULL)")); - } - } -} - //----------------------------------------------------------------------------- // For some reason, with MSVC++ 1.5, WinMain isn't linked in properly diff --git a/src/msw/basemsw.cpp b/src/msw/basemsw.cpp new file mode 100644 index 0000000000..6120c9e472 --- /dev/null +++ b/src/msw/basemsw.cpp @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/basemsw.cpp +// Purpose: misc stuff only used in console applications under MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.06.2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/apptrait.h" + +#include "wx/msw/private.h" + +// ============================================================================ +// wxConsoleAppTraits implementation +// ============================================================================ + +void wxConsoleAppTraits::AlwaysYield() +{ + MSG msg; + while ( ::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) + ; +} + +void *wxConsoleAppTraits::BeforeChildWaitLoop() +{ + // nothing to do here + return NULL; +} + +void wxConsoleAppTraits::AfterChildWaitLoop(void * WXUNUSED(data)) +{ + // nothing to do here +} + +bool wxConsoleAppTraits::DoMessageFromThreadWait() +{ + // nothing to process here + return true; +} + diff --git a/src/msw/fontutil.cpp b/src/msw/fontutil.cpp index 1cce639e45..5696d2a998 100644 --- a/src/msw/fontutil.cpp +++ b/src/msw/fontutil.cpp @@ -118,83 +118,10 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding, encoding = wxFont::GetDefaultEncoding(); } - switch ( encoding ) - { - // although this function is supposed to return an exact match, do do - // some mappings here for the most common case of "standard" encoding - case wxFONTENCODING_SYSTEM: - info->charset = DEFAULT_CHARSET; - break; - - case wxFONTENCODING_ISO8859_1: - case wxFONTENCODING_ISO8859_15: - case wxFONTENCODING_CP1252: - info->charset = ANSI_CHARSET; - break; - -#if !defined(__WIN16__) && !defined(__WXMICROWIN__) - - // The following four fonts are multi-byte charsets - case wxFONTENCODING_CP932: - info->charset = SHIFTJIS_CHARSET; - break; - - case wxFONTENCODING_CP936: - info->charset = GB2312_CHARSET; - break; - - case wxFONTENCODING_CP949: - info->charset = HANGUL_CHARSET; - break; - - case wxFONTENCODING_CP950: - info->charset = CHINESEBIG5_CHARSET; - break; - - // The rest are single byte encodings - case wxFONTENCODING_CP1250: - info->charset = EASTEUROPE_CHARSET; - break; - - case wxFONTENCODING_CP1251: - info->charset = RUSSIAN_CHARSET; - break; - - case wxFONTENCODING_CP1253: - info->charset = GREEK_CHARSET; - break; - - case wxFONTENCODING_CP1254: - info->charset = TURKISH_CHARSET; - break; - - case wxFONTENCODING_CP1255: - info->charset = HEBREW_CHARSET; - break; - - case wxFONTENCODING_CP1256: - info->charset = ARABIC_CHARSET; - break; - - case wxFONTENCODING_CP1257: - info->charset = BALTIC_CHARSET; - break; - - case wxFONTENCODING_CP874: - info->charset = THAI_CHARSET; - break; - - -#endif // !Win16 - - case wxFONTENCODING_CP437: - info->charset = OEM_CHARSET; - break; - - default: - // no way to translate this encoding into a Windows charset - return FALSE; - } + extern long wxEncodingToCharset(wxFontEncoding encoding); + info->charset = wxEncodingToCharset(encoding); + if ( info->charset == -1 ) + return FALSE; info->encoding = encoding; diff --git a/src/msw/main.cpp b/src/msw/main.cpp index f09bc43588..f5a6a4b22a 100644 --- a/src/msw/main.cpp +++ b/src/msw/main.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: msw/main.cpp -// Purpose: Main/DllMain +// Purpose: WinMain/DllMain // Author: Julian Smart // Modified by: // Created: 04/01/98 @@ -33,85 +33,74 @@ #include "wx/msw/private.h" -// Don't implement WinMain if we're building an MFC/wxWindows -// hybrid app. +// Don't implement WinMain if we're building an MFC/wxWindows hybrid app. #if wxUSE_MFC && !defined(NOMAIN) -#define NOMAIN 1 + #define NOMAIN 1 #endif -// from src/msw/app.cpp -extern void WXDLLEXPORT wxEntryCleanup(); +#ifdef __BORLANDC__ + // BC++ has to be special: its run-time expects the DLL entry point to be + // named DllEntryPoint instead of the (more) standard DllMain + #define DllMain DllEntryPoint +#endif + +#if defined(__WXMICROWIN__) + #define HINSTANCE HANDLE +#endif // ---------------------------------------------------------------------------- -// globals +// function prototypes // ---------------------------------------------------------------------------- -HINSTANCE wxhInstance = 0; +// from src/msw/app.cpp +extern void WXDLLEXPORT wxEntryCleanup(); // ============================================================================ -// implementation +// implementation: various entry points // ============================================================================ -// ---------------------------------------------------------------------------- -// various entry points -// ---------------------------------------------------------------------------- - // May wish not to have a DllMain or WinMain, e.g. if we're programming // a Netscape plugin or if we're writing a console application #if wxUSE_GUI && !defined(NOMAIN) -// NT defines APIENTRY, 3.x not -#if !defined(APIENTRY) - #define APIENTRY FAR PASCAL -#endif +extern "C" +{ -///////////////////////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- // WinMain +// ---------------------------------------------------------------------------- + // Note that WinMain is also defined in dummy.obj, which is linked to // an application that is using the DLL version of wxWindows. #if !defined(_WINDLL) -#if defined(__WXMICROWIN__) - #define HINSTANCE HANDLE - - extern "C" -#endif - int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - return wxEntry((WXHINSTANCE) hInstance, (WXHINSTANCE) hPrevInstance, - lpCmdLine, nCmdShow); + return wxEntry((WXHINSTANCE) hInstance, + (WXHINSTANCE) hPrevInstance, + lpCmdLine, + nCmdShow); } -#endif // !defined(_WINDLL) - -///////////////////////////////////////////////////////////////////////////////// -// DllMain - -#if defined(_WINDLL) +#else // _WINDLL // DLL entry point -extern "C" -#ifdef __BORLANDC__ -// SCD: I don't know why, but also OWL uses this function -BOOL WINAPI DllEntryPoint (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) -#else -BOOL WINAPI DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) -#endif +BOOL WINAPI +DllMain(HANDLE hModule, DWORD fdwReason, LPVOID WXUNUSED(lpReserved)) { + // Only call wxEntry if the application itself is part of the DLL. + // If only the wxWindows library is in the DLL, then the + // initialisation will be called when the application implicitly + // calls WinMain. #ifndef WXMAKINGDLL switch (fdwReason) { case DLL_PROCESS_ATTACH: - // Only call wxEntry if the application itself is part of the DLL. - // If only the wxWindows library is in the DLL, then the - // initialisation will be called when the application implicitly - // calls WinMain. return wxEntry((WXHINSTANCE) hModule); case DLL_PROCESS_DETACH: @@ -124,18 +113,24 @@ BOOL WINAPI DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) (void)hModule; (void)fdwReason; #endif // !WXMAKINGDLL - (void)lpReserved; + return TRUE; } -#endif // _WINDLL +#endif // _WINDLL/!_WINDLL + +} // extern "C" #endif // !NOMAIN // ---------------------------------------------------------------------------- -// global functions +// global HINSTANCE // ---------------------------------------------------------------------------- +#ifdef __WXBASE__ + +HINSTANCE wxhInstance = 0; + HINSTANCE wxGetInstance() { return wxhInstance; @@ -146,3 +141,5 @@ void wxSetInstance(HINSTANCE hInst) wxhInstance = hInst; } +#endif // __WXBASE__ + diff --git a/src/msw/mslu.cpp b/src/msw/mslu.cpp index d4bfce13e5..019346167b 100644 --- a/src/msw/mslu.cpp +++ b/src/msw/mslu.cpp @@ -131,6 +131,8 @@ WXDLLEXPORT int wxMSLU_GetSaveFileNameW(void *ofn) // Missing libc file manipulation functions in Win9x //------------------------------------------------------------------------ +#ifdef __WXBASE__ + WXDLLEXPORT int wxMSLU__trename(const wxChar *oldname, const wxChar *newname) { if ( wxUsingUnicowsDll() ) @@ -196,6 +198,8 @@ WXDLLEXPORT int wxMSLU__wstat(const wxChar *name, struct _stat *buffer) return _wstat(name, buffer); } -#endif +#endif // compilers having wopen() &c + +#endif // __WXBASE__ #endif // wxUSE_UNICODE_MSLU diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index df5f2f2ba7..195a2de6c7 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -26,11 +26,12 @@ #endif #ifndef WX_PRECOMP -# include "wx/wx.h" #endif #if wxUSE_THREADS +#include "wx/apptrait.h" + #include "wx/msw/private.h" #include "wx/msw/missing.h" @@ -1000,10 +1001,11 @@ wxThreadError wxThread::Delete(ExitCode *pRc) m_internal->Cancel(); } -#if wxUSE_GUI // we can't just wait for the thread to terminate because it might be // calling some GUI functions and so it will never terminate before we // process the Windows messages that result from these functions + // (note that even in console applications we might have to process + // messages if we use wxExecute() or timers or ...) DWORD result = 0; // suppress warnings from broken compilers do { @@ -1041,12 +1043,17 @@ wxThreadError wxThread::Delete(ExitCode *pRc) case WAIT_OBJECT_0 + 1: // new message arrived, process it - if ( !wxTheApp->DoMessage() ) { - // WM_QUIT received: kill the thread - Kill(); + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() + : NULL; + + if ( traits && !traits->DoMessageFromThreadWait() ) + { + // WM_QUIT received: kill the thread + Kill(); - return wxTHREAD_KILLED; + return wxTHREAD_KILLED; + } } break; @@ -1054,16 +1061,6 @@ wxThreadError wxThread::Delete(ExitCode *pRc) wxFAIL_MSG(wxT("unexpected result of MsgWaitForMultipleObject")); } } while ( result != WAIT_OBJECT_0 ); -#else // !wxUSE_GUI - // simply wait for the thread to terminate - // - // OTOH, even console apps create windows (in wxExecute, for WinSock - // &c), so may be use MsgWaitForMultipleObject() too here? - if ( WaitForSingleObject(hThread, INFINITE) != WAIT_OBJECT_0 ) - { - wxFAIL_MSG(wxT("unexpected result of WaitForSingleObject")); - } -#endif // wxUSE_GUI/!wxUSE_GUI if ( IsMain() ) { diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index dc8b9f8c31..ab861dff71 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ -// #pragma implementation "utils.h" // Note: this is done in utilscmn.cpp now. -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -33,9 +29,6 @@ #include "wx/app.h" #include "wx/intl.h" #include "wx/log.h" -#if wxUSE_GUI - #include "wx/cursor.h" -#endif #endif //WX_PRECOMP #include "wx/msw/private.h" // includes @@ -94,32 +87,6 @@ #endif #endif -//// BEGIN for console support: VC++ only -#ifdef __VISUALC__ - -#include "wx/msw/msvcrt.h" - -#include - -#include "wx/ioswrap.h" - -/* Need to undef new if including crtdbg.h */ -# ifdef new -# undef new -# endif - -#ifndef __WIN16__ -# include -#endif - -# if defined(__WXDEBUG__) && wxUSE_GLOBAL_MEMORY_OPERATORS && wxUSE_DEBUG_NEW_ALWAYS -# define new new(__TFILE__,__LINE__) -# endif - -#endif - // __VISUALC__ -/// END for console support - // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -134,8 +101,6 @@ static const wxChar eHOSTNAME[] = wxT("HostName"); static const wxChar eUSERID[] = wxT("UserId"); #endif // !Win32 -#ifndef __WXMICROWIN__ - // ============================================================================ // implementation // ============================================================================ @@ -1073,77 +1038,6 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn) // sleep functions // ---------------------------------------------------------------------------- -#if wxUSE_GUI - -#if wxUSE_TIMER - -// Sleep for nSecs seconds. Attempt a Windows implementation using timers. -static bool gs_inTimer = FALSE; - -class wxSleepTimer : public wxTimer -{ -public: - virtual void Notify() - { - gs_inTimer = FALSE; - Stop(); - } -}; - -static wxTimer *wxTheSleepTimer = NULL; - -void wxUsleep(unsigned long milliseconds) -{ -#ifdef __WIN32__ - ::Sleep(milliseconds); -#else // !Win32 - if (gs_inTimer) - return; - if (miliseconds <= 0) - return; - - wxTheSleepTimer = new wxSleepTimer; - gs_inTimer = TRUE; - wxTheSleepTimer->Start(milliseconds); - while (gs_inTimer) - { - if (wxTheApp->Pending()) - wxTheApp->Dispatch(); - } - delete wxTheSleepTimer; - wxTheSleepTimer = NULL; -#endif // Win32/!Win32 -} - -void wxSleep(int nSecs) -{ - if (gs_inTimer) - return; - if (nSecs <= 0) - return; - - wxTheSleepTimer = new wxSleepTimer; - gs_inTimer = TRUE; - wxTheSleepTimer->Start(nSecs*1000); - while (gs_inTimer) - { - if (wxTheApp->Pending()) - wxTheApp->Dispatch(); - } - delete wxTheSleepTimer; - wxTheSleepTimer = NULL; -} - -// Consume all events until no more left -void wxFlushEvents() -{ -// wxYield(); -} - -#endif // wxUSE_TIMER - -#elif defined(__WIN32__) // wxUSE_GUI - void wxUsleep(unsigned long milliseconds) { ::Sleep(milliseconds); @@ -1154,497 +1048,90 @@ void wxSleep(int nSecs) wxUsleep(1000*nSecs); } -#endif // wxUSE_GUI/!wxUSE_GUI -#endif // __WXMICROWIN__ - // ---------------------------------------------------------------------------- -// deprecated (in favour of wxLog) log functions +// font encoding <-> Win32 codepage conversion functions // ---------------------------------------------------------------------------- -#if WXWIN_COMPATIBILITY_2_2 - -// Output a debug mess., in a system dependent fashion. -#ifndef __WXMICROWIN__ -void wxDebugMsg(const wxChar *fmt ...) -{ - va_list ap; - static wxChar buffer[512]; - - if (!wxTheApp->GetWantDebugOutput()) - return; - - va_start(ap, fmt); - - wvsprintf(buffer,fmt,ap); - OutputDebugString((LPCTSTR)buffer); - - va_end(ap); -} - -// Non-fatal error: pop up message box and (possibly) continue -void wxError(const wxString& msg, const wxString& title) +extern long wxEncodingToCharset(wxFontEncoding encoding) { - wxSprintf(wxBuffer, wxT("%s\nContinue?"), WXSTRINGCAST msg); - if (MessageBox(NULL, (LPCTSTR)wxBuffer, (LPCTSTR)WXSTRINGCAST title, - MB_ICONSTOP | MB_YESNO) == IDNO) - wxExit(); -} - -// Fatal error: pop up message box and abort -void wxFatalError(const wxString& msg, const wxString& title) -{ - wxSprintf(wxBuffer, wxT("%s: %s"), WXSTRINGCAST title, WXSTRINGCAST msg); - FatalAppExit(0, (LPCTSTR)wxBuffer); -} -#endif // __WXMICROWIN__ - -#endif // WXWIN_COMPATIBILITY_2_2 - -#if wxUSE_GUI - -// ---------------------------------------------------------------------------- -// functions to work with .INI files -// ---------------------------------------------------------------------------- - -// Reading and writing resources (eg WIN.INI, .Xdefaults) -#if wxUSE_RESOURCES -bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file) -{ - if (file != wxT("")) -// Don't know what the correct cast should be, but it doesn't -// compile in BC++/16-bit without this cast. -#if !defined(__WIN32__) - return (WritePrivateProfileString((const char*) section, (const char*) entry, (const char*) value, (const char*) file) != 0); -#else - return (WritePrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)value, (LPCTSTR)WXSTRINGCAST file) != 0); -#endif - else - return (WriteProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)WXSTRINGCAST value) != 0); -} - -bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file) -{ - wxString buf; - buf.Printf(wxT("%.4f"), value); - - return wxWriteResource(section, entry, buf, file); -} - -bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file) -{ - wxString buf; - buf.Printf(wxT("%ld"), value); - - return wxWriteResource(section, entry, buf, file); -} - -bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file) -{ - wxString buf; - buf.Printf(wxT("%d"), value); - - return wxWriteResource(section, entry, buf, file); -} - -bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file) -{ - static const wxChar defunkt[] = wxT("$$default"); - if (file != wxT("")) - { - int n = GetPrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt, - (LPTSTR)wxBuffer, 1000, (LPCTSTR)WXSTRINGCAST file); - if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) - return FALSE; - } - else + switch ( encoding ) { - int n = GetProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt, - (LPTSTR)wxBuffer, 1000); - if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) - return FALSE; - } - if (*value) delete[] (*value); - *value = copystring(wxBuffer); - return TRUE; -} + // although this function is supposed to return an exact match, do do + // some mappings here for the most common case of "standard" encoding + case wxFONTENCODING_SYSTEM: + return DEFAULT_CHARSET; -bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file) -{ - wxChar *s = NULL; - bool succ = wxGetResource(section, entry, (wxChar **)&s, file); - if (succ) - { - *value = (float)wxStrtod(s, NULL); - delete[] s; - return TRUE; - } - else return FALSE; -} + case wxFONTENCODING_ISO8859_1: + case wxFONTENCODING_ISO8859_15: + case wxFONTENCODING_CP1252: + return ANSI_CHARSET; -bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file) -{ - wxChar *s = NULL; - bool succ = wxGetResource(section, entry, (wxChar **)&s, file); - if (succ) - { - *value = wxStrtol(s, NULL, 10); - delete[] s; - return TRUE; - } - else return FALSE; -} +#if !defined(__WXMICROWIN__) + // The following four fonts are multi-byte charsets + case wxFONTENCODING_CP932: + return SHIFTJIS_CHARSET; -bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file) -{ - wxChar *s = NULL; - bool succ = wxGetResource(section, entry, (wxChar **)&s, file); - if (succ) - { - *value = (int)wxStrtol(s, NULL, 10); - delete[] s; - return TRUE; - } - else return FALSE; -} -#endif // wxUSE_RESOURCES + case wxFONTENCODING_CP936: + return GB2312_CHARSET; -// --------------------------------------------------------------------------- -// helper functions for showing a "busy" cursor -// --------------------------------------------------------------------------- + case wxFONTENCODING_CP949: + return HANGUL_CHARSET; -static HCURSOR gs_wxBusyCursor = 0; // new, busy cursor -static HCURSOR gs_wxBusyCursorOld = 0; // old cursor -static int gs_wxBusyCursorCount = 0; + case wxFONTENCODING_CP950: + return CHINESEBIG5_CHARSET; -extern HCURSOR wxGetCurrentBusyCursor() -{ - return gs_wxBusyCursor; -} + // The rest are single byte encodings + case wxFONTENCODING_CP1250: + return EASTEUROPE_CHARSET; -// Set the cursor to the busy cursor for all windows -void wxBeginBusyCursor(wxCursor *cursor) -{ - if ( gs_wxBusyCursorCount++ == 0 ) - { - gs_wxBusyCursor = (HCURSOR)cursor->GetHCURSOR(); -#ifndef __WXMICROWIN__ - gs_wxBusyCursorOld = ::SetCursor(gs_wxBusyCursor); -#endif - } - //else: nothing to do, already set -} + case wxFONTENCODING_CP1251: + return RUSSIAN_CHARSET; -// Restore cursor to normal -void wxEndBusyCursor() -{ - wxCHECK_RET( gs_wxBusyCursorCount > 0, - wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); + case wxFONTENCODING_CP1253: + return GREEK_CHARSET; - if ( --gs_wxBusyCursorCount == 0 ) - { -#ifndef __WXMICROWIN__ - ::SetCursor(gs_wxBusyCursorOld); -#endif - gs_wxBusyCursorOld = 0; - } -} + case wxFONTENCODING_CP1254: + return TURKISH_CHARSET; -// TRUE if we're between the above two calls -bool wxIsBusy() -{ - return gs_wxBusyCursorCount > 0; -} + case wxFONTENCODING_CP1255: + return HEBREW_CHARSET; -// Check whether this window wants to process messages, e.g. Stop button -// in long calculations. -bool wxCheckForInterrupt(wxWindow *wnd) -{ - wxCHECK( wnd, FALSE ); + case wxFONTENCODING_CP1256: + return ARABIC_CHARSET; - MSG msg; - while ( ::PeekMessage(&msg, GetHwndOf(wnd), 0, 0, PM_REMOVE) ) - { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } + case wxFONTENCODING_CP1257: + return BALTIC_CHARSET; - return TRUE; -} - -// MSW only: get user-defined resource from the .res file. -// Returns NULL or newly-allocated memory, so use delete[] to clean up. - -#ifndef __WXMICROWIN__ -wxChar *wxLoadUserResource(const wxString& resourceName, const wxString& resourceType) -{ - HRSRC hResource = ::FindResource(wxGetInstance(), resourceName, resourceType); - if ( hResource == 0 ) - return NULL; - - HGLOBAL hData = ::LoadResource(wxGetInstance(), hResource); - if ( hData == 0 ) - return NULL; - - wxChar *theText = (wxChar *)::LockResource(hData); - if ( !theText ) - return NULL; - - // Not all compilers put a zero at the end of the resource (e.g. BC++ doesn't). - // so we need to find the length of the resource. - int len = ::SizeofResource(wxGetInstance(), hResource); - wxChar *s = new wxChar[len+1]; - wxStrncpy(s,theText,len); - s[len]=0; - - // wxChar *s = copystring(theText); - - // Obsolete in WIN32 -#ifndef __WIN32__ - UnlockResource(hData); -#endif - - // No need?? - // GlobalFree(hData); - - return s; -} -#endif // __WXMICROWIN__ - -// ---------------------------------------------------------------------------- -// get display info -// ---------------------------------------------------------------------------- - -// See also the wxGetMousePosition in window.cpp -// Deprecated: use wxPoint wxGetMousePosition() instead -void wxGetMousePosition( int* x, int* y ) -{ - POINT pt; - GetCursorPos( & pt ); - if ( x ) *x = pt.x; - if ( y ) *y = pt.y; -}; - -// Return TRUE if we have a colour display -bool wxColourDisplay() -{ -#ifdef __WXMICROWIN__ - // MICROWIN_TODO - return TRUE; -#else - // this function is called from wxDC ctor so it is called a *lot* of times - // hence we optimize it a bit but doign the check only once - // - // this should be MT safe as only the GUI thread (holding the GUI mutex) - // can call us - static int s_isColour = -1; - - if ( s_isColour == -1 ) - { - ScreenHDC dc; - int noCols = ::GetDeviceCaps(dc, NUMCOLORS); - - s_isColour = (noCols == -1) || (noCols > 2); - } - - return s_isColour != 0; -#endif -} - -// Returns depth of screen -int wxDisplayDepth() -{ - ScreenHDC dc; - return GetDeviceCaps(dc, PLANES) * GetDeviceCaps(dc, BITSPIXEL); -} - -// Get size of display -void wxDisplaySize(int *width, int *height) -{ -#ifdef __WXMICROWIN__ - RECT rect; - HWND hWnd = GetDesktopWindow(); - ::GetWindowRect(hWnd, & rect); - - if ( width ) - *width = rect.right - rect.left; - if ( height ) - *height = rect.bottom - rect.top; -#else // !__WXMICROWIN__ - ScreenHDC dc; - - if ( width ) - *width = ::GetDeviceCaps(dc, HORZRES); - if ( height ) - *height = ::GetDeviceCaps(dc, VERTRES); -#endif // __WXMICROWIN__/!__WXMICROWIN__ -} - -void wxDisplaySizeMM(int *width, int *height) -{ -#ifdef __WXMICROWIN__ - // MICROWIN_TODO - if ( width ) - *width = 0; - if ( height ) - *height = 0; -#else - ScreenHDC dc; - - if ( width ) - *width = ::GetDeviceCaps(dc, HORZSIZE); - if ( height ) - *height = ::GetDeviceCaps(dc, VERTSIZE); -#endif -} - -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ -#if defined(__WIN16__) || defined(__WXMICROWIN__) - *x = 0; *y = 0; - wxDisplaySize(width, height); -#else - // Determine the desktop dimensions minus the taskbar and any other - // special decorations... - RECT r; - - SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); - if (x) *x = r.left; - if (y) *y = r.top; - if (width) *width = r.right - r.left; - if (height) *height = r.bottom - r.top; -#endif -} - -// --------------------------------------------------------------------------- -// window information functions -// --------------------------------------------------------------------------- - -wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd) -{ - wxString str; - - if ( hWnd ) - { - int len = GetWindowTextLength((HWND)hWnd) + 1; - ::GetWindowText((HWND)hWnd, str.GetWriteBuf(len), len); - str.UngetWriteBuf(); - } - - return str; -} - -wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd) -{ - wxString str; - - // MICROWIN_TODO -#ifndef __WXMICROWIN__ - if ( hWnd ) - { - int len = 256; // some starting value - - for ( ;; ) - { - int count = ::GetClassName((HWND)hWnd, str.GetWriteBuf(len), len); - - str.UngetWriteBuf(); - if ( count == len ) - { - // the class name might have been truncated, retry with larger - // buffer - len *= 2; - } - else - { - break; - } - } - } + case wxFONTENCODING_CP874: + return THAI_CHARSET; #endif // !__WXMICROWIN__ - return str; -} - -WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd) -{ -#ifndef __WIN32__ - return (WXWORD)GetWindowWord((HWND)hWnd, GWW_ID); -#else // Win32 - return (WXWORD)GetWindowLong((HWND)hWnd, GWL_ID); -#endif // Win16/32 -} - -// ---------------------------------------------------------------------------- -// Metafile helpers -// ---------------------------------------------------------------------------- - -extern void PixelToHIMETRIC(LONG *x, LONG *y) -{ - ScreenHDC hdcRef; - - int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE), - iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE), - iWidthPels = GetDeviceCaps(hdcRef, HORZRES), - iHeightPels = GetDeviceCaps(hdcRef, VERTRES); - - *x *= (iWidthMM * 100); - *x /= iWidthPels; - *y *= (iHeightMM * 100); - *y /= iHeightPels; -} - -extern void HIMETRICToPixel(LONG *x, LONG *y) -{ - ScreenHDC hdcRef; - - int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE), - iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE), - iWidthPels = GetDeviceCaps(hdcRef, HORZRES), - iHeightPels = GetDeviceCaps(hdcRef, VERTRES); - - *x *= iWidthPels; - *x /= (iWidthMM * 100); - *y *= iHeightPels; - *y /= (iHeightMM * 100); -} - -#endif // wxUSE_GUI + case wxFONTENCODING_CP437: + return OEM_CHARSET; + } -#ifdef __WXMICROWIN__ -int wxGetOsVersion(int *majorVsn, int *minorVsn) -{ - // MICROWIN_TODO - if (majorVsn) *majorVsn = 0; - if (minorVsn) *minorVsn = 0; - return wxUNIX; + // no way to translate this encoding into a Windows charset + return -1; } -#endif // __WXMICROWIN__ - -// ---------------------------------------------------------------------------- -// Win32 codepage conversion functions -// ---------------------------------------------------------------------------- - -#if defined(__WIN32__) && !defined(__WXMICROWIN__) -// wxGetNativeFontEncoding() doesn't exist neither in wxBase nor in wxUniv -#if wxUSE_GUI && !defined(__WXUNIVERSAL__) +// we have 2 versions of wxCharsetToCodepage(): the old one which directly +// looks up the vlaues in the registry and the new one which is more +// politically correct and has more chances to work on other Windows versions +// as well but the old version is still needed for !wxUSE_FONTMAP case +#if wxUSE_FONTMAP #include "wx/fontmap.h" -// VZ: the new version of wxCharsetToCodepage() is more politically correct -// and should work on other Windows versions as well but the old version is -// still needed for !wxUSE_FONTMAP || !wxUSE_GUI case - extern long wxEncodingToCodepage(wxFontEncoding encoding) { // translate encoding into the Windows CHARSET - wxNativeEncodingInfo natveEncInfo; - if ( !wxGetNativeFontEncoding(encoding, &natveEncInfo) ) + long charset = wxEncodingToCharset(encoding); + if ( charset == -1 ) return -1; // translate CHARSET to code page CHARSETINFO csetInfo; - if ( !::TranslateCharsetInfo((DWORD *)(DWORD)natveEncInfo.charset, + if ( !::TranslateCharsetInfo((DWORD *)(DWORD)charset, &csetInfo, TCI_SRCCHARSET) ) { @@ -1656,8 +1143,6 @@ extern long wxEncodingToCodepage(wxFontEncoding encoding) return csetInfo.ciACP; } -#if wxUSE_FONTMAP - extern long wxCharsetToCodepage(const wxChar *name) { // first get the font encoding for this charset @@ -1672,12 +1157,7 @@ extern long wxCharsetToCodepage(const wxChar *name) return wxEncodingToCodepage(enc); } -#endif // wxUSE_FONTMAP - -#endif // wxUSE_GUI - -// include old wxCharsetToCodepage() by OK if needed -#if !wxUSE_GUI || !wxUSE_FONTMAP +#else // !wxUSE_FONTMAP #include "wx/msw/registry.h" @@ -1687,15 +1167,18 @@ extern long wxCharsetToCodepage(const wxChar *name) if (!name) return GetACP(); - long CP=-1; + long CP = -1; + wxString path(wxT("MIME\\Database\\Charset\\")); wxString cn(name); - do { - wxString path(wxT("MIME\\Database\\Charset\\")); - path += cn; - wxRegKey key(wxRegKey::HKCR, path); - if (!key.Exists()) break; + // follow the alias loop + for ( ;; ) + { + wxRegKey key(wxRegKey::HKCR, path + cn); + + if (!key.Exists()) + break; // two cases: either there's an AliasForCharset string, // or there are Codepage and InternetEncoding dwords. @@ -1703,17 +1186,17 @@ extern long wxCharsetToCodepage(const wxChar *name) // the Codepage just says which Windows character set to // use when displaying the data. if (key.HasValue(wxT("InternetEncoding")) && - key.QueryValue(wxT("InternetEncoding"), &CP)) break; + key.QueryValue(wxT("InternetEncoding"), &CP)) + break; // no encoding, see if it's an alias if (!key.HasValue(wxT("AliasForCharset")) || - !key.QueryValue(wxT("AliasForCharset"), cn)) break; - } while (1); + !key.QueryValue(wxT("AliasForCharset"), cn)) + break; + } return CP; } -#endif // !wxUSE_GUI || !wxUSE_FONTMAP - -#endif // Win32 +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index 79f509782d..d42b1a4838 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -33,9 +33,6 @@ #include "wx/app.h" #include "wx/intl.h" #include "wx/log.h" - #if wxUSE_GUI // See 'dirty hack' below. - #include "wx/frame.h" - #endif #endif #ifdef __WIN32__ @@ -43,6 +40,8 @@ #include "wx/process.h" #endif +#include "wx/apptrait.h" + #include "wx/msw/private.h" #include @@ -594,8 +593,6 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) command = cmd; } -#if defined(__WIN32__) - // the IO redirection is only supported with wxUSE_STREAMS BOOL redirect = FALSE; @@ -854,100 +851,35 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) return pi.dwProcessId; } + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + wxCHECK_MSG( traits, -1, _T("no wxAppTraits in wxExecute()?") ); + // disable all app windows while waiting for the child process to finish -#if wxUSE_GUI - - /* - We use a dirty hack here to disable all application windows (which we - must do because otherwise the calls to wxYield() could lead to some very - unexpected reentrancies in the users code) but to avoid losing - focus/activation entirely when the child process terminates which would - happen if we simply disabled everything using wxWindowDisabler. Indeed, - remember that Windows will never activate a disabled window and when the - last childs window is closed and Windows looks for a window to activate - all our windows are still disabled. There is no way to enable them in - time because we don't know when the childs windows are going to be - closed, so the solution we use here is to keep one special tiny frame - enabled all the time. Then when the child terminates it will get - activated and when we close it below -- after reenabling all the other - windows! -- the previously active window becomes activated again and - everything is ok. - */ - wxWindow *winActive; - { - wxBusyCursor bc; - - // first disable all existing windows - wxWindowDisabler wd; - - // then create an "invisible" frame: it has minimal size, is positioned - // (hopefully) outside the screen and doesn't appear on the taskbar - winActive = new wxFrame - ( - wxTheApp->GetTopWindow(), - -1, - _T(""), - wxPoint(32600, 32600), - wxSize(1, 1), - wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR - ); - winActive->Show(); -#endif // wxUSE_GUI - - // wait until the child process terminates - while ( data->state ) - { + void *cookie = traits->BeforeChildWaitLoop(); + + // wait until the child process terminates + while ( data->state ) + { #if wxUSE_STREAMS - bufOut.Update(); - bufErr.Update(); + bufOut.Update(); + bufErr.Update(); #endif // wxUSE_STREAMS - // don't eat 100% of the CPU -- ugly but anything else requires - // real async IO which we don't have for the moment - ::Sleep(50); - -#if wxUSE_GUI - // repaint the GUI - wxYield(); -#else // !GUI - // dispatch the messages to the hidden window so that it could - // process the wxWM_PROC_TERMINATED notification - MSG msg; - ::PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE); -#endif // GUI/!GUI - } + // don't eat 100% of the CPU -- ugly but anything else requires + // real async IO which we don't have for the moment + ::Sleep(50); -#if wxUSE_GUI + // we must process messages or we'd never get wxWM_PROC_TERMINATED + traits->AlwaysYield(); } - // finally delete the dummy frame and, as wd has been already destroyed and - // the other windows reenabled, the activation is going to return to the - // window which had it before - winActive->Destroy(); -#endif // wxUSE_GUI + traits->AfterChildWaitLoop(cookie); DWORD dwExitCode = data->dwExitCode; delete data; // return the exit code return dwExitCode; -#else // Win16 - long instanceID = WinExec((LPCSTR) WXSTRINGCAST command, SW_SHOW); - if (instanceID < 32) - return flags & wxEXEC_SYNC ? -1 : 0; - - if ( flags & wxEXEC_SYNC ) - { - int running; - do - { - wxYield(); - running = GetModuleUsage((HINSTANCE)instanceID); - } while (running); - } - - return instanceID; -#endif // Win16/32 } long wxExecute(wxChar **argv, int flags, wxProcess *handler) diff --git a/src/msw/utilsgui.cpp b/src/msw/utilsgui.cpp new file mode 100644 index 0000000000..c009e4eebd --- /dev/null +++ b/src/msw/utilsgui.cpp @@ -0,0 +1,444 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/utilsgui.cpp +// Purpose: Various utility functions only available in GUI +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 (extracted from msw/utils.cpp) +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/cursor.h" + #include "wx/utils.h" +#endif //WX_PRECOMP + +#include "wx/msw/private.h" // includes + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// functions to work with .INI files +// ---------------------------------------------------------------------------- + +// Reading and writing resources (eg WIN.INI, .Xdefaults) +#if wxUSE_RESOURCES +bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file) +{ + if (file != wxT("")) +// Don't know what the correct cast should be, but it doesn't +// compile in BC++/16-bit without this cast. +#if !defined(__WIN32__) + return (WritePrivateProfileString((const char*) section, (const char*) entry, (const char*) value, (const char*) file) != 0); +#else + return (WritePrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)value, (LPCTSTR)WXSTRINGCAST file) != 0); +#endif + else + return (WriteProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)WXSTRINGCAST value) != 0); +} + +bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file) +{ + wxString buf; + buf.Printf(wxT("%.4f"), value); + + return wxWriteResource(section, entry, buf, file); +} + +bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file) +{ + wxString buf; + buf.Printf(wxT("%ld"), value); + + return wxWriteResource(section, entry, buf, file); +} + +bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file) +{ + wxString buf; + buf.Printf(wxT("%d"), value); + + return wxWriteResource(section, entry, buf, file); +} + +bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file) +{ + static const wxChar defunkt[] = wxT("$$default"); + if (file != wxT("")) + { + int n = GetPrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt, + (LPTSTR)wxBuffer, 1000, (LPCTSTR)WXSTRINGCAST file); + if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) + return FALSE; + } + else + { + int n = GetProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt, + (LPTSTR)wxBuffer, 1000); + if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) + return FALSE; + } + if (*value) delete[] (*value); + *value = copystring(wxBuffer); + return TRUE; +} + +bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file) +{ + wxChar *s = NULL; + bool succ = wxGetResource(section, entry, (wxChar **)&s, file); + if (succ) + { + *value = (float)wxStrtod(s, NULL); + delete[] s; + return TRUE; + } + else return FALSE; +} + +bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file) +{ + wxChar *s = NULL; + bool succ = wxGetResource(section, entry, (wxChar **)&s, file); + if (succ) + { + *value = wxStrtol(s, NULL, 10); + delete[] s; + return TRUE; + } + else return FALSE; +} + +bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file) +{ + wxChar *s = NULL; + bool succ = wxGetResource(section, entry, (wxChar **)&s, file); + if (succ) + { + *value = (int)wxStrtol(s, NULL, 10); + delete[] s; + return TRUE; + } + else return FALSE; +} +#endif // wxUSE_RESOURCES + +// --------------------------------------------------------------------------- +// helper functions for showing a "busy" cursor +// --------------------------------------------------------------------------- + +static HCURSOR gs_wxBusyCursor = 0; // new, busy cursor +static HCURSOR gs_wxBusyCursorOld = 0; // old cursor +static int gs_wxBusyCursorCount = 0; + +extern HCURSOR wxGetCurrentBusyCursor() +{ + return gs_wxBusyCursor; +} + +// Set the cursor to the busy cursor for all windows +void wxBeginBusyCursor(wxCursor *cursor) +{ + if ( gs_wxBusyCursorCount++ == 0 ) + { + gs_wxBusyCursor = (HCURSOR)cursor->GetHCURSOR(); +#ifndef __WXMICROWIN__ + gs_wxBusyCursorOld = ::SetCursor(gs_wxBusyCursor); +#endif + } + //else: nothing to do, already set +} + +// Restore cursor to normal +void wxEndBusyCursor() +{ + wxCHECK_RET( gs_wxBusyCursorCount > 0, + wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); + + if ( --gs_wxBusyCursorCount == 0 ) + { +#ifndef __WXMICROWIN__ + ::SetCursor(gs_wxBusyCursorOld); +#endif + gs_wxBusyCursorOld = 0; + } +} + +// TRUE if we're between the above two calls +bool wxIsBusy() +{ + return gs_wxBusyCursorCount > 0; +} + +// Check whether this window wants to process messages, e.g. Stop button +// in long calculations. +bool wxCheckForInterrupt(wxWindow *wnd) +{ + wxCHECK( wnd, FALSE ); + + MSG msg; + while ( ::PeekMessage(&msg, GetHwndOf(wnd), 0, 0, PM_REMOVE) ) + { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + return TRUE; +} + +// MSW only: get user-defined resource from the .res file. +// Returns NULL or newly-allocated memory, so use delete[] to clean up. + +#ifndef __WXMICROWIN__ +wxChar *wxLoadUserResource(const wxString& resourceName, const wxString& resourceType) +{ + HRSRC hResource = ::FindResource(wxGetInstance(), resourceName, resourceType); + if ( hResource == 0 ) + return NULL; + + HGLOBAL hData = ::LoadResource(wxGetInstance(), hResource); + if ( hData == 0 ) + return NULL; + + wxChar *theText = (wxChar *)::LockResource(hData); + if ( !theText ) + return NULL; + + // Not all compilers put a zero at the end of the resource (e.g. BC++ doesn't). + // so we need to find the length of the resource. + int len = ::SizeofResource(wxGetInstance(), hResource); + wxChar *s = new wxChar[len+1]; + wxStrncpy(s,theText,len); + s[len]=0; + + // wxChar *s = copystring(theText); + + // Obsolete in WIN32 +#ifndef __WIN32__ + UnlockResource(hData); +#endif + + // No need?? + // GlobalFree(hData); + + return s; +} +#endif // __WXMICROWIN__ + +// ---------------------------------------------------------------------------- +// get display info +// ---------------------------------------------------------------------------- + +// See also the wxGetMousePosition in window.cpp +// Deprecated: use wxPoint wxGetMousePosition() instead +void wxGetMousePosition( int* x, int* y ) +{ + POINT pt; + GetCursorPos( & pt ); + if ( x ) *x = pt.x; + if ( y ) *y = pt.y; +}; + +// Return TRUE if we have a colour display +bool wxColourDisplay() +{ +#ifdef __WXMICROWIN__ + // MICROWIN_TODO + return TRUE; +#else + // this function is called from wxDC ctor so it is called a *lot* of times + // hence we optimize it a bit but doign the check only once + // + // this should be MT safe as only the GUI thread (holding the GUI mutex) + // can call us + static int s_isColour = -1; + + if ( s_isColour == -1 ) + { + ScreenHDC dc; + int noCols = ::GetDeviceCaps(dc, NUMCOLORS); + + s_isColour = (noCols == -1) || (noCols > 2); + } + + return s_isColour != 0; +#endif +} + +// Returns depth of screen +int wxDisplayDepth() +{ + ScreenHDC dc; + return GetDeviceCaps(dc, PLANES) * GetDeviceCaps(dc, BITSPIXEL); +} + +// Get size of display +void wxDisplaySize(int *width, int *height) +{ +#ifdef __WXMICROWIN__ + RECT rect; + HWND hWnd = GetDesktopWindow(); + ::GetWindowRect(hWnd, & rect); + + if ( width ) + *width = rect.right - rect.left; + if ( height ) + *height = rect.bottom - rect.top; +#else // !__WXMICROWIN__ + ScreenHDC dc; + + if ( width ) + *width = ::GetDeviceCaps(dc, HORZRES); + if ( height ) + *height = ::GetDeviceCaps(dc, VERTRES); +#endif // __WXMICROWIN__/!__WXMICROWIN__ +} + +void wxDisplaySizeMM(int *width, int *height) +{ +#ifdef __WXMICROWIN__ + // MICROWIN_TODO + if ( width ) + *width = 0; + if ( height ) + *height = 0; +#else + ScreenHDC dc; + + if ( width ) + *width = ::GetDeviceCaps(dc, HORZSIZE); + if ( height ) + *height = ::GetDeviceCaps(dc, VERTSIZE); +#endif +} + +void wxClientDisplayRect(int *x, int *y, int *width, int *height) +{ +#if defined(__WIN16__) || defined(__WXMICROWIN__) + *x = 0; *y = 0; + wxDisplaySize(width, height); +#else + // Determine the desktop dimensions minus the taskbar and any other + // special decorations... + RECT r; + + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + if (x) *x = r.left; + if (y) *y = r.top; + if (width) *width = r.right - r.left; + if (height) *height = r.bottom - r.top; +#endif +} + +// --------------------------------------------------------------------------- +// window information functions +// --------------------------------------------------------------------------- + +wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd) +{ + wxString str; + + if ( hWnd ) + { + int len = GetWindowTextLength((HWND)hWnd) + 1; + ::GetWindowText((HWND)hWnd, str.GetWriteBuf(len), len); + str.UngetWriteBuf(); + } + + return str; +} + +wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd) +{ + wxString str; + + // MICROWIN_TODO +#ifndef __WXMICROWIN__ + if ( hWnd ) + { + int len = 256; // some starting value + + for ( ;; ) + { + int count = ::GetClassName((HWND)hWnd, str.GetWriteBuf(len), len); + + str.UngetWriteBuf(); + if ( count == len ) + { + // the class name might have been truncated, retry with larger + // buffer + len *= 2; + } + else + { + break; + } + } + } +#endif // !__WXMICROWIN__ + + return str; +} + +WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd) +{ +#ifndef __WIN32__ + return (WXWORD)GetWindowWord((HWND)hWnd, GWW_ID); +#else // Win32 + return (WXWORD)GetWindowLong((HWND)hWnd, GWL_ID); +#endif // Win16/32 +} + +// ---------------------------------------------------------------------------- +// Metafile helpers +// ---------------------------------------------------------------------------- + +extern void PixelToHIMETRIC(LONG *x, LONG *y) +{ + ScreenHDC hdcRef; + + int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE), + iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE), + iWidthPels = GetDeviceCaps(hdcRef, HORZRES), + iHeightPels = GetDeviceCaps(hdcRef, VERTRES); + + *x *= (iWidthMM * 100); + *x /= iWidthPels; + *y *= (iHeightMM * 100); + *y /= iHeightPels; +} + +extern void HIMETRICToPixel(LONG *x, LONG *y) +{ + ScreenHDC hdcRef; + + int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE), + iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE), + iWidthPels = GetDeviceCaps(hdcRef, HORZRES), + iHeightPels = GetDeviceCaps(hdcRef, VERTRES); + + *x *= iWidthPels; + *x /= (iWidthMM * 100); + *y *= iHeightPels; + *y /= (iHeightMM * 100); +} + + diff --git a/src/msw/volume.cpp b/src/msw/volume.cpp index 6b90beabb3..9cfda8856f 100644 --- a/src/msw/volume.cpp +++ b/src/msw/volume.cpp @@ -42,46 +42,9 @@ #include "wx/volume.h" #include +#include "wx/msw/missing.h" -#ifndef SHGetFileInfo -#ifdef UNICODE -#define SHGetFileInfo SHGetFileInfoW -#else -#define SHGetFileInfo SHGetFileInfoA -#endif -#endif - -#ifndef SHGFI_ATTRIBUTES - #define SHGFI_ATTRIBUTES 2048 -#endif - -#ifndef SFGAO_READONLY - #define SFGAO_READONLY 0x00040000L -#endif - -#ifndef SFGAO_REMOVABLE - #define SFGAO_REMOVABLE 0x02000000L -#endif - -#ifndef SHGFI_DISPLAYNAME - #define SHGFI_DISPLAYNAME 512 -#endif - -#ifndef SHGFI_ICON - #define SHGFI_ICON 256 -#endif - -#ifndef SHGFI_SMALLICON - #define SHGFI_SMALLICON 1 -#endif - -#ifndef SHGFI_SHELLICONSIZE - #define SHGFI_SHELLICONSIZE 4 -#endif - -#ifndef SHGFI_OPENICON - #define SHGFI_OPENICON 2 -#endif +#ifdef __WXBASE__ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Dynamic library function defs. @@ -128,14 +91,6 @@ static FileInfoMap& GetFileInfoMap() } #define s_fileInfo (GetFileInfoMap()) -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// Other initialization. -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#if wxUSE_GUI -// already in wx/iconbndl.h -// WX_DEFINE_OBJARRAY(wxIconArray); -#endif - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Local helper functions. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -421,7 +376,7 @@ static bool BuildRemoteList(wxArrayString& list, NETRESOURCE* pResSrc, // Purpose: Generate and return a list of all volumes (drives) available. // Notes: //============================================================================= -wxArrayString wxFSVolume::GetVolumes(int flagsSet, int flagsUnset) +wxArrayString wxFSVolumeBase::GetVolumes(int flagsSet, int flagsUnset) { InterlockedExchange(&s_cancelSearch, FALSE); // reset @@ -490,7 +445,7 @@ wxArrayString wxFSVolume::GetVolumes(int flagsSet, int flagsUnset) // performing the search. This is the only thread-safe function // provided by the class. //============================================================================= -void wxFSVolume::CancelSearch() +void wxFSVolumeBase::CancelSearch() { InterlockedExchange(&s_cancelSearch, TRUE); } // CancelSearch @@ -499,7 +454,7 @@ void wxFSVolume::CancelSearch() // Function: constructor // Purpose: default constructor //============================================================================= -wxFSVolume::wxFSVolume() +wxFSVolumeBase::wxFSVolumeBase() { m_isOk = FALSE; } // wxVolume @@ -508,7 +463,7 @@ wxFSVolume::wxFSVolume() // Function: constructor // Purpose: constructor that calls Create //============================================================================= -wxFSVolume::wxFSVolume(const wxString& name) +wxFSVolumeBase::wxFSVolumeBase(const wxString& name) { Create(name); } // wxVolume @@ -517,7 +472,7 @@ wxFSVolume::wxFSVolume(const wxString& name) // Function: Create // Purpose: Finds, logs in, etc. to the request volume. //============================================================================= -bool wxFSVolume::Create(const wxString& name) +bool wxFSVolumeBase::Create(const wxString& name) { // assume fail. m_isOk = FALSE; @@ -535,16 +490,6 @@ bool wxFSVolume::Create(const wxString& name) } m_dispName = fi.szDisplayName; -#if wxUSE_GUI - - m_icons.Alloc(wxFS_VOL_ICO_MAX); - int idx; - wxIcon null; - for (idx = 0; idx < wxFS_VOL_ICO_MAX; idx++) - m_icons.Add(null); - -#endif - // all tests passed. return m_isOk = TRUE; } // Create @@ -555,7 +500,7 @@ bool wxFSVolume::Create(const wxString& name) // Notes: For fixed disks, it must exist. For removable disks, it must also // be present. For Network Shares, it must also be logged in, etc. //============================================================================= -bool wxFSVolume::IsOk() const +bool wxFSVolumeBase::IsOk() const { return m_isOk; } // IsOk @@ -564,7 +509,7 @@ bool wxFSVolume::IsOk() const // Function: GetKind // Purpose: Return the type of the volume. //============================================================================= -wxFSVolumeKind wxFSVolume::GetKind() const +wxFSVolumeKind wxFSVolumeBase::GetKind() const { if (!m_isOk) return wxFS_VOL_OTHER; @@ -581,7 +526,7 @@ wxFSVolumeKind wxFSVolume::GetKind() const // Purpose: Return the caches flags for this volume. // Notes: - Returns -1 if no flags were cached. //============================================================================= -int wxFSVolume::GetFlags() const +int wxFSVolumeBase::GetFlags() const { if (!m_isOk) return -1; @@ -593,40 +538,52 @@ int wxFSVolume::GetFlags() const return itr->second.m_flags; } // GetFlags +#endif // __WXBASE__ + +// ============================================================================ +// wxFSVolume +// ============================================================================ + #if wxUSE_GUI +void wxFSVolume::InitIcons() +{ + m_icons.Alloc(wxFS_VOL_ICO_MAX); + wxIcon null; + for (int idx = 0; idx < wxFS_VOL_ICO_MAX; idx++) + m_icons.Add(null); +} + //============================================================================= // Function: GetIcon // Purpose: return the requested icon. //============================================================================= + wxIcon wxFSVolume::GetIcon(wxFSIconType type) const { - wxCHECK_MSG(type < (int)m_icons.GetCount(), wxNullIcon, - _T("Invalid request for icon type!")); - wxCHECK_MSG( type >= 0 && (size_t)type < m_icons.GetCount(), - wxIcon(), - _T("invalid icon index") ); + wxCHECK_MSG( type >= 0 && (size_t)type < m_icons.GetCount(), wxNullIcon, + _T("wxFSIconType::GetIcon(): invalid icon index") ); // Load on demand. if (m_icons[type].IsNull()) { - unsigned flags = 0; + UINT flags = SHGFI_ICON; switch (type) { case wxFS_VOL_ICO_SMALL: - flags = SHGFI_ICON | SHGFI_SMALLICON; + flags |= SHGFI_SMALLICON; break; case wxFS_VOL_ICO_LARGE: - flags = SHGFI_ICON | SHGFI_SHELLICONSIZE; + flags |= SHGFI_SHELLICONSIZE; break; case wxFS_VOL_ICO_SEL_SMALL: - flags = SHGFI_ICON | SHGFI_SMALLICON | SHGFI_OPENICON; + flags |= SHGFI_SMALLICON | SHGFI_OPENICON; break; case wxFS_VOL_ICO_SEL_LARGE: - flags = SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_OPENICON; + flags |= SHGFI_SHELLICONSIZE | SHGFI_OPENICON; break; case wxFS_VOL_ICO_MAX: diff --git a/src/os2/app.cpp b/src/os2/app.cpp index 79c53dec75..b9e0318b16 100644 --- a/src/os2/app.cpp +++ b/src/os2/app.cpp @@ -1100,11 +1100,12 @@ void wxApp::OnQueryEndSession( } } // end of wxApp::OnQueryEndSession -void wxExit() +void wxApp::Exit() { - wxLogError(_("Fatal error: exiting")); - wxApp::CleanUp(); + + // VZ: must really exit somehow, insert appropriate OS/2 syscall (FIXME) + wxAppConsole::Exit(); } // end of wxExit // @@ -1213,7 +1214,7 @@ void wxApp::RemoveSocketHandler(int handle) // wxWakeUpIdle //----------------------------------------------------------------------------- -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { // // Send the top window a dummy message so idle handler processing will diff --git a/src/unix/baseunix.cpp b/src/unix/baseunix.cpp new file mode 100644 index 0000000000..e6250a0c13 --- /dev/null +++ b/src/unix/baseunix.cpp @@ -0,0 +1,108 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: unix/baseunix.cpp +// Purpose: misc stuff only used in console applications under Unix +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.06.2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/apptrait.h" + +// for waitpid() +#include +#include + +// ============================================================================ +// wxConsoleAppTraits implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxExecute support +// ---------------------------------------------------------------------------- + +bool wxConsoleAppTraits::CreateEndProcessPipe(wxExecuteData& WXUNUSED(data)) +{ + // nothing to do, so always ok + return true; +} + +bool +wxConsoleAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(data), + int WXUNUSED(fd)) +{ + // we don't have any pipe + return false; +} + +void +wxConsoleAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(data)) +{ + // nothing to do +} + + +int +wxConsoleAppTraits::WaitForChild(wxExecuteData& execData) +{ + wxASSERT_MSG( execData.flags & wxEXEC_SYNC, + wxT("async execution not supported yet") ); + + int exitcode = 0; + if ( waitpid(execData.pid, &exitcode, 0) == -1 || !WIFEXITED(exitcode) ) + { + wxLogSysError(_("Waiting for subprocess termination failed")); + } + + return exitcode; +} + +// ---------------------------------------------------------------------------- +// misc other stuff +// ---------------------------------------------------------------------------- + +// WXWIN_OS_DESCRIPTION is normally defined by configure +#if defined( __MWERKS__ ) && defined(__MACH__) + #define WXWIN_OS_DESCRIPTION "MacOS X" +#endif + +int wxConsoleAppTraits::GetOSVersion(int *verMaj, int *verMin) +{ + int major, minor; + char name[256]; + + if ( sscanf(WXWIN_OS_DESCRIPTION, "%s %d.%d", name, &major, &minor) != 3 ) + { + // unreckognized uname string format + major = + minor = -1; + } + + if ( majorVsn ) + *majorVsn = major; + if ( minorVsn ) + *minorVsn = minor; + + return wxUNIX; +} + diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index be66b6c9e4..f6d60dcf32 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -28,6 +28,10 @@ #include "wx/wfstream.h" +#include "wx/unix/execute.h" + +#ifdef __WXBASE__ + #if defined( __MWERKS__ ) && defined(__MACH__) #define WXWIN_OS_DESCRIPTION "MacOS X" #define HAVE_NANOSLEEP @@ -60,10 +64,6 @@ #define wxStatfs_t WX_STATFS_T #endif -#if wxUSE_GUI - #include "wx/unix/execute.h" -#endif - // SGI signal.h defines signal handler arguments differently depending on // whether _LANGUAGE_C_PLUS_PLUS is set or not - do set it #if defined(__SGI__) && !defined(_LANGUAGE_C_PLUS_PLUS) @@ -75,8 +75,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -340,30 +340,6 @@ bool wxShutdown(wxShutdownFlags wFlags) } -#if wxUSE_GUI - -void wxHandleProcessTermination(wxEndProcessData *proc_data) -{ - // notify user about termination if required - if ( proc_data->process ) - { - proc_data->process->OnTerminate(proc_data->pid, proc_data->exitcode); - } - - // clean up - if ( proc_data->pid > 0 ) - { - delete proc_data; - } - else - { - // let wxExecute() know that the process has terminated - proc_data->pid = 0; - } -} - -#endif // wxUSE_GUI - // ---------------------------------------------------------------------------- // wxStream classes to support IO redirection in wxExecute // ---------------------------------------------------------------------------- @@ -428,83 +404,6 @@ bool wxPipeInputStream::CanRead() const #endif // wxUSE_STREAMS -// ---------------------------------------------------------------------------- -// wxPipe: this encapsulates pipe() system call -// ---------------------------------------------------------------------------- - -class wxPipe -{ -public: - // the symbolic names for the pipe ends - enum Direction - { - Read, - Write - }; - - enum - { - INVALID_FD = -1 - }; - - // default ctor doesn't do anything - wxPipe() { m_fds[Read] = m_fds[Write] = INVALID_FD; } - - // create the pipe, return TRUE if ok, FALSE on error - bool Create() - { - if ( pipe(m_fds) == -1 ) - { - wxLogSysError(_("Pipe creation failed")); - - return FALSE; - } - - return TRUE; - } - - // return TRUE if we were created successfully - bool IsOk() const { return m_fds[Read] != INVALID_FD; } - - // return the descriptor for one of the pipe ends - int operator[](Direction which) const - { - wxASSERT_MSG( which >= 0 && (size_t)which < WXSIZEOF(m_fds), - _T("invalid pipe index") ); - - return m_fds[which]; - } - - // detach a descriptor, meaning that the pipe dtor won't close it, and - // return it - int Detach(Direction which) - { - wxASSERT_MSG( which >= 0 && (size_t)which < WXSIZEOF(m_fds), - _T("invalid pipe index") ); - - int fd = m_fds[which]; - m_fds[which] = INVALID_FD; - - return fd; - } - - // close the pipe descriptors - void Close() - { - for ( size_t n = 0; n < WXSIZEOF(m_fds); n++ ) - { - if ( m_fds[n] != INVALID_FD ) - close(m_fds[n]); - } - } - - // dtor closes the pipe descriptors - ~wxPipe() { Close(); } - -private: - int m_fds[2]; -}; - // ---------------------------------------------------------------------------- // wxExecute: the real worker function // ---------------------------------------------------------------------------- @@ -549,10 +448,21 @@ long wxExecute(wxChar **argv, wxChar **mb_argv = argv; #endif // Unicode/ANSI -#if wxUSE_GUI && !(defined(__DARWIN__) && defined(__WXMAC__)) + // we want this function to work even if there is no wxApp so ensure that + // we have a valid traits pointer + wxConsoleAppTraits traitsConsole; + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( !traits ) + traits = &traitsConsole; + + // this struct contains all information which we pass to and from + // wxAppTraits methods + wxExecuteData execData; + execData.flags = flags; + execData.process = process; + // create pipes - wxPipe pipeEndProcDetect; - if ( !pipeEndProcDetect.Create() ) + if ( !traits->CreateEndProcessPipe(execData) ) { wxLogError( _("Failed to execute '%s'\n"), *argv ); @@ -560,7 +470,6 @@ long wxExecute(wxChar **argv, return ERROR_RETURN_CODE; } -#endif // wxUSE_GUI && !(defined(__DARWIN__) && defined(__WXMAC__)) // pipes for inter process communication wxPipe pipeIn, // stdin @@ -611,10 +520,7 @@ long wxExecute(wxChar **argv, if ( fd == pipeIn[wxPipe::Read] || fd == pipeOut[wxPipe::Write] || fd == pipeErr[wxPipe::Write] -#if wxUSE_GUI && !(defined(__DARWIN__) && defined(__WXMAC__)) - || fd == pipeEndProcDetect[wxPipe::Write] -#endif // wxUSE_GUI && !(defined(__DARWIN__) && defined(__WXMAC__)) - ) + || traits->IsWriteFDOfEndProcessPipe(execData, fd) ) { // don't close this one, we still need it continue; @@ -635,12 +541,9 @@ long wxExecute(wxChar **argv, } #endif // !__VMS -#if wxUSE_GUI && !(defined(__DARWIN__) && defined(__WXMAC__)) // reading side can be safely closed but we should keep the write one // opened - pipeEndProcDetect.Detach(wxPipe::Write); - pipeEndProcDetect.Close(); -#endif // wxUSE_GUI && !(defined(__DARWIN__) && defined(__WXMAC__)) + traits->DetachWriteFDOfEndProcessPipe(execData); // redirect stdin, stdout and stderr if ( pipeIn.IsOk() ) @@ -707,6 +610,9 @@ long wxExecute(wxChar **argv, bufOut.Init(outStream); bufErr.Init(errStream); + + execData.bufOut = &bufOut; + execData.bufErr = &bufErr; #endif // wxUSE_STREAMS } @@ -717,85 +623,7 @@ long wxExecute(wxChar **argv, pipeErr.Close(); } -#if wxUSE_GUI && !defined(__WXMICROWIN__) - wxEndProcessData *data = new wxEndProcessData; - - // wxAddProcessCallback is now (with DARWIN) allowed to call the - // callback function directly if the process terminates before - // the callback can be added to the run loop. Set up the data. - if ( flags & wxEXEC_SYNC ) - { - // we may have process for capturing the program output, but it's - // not used in wxEndProcessData in the case of sync execution - data->process = NULL; - - // sync execution: indicate it by negating the pid - data->pid = -pid; - } - else - { - // async execution, nothing special to do - caller will be - // notified about the process termination if process != NULL, data - // will be deleted in GTK_EndProcessDetector - data->process = process; - data->pid = pid; - } - - -#if defined(__DARWIN__) && defined(__WXMAC__) - data->tag = wxAddProcessCallbackForPid(data,pid); -#else - data->tag = wxAddProcessCallback - ( - data, - pipeEndProcDetect.Detach(wxPipe::Read) - ); - - pipeEndProcDetect.Close(); -#endif // defined(__DARWIN__) && defined(__WXMAC__) - - if ( flags & wxEXEC_SYNC ) - { - wxBusyCursor bc; - wxWindowDisabler wd; - - // data->pid will be set to 0 from GTK_EndProcessDetector when the - // process terminates - while ( data->pid != 0 ) - { -#if wxUSE_STREAMS - bufOut.Update(); - bufErr.Update(); -#endif // wxUSE_STREAMS - - // give GTK+ a chance to call GTK_EndProcessDetector here and - // also repaint the GUI - wxYield(); - } - - int exitcode = data->exitcode; - - delete data; - - return exitcode; - } - else // async execution - { - return pid; - } -#else // !wxUSE_GUI - - wxASSERT_MSG( flags & wxEXEC_SYNC, - wxT("async execution not supported yet") ); - - int exitcode = 0; - if ( waitpid(pid, &exitcode, 0) == -1 || !WIFEXITED(exitcode) ) - { - wxLogSysError(_("Waiting for subprocess termination failed")); - } - - return exitcode; -#endif // wxUSE_GUI + return traits->WaitForChild(execData); } return ERROR_RETURN_CODE; @@ -986,7 +814,9 @@ bool wxGetUserName(wxChar *buf, int sz) return FALSE; } +// this function is in mac/utils.cpp for wxMac #ifndef __WXMAC__ + wxString wxGetOsDescription() { #ifndef WXWIN_OS_DESCRIPTION @@ -995,33 +825,20 @@ wxString wxGetOsDescription() return wxString::FromAscii( WXWIN_OS_DESCRIPTION ); #endif } -#endif -// this function returns the GUI toolkit version in GUI programs, but OS -// version in non-GUI ones -#if !wxUSE_GUI +#endif // !__WXMAC__ -int wxGetOsVersion(int *majorVsn, int *minorVsn) +int wxGetOsVersion(int *verMaj, int *verMin) { - int major, minor; - char name[256]; + // we want this function to work even if there is no wxApp + wxConsoleAppTraits traitsConsole; + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( ! traits ) + traits = &traitsConsole; - if ( sscanf(WXWIN_OS_DESCRIPTION, "%s %d.%d", name, &major, &minor) != 3 ) - { - // unreckognized uname string format - major = minor = -1; - } - - if ( majorVsn ) - *majorVsn = major; - if ( minorVsn ) - *minorVsn = minor; - - return wxUNIX; + return traits->GetOSVersion(verMaj, verMin); } -#endif // !wxUSE_GUI - unsigned long wxGetProcessId() { return (unsigned long)getpid(); @@ -1243,3 +1060,147 @@ void wxFatalError( const wxString &msg, const wxString &title ) #endif // WXWIN_COMPATIBILITY_2_2 +#endif // __WXBASE__ + +#if wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxExecute support +// ---------------------------------------------------------------------------- + +// Darwin doesn't use the same process end detection mechanisms so we don't +// need wxExecute-related helpers for it +#if !(defined(__DARWIN__) && defined(__WXMAC__)) + +bool wxGUIAppTraits::CreateEndProcessPipe(wxExecuteData& execData) +{ + return execData.pipeEndProcDetect.Create(); +} + +bool wxGUIAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd) +{ + return fd == execData.pipeEndProcDetect[wxPipe::Write] +} + +void wxGUIAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& execData) +{ + execData.pipeEndProcDetect.Detach(wxPipe::Write); + execData.pipeEndProcDetect.Close(); +} + +#else // !Darwin + +bool wxGUIAppTraits::CreateEndProcessPipe(wxExecuteData& WXUNUSED(execData)) +{ + return true; +} + +bool +wxGUIAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(execData), + int WXUNUSED(fd)) +{ + return false; +} + +void +wxGUIAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(execData)) +{ + // nothing to do here, we don't use the pipe +} + +#endif // !Darwin/Darwin + +int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) +{ + wxEndProcessData *endProcData = new wxEndProcessData; + + // wxAddProcessCallback is now (with DARWIN) allowed to call the + // callback function directly if the process terminates before + // the callback can be added to the run loop. Set up the endProcData. + if ( execData.flags & wxEXEC_SYNC ) + { + // we may have process for capturing the program output, but it's + // not used in wxEndProcessData in the case of sync execution + endProcData->process = NULL; + + // sync execution: indicate it by negating the pid + endProcData->pid = -execData.pid; + } + else + { + // async execution, nothing special to do -- caller will be + // notified about the process termination if process != NULL, endProcData + // will be deleted in GTK_EndProcessDetector + endProcData->process = execData.process; + endProcData->pid = execData.pid; + } + + +#if defined(__DARWIN__) && defined(__WXMAC__) + endProcData->tag = wxAddProcessCallbackForPid(endProcData, execData.pid); +#else + endProcData->tag = wxAddProcessCallback + ( + endProcData, + execData.pipeEndProcDetect.Detach(wxPipe::Read) + ); + + execData.pipeEndProcDetect.Close(); +#endif // defined(__DARWIN__) && defined(__WXMAC__) + + if ( execData.flags & wxEXEC_SYNC ) + { + wxBusyCursor bc; + wxWindowDisabler wd; + + // endProcData->pid will be set to 0 from GTK_EndProcessDetector when the + // process terminates + while ( endProcData->pid != 0 ) + { +#if wxUSE_STREAMS + if ( execData.bufOut ) + execData.bufOut->Update(); + + if ( execData.bufErr ) + execData.bufErr->Update(); +#endif // wxUSE_STREAMS + + // give GTK+ a chance to call GTK_EndProcessDetector here and + // also repaint the GUI + wxYield(); + } + + int exitcode = endProcData->exitcode; + + delete endProcData; + + return exitcode; + } + else // async execution + { + return execData.pid; + } +} + +void wxHandleProcessTermination(wxEndProcessData *proc_data) +{ + // notify user about termination if required + if ( proc_data->process ) + { + proc_data->process->OnTerminate(proc_data->pid, proc_data->exitcode); + } + + // clean up + if ( proc_data->pid > 0 ) + { + delete proc_data; + } + else + { + // let wxExecute() know that the process has terminated + proc_data->pid = 0; + } +} + +#endif // wxUSE_GUI + diff --git a/src/wxBase.dsp b/src/wxBase.dsp index fa1a58c7d2..1001534bf7 100644 --- a/src/wxBase.dsp +++ b/src/wxBase.dsp @@ -248,7 +248,7 @@ LIB32=link.exe -lib # PROP Default_Filter "" # Begin Source File -SOURCE=.\common\appcmn.cpp +SOURCE=.\common\appbase.cpp # End Source File # Begin Source File @@ -328,7 +328,7 @@ SOURCE=.\common\filesys.cpp # End Source File # Begin Source File -SOURCE=.\common\fontmap.cpp +SOURCE=.\common\fmapbase.cpp # End Source File # Begin Source File @@ -436,6 +436,10 @@ SOURCE=.\common\socket.cpp # End Source File # Begin Source File +SOURCE=.\common\stopwatch.cpp +# End Source File +# Begin Source File + SOURCE=.\common\strconv.cpp # End Source File # Begin Source File @@ -460,10 +464,6 @@ SOURCE=.\common\textfile.cpp # End Source File # Begin Source File -SOURCE=.\common\timercmn.cpp -# End Source File -# Begin Source File - SOURCE=.\common\tokenzr.cpp # End Source File # Begin Source File @@ -525,6 +525,10 @@ SOURCE=.\msw\dummy.cpp # End Source File # Begin Source File +SOURCE=.\msw\console.cpp +# End Source File +# Begin Source File + SOURCE=.\msw\dde.cpp # End Source File # Begin Source File @@ -541,6 +545,10 @@ SOURCE=.\msw\mimetype.cpp # End Source File # Begin Source File +SOURCE=.\msw\mslu.cpp +# End Source File +# Begin Source File + SOURCE=.\msw\regconf.cpp # End Source File # Begin Source File @@ -664,6 +672,10 @@ SOURCE=..\include\wx\app.h # End Source File # Begin Source File +SOURCE=..\include\wx\apptrait.h +# End Source File +# Begin Source File + SOURCE=..\include\wx\buffer.h # End Source File # Begin Source File @@ -780,6 +792,10 @@ SOURCE=..\include\wx\filesys.h # End Source File # Begin Source File +SOURCE=..\include\wx\fmappriv.h +# End Source File +# Begin Source File + SOURCE=..\include\wx\fontenc.h # End Source File # Begin Source File @@ -1013,6 +1029,14 @@ SOURCE=..\include\wx\zstream.h # PROP Default_Filter "" # Begin Source File +SOURCE=..\include\wx\msw\apptbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\apptrait.h +# End Source File +# Begin Source File + SOURCE=..\include\wx\msw\dde.h # End Source File # Begin Source File diff --git a/src/wxMSW.dsp b/src/wxMSW.dsp new file mode 100644 index 0000000000..97a1ef024f --- /dev/null +++ b/src/wxMSW.dsp @@ -0,0 +1,2805 @@ +# Microsoft Developer Studio Project File - Name="wxWindows" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=wxWindows - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "wxWindows.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "wxWindows.mak" CFG="wxWindows - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "wxWindows - Win32 Release Unicode DLL" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wxWindows - Win32 Debug Unicode DLL" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wxWindows - Win32 Release Unicode" (based on "Win32 (x86) Static Library") +!MESSAGE "wxWindows - Win32 Debug Unicode" (based on "Win32 (x86) Static Library") +!MESSAGE "wxWindows - Win32 Release DLL" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wxWindows - Win32 Debug DLL" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wxWindows - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "wxWindows - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "wxWindows - Win32 Release Unicode DLL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../ReleaseUnicodeDll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../ReleaseUnicodeDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdllu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /i "../include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpeg.lib ..\lib\tiff.lib ..\lib\png.lib ..\lib\regex.lib ..\lib\zlib.lib /nologo /dll /machine:I386 /out:"../lib/wxmsw250u.dll" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib comdlg32.lib shell32.lib ole32.lib oleaut32.lib odbc32.lib uuid.lib rpcrt4.lib comctl32.lib wsock32.lib winmm.lib ..\lib\jpeg.lib ..\lib\tiff.lib ..\lib\png.lib ..\lib\regex.lib ..\lib\zlib.lib /nologo /version:2.5 /dll /machine:I386 /out:"../lib/wxmsw250u.dll" + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug Unicode DLL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../DebugUnicodeDll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../DebugUnicodeDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W4 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdllud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /i "../include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /dll /debug /machine:I386 /out:"../lib/wxmsw250ud.dll" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib comdlg32.lib shell32.lib ole32.lib oleaut32.lib odbc32.lib uuid.lib rpcrt4.lib comctl32.lib wsock32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /nologo /version:2.5 /dll /machine:I386 /out:"../lib/wxmsw250ud.dll" + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Release Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../ReleaseUnicode" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../ReleaseUnicode" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W4 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\wxmswu.lib" + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../DebugUnicode" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../DebugUnicode" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W4 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\wxmswud.lib" + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Release DLL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../ReleaseDll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../ReleaseDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdll" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /i "../include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpeg.lib ..\lib\tiff.lib ..\lib\png.lib ..\lib\regex.lib ..\lib\zlib.lib /nologo /dll /machine:I386 /out:"../lib/wxmsw250.dll" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib comdlg32.lib shell32.lib ole32.lib oleaut32.lib odbc32.lib uuid.lib rpcrt4.lib comctl32.lib wsock32.lib winmm.lib ..\lib\jpeg.lib ..\lib\tiff.lib ..\lib\png.lib ..\lib\regex.lib ..\lib\zlib.lib /nologo /version:2.5 /dll /machine:I386 /out:"../lib/wxmsw250.dll" + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug DLL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../DebugDll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../DebugDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W4 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdlld" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /i "../include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /dll /debug /machine:I386 /out:"../lib/wxmsw250d.dll" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib comdlg32.lib shell32.lib ole32.lib oleaut32.lib odbc32.lib uuid.lib rpcrt4.lib comctl32.lib wsock32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /nologo /version:2.5 /dll /machine:I386 /out:"../lib/wxmsw250d.dll" + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../Release" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W4 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/msw" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\wxmsw.lib" + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "../lib" +# PROP BASE Intermediate_Dir "../Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../lib" +# PROP Intermediate_Dir "../Debug" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W4 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswd" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\wxmswd.lib" + +!ENDIF + +# Begin Target + +# Name "wxWindows - Win32 Release Unicode DLL" +# Name "wxWindows - Win32 Debug Unicode DLL" +# Name "wxWindows - Win32 Release Unicode" +# Name "wxWindows - Win32 Debug Unicode" +# Name "wxWindows - Win32 Release DLL" +# Name "wxWindows - Win32 Debug DLL" +# Name "wxWindows - Win32 Release" +# Name "wxWindows - Win32 Debug" +# Begin Group "Common Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\common\accesscmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\appcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\artprov.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\artstd.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\choiccmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\clipcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\cmdproc.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\cmndata.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\containr.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\cshelp.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\ctrlcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\ctrlsub.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\datacmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\dbgrid.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\dcbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\dlgcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\dndcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\dobjcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\docmdi.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\docview.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\dpycmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\dseldlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\effects.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\event.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\fddlgcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\fldlgcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\fontcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\fontmap.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\framecmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\fs_mem.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\gaugecmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\gdicmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\geometry.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\gifdecod.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\helpbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\iconbndl.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagall.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagbmp.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\image.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagfill.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imaggif.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagiff.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagjpeg.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagpcx.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagpng.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagpnm.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagtiff.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\imagxpm.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\layout.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\lboxcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\matrix.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\menucmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\msgout.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\nbkbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\paper.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\popupcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\prntbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\quantize.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\radiocmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\rgncmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\settcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\sizer.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\statbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\taskbarcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\tbarbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\textcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\timercmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\toplvcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\treebase.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\utilscmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\valgen.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\validate.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\valtext.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\wincmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\common\xpmdecod.cpp +# End Source File +# End Group +# Begin Group "Generic Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\generic\busyinfo.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\calctrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\choicdgg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\dcbuffer.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\dcpsg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\dirctrlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\dragimgg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\grid.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\gridctrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\gridsel.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\laywin.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\logg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\numdlgg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\panelg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\progdlgg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\sashwin.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\scrlwing.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\selstore.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\spinctlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\splash.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\splitter.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\statusbr.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\tbarsmpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\textdlgg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\tipdlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\tipwin.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\treectlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\generic\wizard.cpp +# End Source File +# End Group +# Begin Group "wxHTML Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\html\helpctrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\helpdata.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\helpfrm.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\htmlcell.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\htmlfilt.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\htmlpars.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\htmltag.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\htmlwin.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\htmprint.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_dflist.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_fonts.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_hline.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_image.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_layout.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_links.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_list.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_pre.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_style.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\m_tables.cpp +# End Source File +# Begin Source File + +SOURCE=.\html\winpars.cpp +# End Source File +# End Group +# Begin Group "MSW Files" + +# PROP Default_Filter "" +# Begin Group "OLE Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\msw\ole\access.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\automtn.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\dataobj.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\dropsrc.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\droptgt.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\oleutils.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\uuid.cpp +# End Source File +# End Group +# Begin Source File + +SOURCE=.\msw\accel.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\app.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\bitmap.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\bmpbuttn.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\brush.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\button.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\caret.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\checkbox.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\checklst.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\choice.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\clipbrd.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\colordlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\colour.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\combobox.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\control.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\cursor.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\data.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dc.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dcclient.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dcmemory.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dcprint.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dcscreen.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dialup.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dib.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dirdlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\display.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dragimag.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\dummy.cpp +# ADD CPP /Yc"wx/wxprec.h" +# End Source File +# Begin Source File + +SOURCE=.\msw\enhmeta.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\evtloop.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\fdrepdlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\filedlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\font.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\fontdlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\fontenum.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\fontutil.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\frame.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\gauge95.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\gdiimage.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\gdiobj.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\glcanvas.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\helpbest.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\helpchm.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\helpwin.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\icon.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\imaglist.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\iniconf.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\joystick.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\listbox.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\listctrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\main.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\mdi.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\menu.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\menuitem.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\metafile.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\minifram.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\msgdlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\mslu.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\nativdlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\notebook.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ownerdrw.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\palette.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\pen.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\penwin.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\popupwin.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\printdlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\printwin.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\radiobox.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\radiobut.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\region.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\scrolbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\settings.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\slider95.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\spinbutt.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\spinctrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\statbmp.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\statbox.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\statbr95.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\statline.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\stattext.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\tabctrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\taskbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\tbar95.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\textctrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\tglbtn.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\timer.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\tooltip.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\toplevel.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\treectrl.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\utilsgui.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\uxtheme.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\volume.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\wave.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\window.cpp +# End Source File +# End Group +# Begin Group "Headers" + +# PROP Default_Filter "" +# Begin Group "Setup" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\include\wx\msw\setup.h + +!IF "$(CFG)" == "wxWindows - Win32 Release Unicode DLL" + +# Begin Custom Build - Creating ..\lib\mswdllu\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/mswdllu/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\mswdllu\wx\setup.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug Unicode DLL" + +# Begin Custom Build - Creating ..\lib\mswdllud\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/mswdllud/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\mswdllud\wx\setup.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Release Unicode" + +# Begin Custom Build - Creating ..\lib\mswu\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/mswu/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\mswu\wx\setup.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug Unicode" + +# Begin Custom Build - Creating ..\lib\mswud\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/mswud/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\mswud\wx\setup.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Release DLL" + +# Begin Custom Build - Creating ..\lib\mswdll\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/mswdll/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\mswdll\wx\setup.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug DLL" + +# Begin Custom Build - Creating ..\lib\mswdlld\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/mswdlld/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\mswdlld\wx\setup.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Release" + +# Begin Custom Build - Creating ..\lib\msw\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/msw/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\msw\wx\setup.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "wxWindows - Win32 Debug" + +# Begin Custom Build - Creating ..\lib\mswd\wx\setup.h from $(InputPath) +InputPath=..\include\wx\msw\setup.h + +"../lib/mswd/wx/setup.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy "$(InputPath)" ..\lib\mswd\wx\setup.h + +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\include\wx\accel.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\access.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\app.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\artprov.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\bitmap.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\bmpbuttn.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\brush.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\buffer.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\build.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\busyinfo.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\button.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\calctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\caret.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\checkbox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\checklst.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\chkconf.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\choicdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\choice.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\clipbrd.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\clntdata.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\cmdline.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\cmdproc.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\cmndata.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\colordlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\colour.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\combobox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\confbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\config.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\containr.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\control.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\cshelp.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\ctrlsub.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\cursor.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dataobj.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\datetime.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\datetime.inl +# End Source File +# Begin Source File + +SOURCE=..\include\wx\datstrm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\db.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dbgrid.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dbkeyg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dbtable.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dc.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dcbuffer.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dcclient.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dcmemory.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dcprint.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dcps.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dcscreen.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dde.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\debug.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\defs.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dialog.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dialup.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dir.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dirctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dirdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\display.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dnd.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\docmdi.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\docview.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dragimag.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dynarray.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dynlib.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\dynload.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\effects.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\encconv.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\event.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fdrepdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\features.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\ffile.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\file.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fileconf.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\filedlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\filefn.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\filename.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\filesys.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\font.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fontdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fontenc.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fontenum.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fontmap.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fontutil.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\frame.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fs_inet.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fs_mem.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\fs_zip.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\gauge.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\gdicmn.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\gdiobj.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\geometry.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\gifdecod.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\glcanvas.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\grid.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\gsocket.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\hash.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\hashmap.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\help.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\helpbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\helpwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\icon.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\iconbndl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagbmp.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\image.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imaggif.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagiff.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagjpeg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imaglist.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagpcx.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagpng.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagpnm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagtiff.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\imagxpm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\intl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\iosfwrap.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\ioswrap.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\ipc.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\ipcbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\isql.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\isqlext.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\joystick.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\layout.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\laywin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\list.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\listbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\listbox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\listctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\log.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\longlong.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\math.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\matrix.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\mdi.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\memconf.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\memory.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\memtext.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\menu.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\menuitem.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\metafile.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\mimetype.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\minifram.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\module.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msgdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msgout.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\mstream.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\notebook.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\object.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\ownerdrw.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\palette.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\panel.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\paper.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\pen.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\platform.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\popupwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\print.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\printdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\prntbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\process.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\progdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\quantize.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\radiobox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\radiobut.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\rawbmp.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\regex.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\region.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\sashwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\sckaddr.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\sckipc.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\sckstrm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\scrolbar.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\scrolwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\selstore.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\settings.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\sizer.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\slider.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\snglinst.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\socket.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\spinbutt.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\spinctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\splash.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\splitter.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\stack.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\statbmp.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\statbox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\statline.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\stattext.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\statusbr.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\strconv.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\stream.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\string.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\sysopt.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tab.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tabctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\taskbar.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tbarbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tbarsmpl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\textbuf.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\textctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\textdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\textfile.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tglbtn.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\thread.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\timer.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tipdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tipwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tokenzr.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\toolbar.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\tooltip.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\toplevel.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\treebase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\treectrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\txtstrm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\types.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\url.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\utils.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\valgen.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\validate.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\valtext.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\variant.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\vector.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\version.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\volume.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wave.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wfstream.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\window.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wizard.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wx.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wx_cw.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wx_cw_cm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wx_cw_d.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wxchar.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wxhtml.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\wxprec.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\xpmdecod.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\zipstrm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\zstream.h +# End Source File +# End Group +# Begin Group "MSW" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\include\wx\msw\accel.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\access.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\app.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\bitmap.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\bmpbuttn.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\brush.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\button.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\caret.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\checkbox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\checklst.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\choice.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\clipbrd.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\colordlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\colour.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\combobox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\control.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\cursor.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dc.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dcclient.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dcmemory.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dcprint.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dcscreen.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dde.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dialog.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dib.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dirdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\dragimag.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\enhmeta.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\fdrepdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\filedlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\font.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\fontdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\frame.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\gauge95.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\gccpriv.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\gdiimage.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\gdiobj.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\glcanvas.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\helpbest.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\helpchm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\helpwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\icon.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\imaglist.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\iniconf.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\joystick.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\listbox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\listctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\mdi.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\menu.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\menuitem.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\metafile.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\mimetype.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\minifram.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\missing.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\msgdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\mslu.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\msvcrt.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\notebook.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\palette.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\pen.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\printdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\printwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\private.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\radiobox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\radiobut.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\regconf.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\region.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\registry.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\scrolbar.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\slider95.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\slidrmsw.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\spinbutt.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\spinctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\statbmp.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\statbox.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\statbr95.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\statline.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\stattext.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\tabctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\taskbar.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\tbar95.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\tbarmsw.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\textctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\tglbtn.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\timer.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\tooltip.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\toplevel.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\treectrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\wave.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\window.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\winundef.h +# End Source File +# End Group +# Begin Group "Generic" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\include\wx\generic\accel.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\calctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\caret.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\choicdgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\colrdlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\dcpsg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\dirctrlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\dirdlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\dragimgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\fdrepdlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\filedlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\fontdlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\grid.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\gridctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\gridg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\helpext.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\imaglist.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\laywin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\listctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\mdig.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\msgdlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\notebook.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\paletteg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\panelg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\printps.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\prntdlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\progdlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\sashwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\scrolwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\spinctlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\splash.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\splitter.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\statline.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\statusbr.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\tabg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\textdlgg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\timer.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\treectlg.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\generic\wizard.h +# End Source File +# End Group +# Begin Group "HTML" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\include\wx\html\forcelnk.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\helpctrl.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\helpdata.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\helpfrm.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\htmlcell.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\htmldefs.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\htmlfilt.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\htmlpars.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\htmltag.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\htmlwin.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\htmprint.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\m_templ.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\html\winpars.h +# End Source File +# End Group +# End Group +# End Target +# End Project diff --git a/src/wxWindows.dsp b/src/wxWindows.dsp index 7d981424aa..88b96267b3 100644 --- a/src/wxWindows.dsp +++ b/src/wxWindows.dsp @@ -2,8 +2,8 @@ # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** -# TARGTYPE "Win32 (x86) Static Library" 0x0104 # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 +# TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=wxWindows - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, @@ -32,8 +32,6 @@ CFG=wxWindows - Win32 Debug # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe !IF "$(CFG)" == "wxWindows - Win32 Release Unicode DLL" @@ -48,10 +46,13 @@ RSC=rc.exe # PROP Intermediate_Dir "../ReleaseUnicodeDll" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MD /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdllu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdllu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "NDEBUG" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /i "../include" /d "NDEBUG" BSC32=bscmake.exe @@ -74,17 +75,20 @@ LINK32=link.exe # PROP Intermediate_Dir "../DebugUnicodeDll" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MDd /W4 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdllud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdllud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "_DEBUG" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /i "../include" /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /dll /debug /machine:I386 /pdbtype:sept /out:"../lib/wxmsw250ud.dll" +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /dll /debug /machine:I386 /out:"../lib/wxmsw250ud.dll" /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib comdlg32.lib shell32.lib ole32.lib oleaut32.lib odbc32.lib uuid.lib rpcrt4.lib comctl32.lib wsock32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /nologo /version:2.5 /dll /machine:I386 /out:"../lib/wxmsw250ud.dll" !ELSEIF "$(CFG)" == "wxWindows - Win32 Release Unicode" @@ -99,8 +103,10 @@ LINK32=link.exe # PROP Output_Dir "../lib" # PROP Intermediate_Dir "../ReleaseUnicode" # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MD /W4 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswu" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "NDEBUG" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe @@ -122,8 +128,10 @@ LIB32=link.exe -lib # PROP Output_Dir "../lib" # PROP Intermediate_Dir "../DebugUnicode" # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MDd /W4 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /D "_UNICODE" /D "UNICODE" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswud" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_DEBUG" /D "__WXDEBUG__" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe @@ -146,10 +154,13 @@ LIB32=link.exe -lib # PROP Intermediate_Dir "../ReleaseDll" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MD /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdll" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/mswdll" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "NDEBUG" /D "WXMAKINGDLL" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /i "../include" /d "NDEBUG" BSC32=bscmake.exe @@ -172,17 +183,20 @@ LINK32=link.exe # PROP Intermediate_Dir "../DebugDll" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MDd /W4 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WXWINDLL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdlld" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /D WINVER=0x0400 /D "STRICT" /D "WXMAKINGDLL" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswdlld" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_USRDLL" /D "_DEBUG" /D "WXMAKINGDLL" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /i "../include" /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /dll /debug /machine:I386 /pdbtype:sept /out:"../lib/wxmsw250d.dll" +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /dll /debug /machine:I386 /out:"../lib/wxmsw250d.dll" /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib comdlg32.lib shell32.lib ole32.lib oleaut32.lib odbc32.lib uuid.lib rpcrt4.lib comctl32.lib wsock32.lib winmm.lib ..\lib\jpegd.lib ..\lib\tiffd.lib ..\lib\pngd.lib ..\lib\regexd.lib ..\lib\zlibd.lib /nologo /version:2.5 /dll /machine:I386 /out:"../lib/wxmsw250d.dll" !ELSEIF "$(CFG)" == "wxWindows - Win32 Release" @@ -197,8 +211,10 @@ LINK32=link.exe # PROP Output_Dir "../lib" # PROP Intermediate_Dir "../Release" # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MD /W4 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /O2 /I "../lib/msw" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "NDEBUG" /D WINVER=0x0400 /D "STRICT" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../lib/msw" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "NDEBUG" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe @@ -220,8 +236,10 @@ LIB32=link.exe -lib # PROP Output_Dir "../lib" # PROP Intermediate_Dir "../Debug" # PROP Target_Dir "" +CPP=cl.exe # ADD BASE CPP /nologo /MDd /W4 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswd" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D WINVER=0x0400 /D "STRICT" /Yu"wx/wxprec.h" /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../lib/mswd" /I "../include" /I "./zlib" /I "./jpeg" /I "./png" /I "./regex" /I "./tiff" /D "_DEBUG" /D "__WXDEBUG__" /D "WIN32" /D WINVER=0x0400 /D "STRICT" /D "__WXBASE__" /Yu"wx/wxprec.h" /FD /c +RSC=rc.exe # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe @@ -252,6 +270,10 @@ SOURCE=.\common\accesscmn.cpp # End Source File # Begin Source File +SOURCE=.\common\appbase.cpp +# End Source File +# Begin Source File + SOURCE=.\common\appcmn.cpp # End Source File # Begin Source File @@ -392,6 +414,11 @@ SOURCE=.\common\event.cpp # End Source File # Begin Source File +SOURCE=.\common\extended.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + SOURCE=.\common\fddlgcmn.cpp # End Source File # Begin Source File @@ -424,6 +451,10 @@ SOURCE=.\common\fldlgcmn.cpp # End Source File # Begin Source File +SOURCE=.\common\fmapbase.cpp +# End Source File +# Begin Source File + SOURCE=.\common\fontcmn.cpp # End Source File # Begin Source File @@ -668,6 +699,10 @@ SOURCE=.\common\statbar.cpp # End Source File # Begin Source File +SOURCE=.\common\stopwatch.cpp +# End Source File +# Begin Source File + SOURCE=.\common\strconv.cpp # End Source File # Begin Source File @@ -724,6 +759,11 @@ SOURCE=.\common\txtstrm.cpp # End Source File # Begin Source File +SOURCE=.\common\unzip.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + SOURCE=.\common\url.cpp # End Source File # Begin Source File @@ -770,18 +810,6 @@ SOURCE=.\common\zipstrm.cpp SOURCE=.\common\zstream.cpp # End Source File - -# Begin Source File - -SOURCE=.\common\extended.c -# SUBTRACT CPP /YX /Yc /Yu -# End Source File -# Begin Source File - -SOURCE=.\common\unzip.c -# SUBTRACT CPP /YX /Yc /Yu -# End Source File - # End Group # Begin Group "Generic Files" @@ -898,7 +926,6 @@ SOURCE=.\generic\treectlg.cpp SOURCE=.\generic\wizard.cpp # End Source File - # End Group # Begin Group "wxHTML Files" @@ -983,18 +1010,44 @@ SOURCE=.\html\m_tables.cpp SOURCE=.\html\winpars.cpp # End Source File - # End Group # Begin Group "MSW Files" +# PROP Default_Filter "" +# Begin Group "OLE Files" + # PROP Default_Filter "" # Begin Source File -SOURCE=.\msw\dummy.cpp -# ADD CPP /Yc"wx/wxprec.h" +SOURCE=.\msw\ole\access.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\automtn.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\dataobj.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\dropsrc.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\droptgt.cpp # End Source File # Begin Source File +SOURCE=.\msw\ole\oleutils.cpp +# End Source File +# Begin Source File + +SOURCE=.\msw\ole\uuid.cpp +# End Source File +# End Group +# Begin Source File + SOURCE=.\msw\accel.cpp # End Source File # Begin Source File @@ -1003,6 +1056,10 @@ SOURCE=.\msw\app.cpp # End Source File # Begin Source File +SOURCE=.\msw\basemsw.cpp +# End Source File +# Begin Source File + SOURCE=.\msw\bitmap.cpp # End Source File # Begin Source File @@ -1115,6 +1172,11 @@ SOURCE=.\msw\dragimag.cpp # End Source File # Begin Source File +SOURCE=.\msw\dummy.cpp +# ADD CPP /Yc"wx/wxprec.h" +# End Source File +# Begin Source File + SOURCE=.\msw\enhmeta.cpp # End Source File # Begin Source File @@ -1167,6 +1229,16 @@ SOURCE=.\msw\glcanvas.cpp # End Source File # Begin Source File +SOURCE=.\msw\gsocket.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\msw\gsockmsw.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + SOURCE=.\msw\helpbest.cpp # End Source File # Begin Source File @@ -1387,6 +1459,10 @@ SOURCE=.\msw\utilsexc.cpp # End Source File # Begin Source File +SOURCE=.\msw\utilsgui.cpp +# End Source File +# Begin Source File + SOURCE=.\msw\uxtheme.cpp # End Source File # Begin Source File @@ -1401,51 +1477,6 @@ SOURCE=.\msw\wave.cpp SOURCE=.\msw\window.cpp # End Source File - -# Begin Source File - -SOURCE=.\msw\gsocket.c -# SUBTRACT CPP /YX /Yc /Yu -# End Source File -# Begin Source File - -SOURCE=.\msw\gsockmsw.c -# SUBTRACT CPP /YX /Yc /Yu -# End Source File - -# Begin Group "OLE Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\msw\ole\access.cpp -# End Source File -# Begin Source File - -SOURCE=.\msw\ole\automtn.cpp -# End Source File -# Begin Source File - -SOURCE=.\msw\ole\dataobj.cpp -# End Source File -# Begin Source File - -SOURCE=.\msw\ole\dropsrc.cpp -# End Source File -# Begin Source File - -SOURCE=.\msw\ole\droptgt.cpp -# End Source File -# Begin Source File - -SOURCE=.\msw\ole\oleutils.cpp -# End Source File -# Begin Source File - -SOURCE=.\msw\ole\uuid.cpp -# End Source File - -# End Group # End Group # Begin Group "Headers" @@ -1456,7 +1487,9 @@ SOURCE=.\msw\ole\uuid.cpp # Begin Source File SOURCE=..\include\wx\msw\setup.h + !IF "$(CFG)" == "wxWindows - Win32 Release Unicode DLL" + # Begin Custom Build - Creating ..\lib\mswdllu\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1464,7 +1497,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\mswdllu\wx\setup.h # End Custom Build + !ELSEIF "$(CFG)" == "wxWindows - Win32 Debug Unicode DLL" + # Begin Custom Build - Creating ..\lib\mswdllud\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1472,7 +1507,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\mswdllud\wx\setup.h # End Custom Build + !ELSEIF "$(CFG)" == "wxWindows - Win32 Release Unicode" + # Begin Custom Build - Creating ..\lib\mswu\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1480,7 +1517,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\mswu\wx\setup.h # End Custom Build + !ELSEIF "$(CFG)" == "wxWindows - Win32 Debug Unicode" + # Begin Custom Build - Creating ..\lib\mswud\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1488,7 +1527,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\mswud\wx\setup.h # End Custom Build + !ELSEIF "$(CFG)" == "wxWindows - Win32 Release DLL" + # Begin Custom Build - Creating ..\lib\mswdll\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1496,7 +1537,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\mswdll\wx\setup.h # End Custom Build + !ELSEIF "$(CFG)" == "wxWindows - Win32 Debug DLL" + # Begin Custom Build - Creating ..\lib\mswdlld\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1504,7 +1547,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\mswdlld\wx\setup.h # End Custom Build + !ELSEIF "$(CFG)" == "wxWindows - Win32 Release" + # Begin Custom Build - Creating ..\lib\msw\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1512,7 +1557,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\msw\wx\setup.h # End Custom Build + !ELSEIF "$(CFG)" == "wxWindows - Win32 Debug" + # Begin Custom Build - Creating ..\lib\mswd\wx\setup.h from $(InputPath) InputPath=..\include\wx\msw\setup.h @@ -1520,7 +1567,9 @@ InputPath=..\include\wx\msw\setup.h copy "$(InputPath)" ..\lib\mswd\wx\setup.h # End Custom Build + !ENDIF + # End Source File # End Group # Begin Group "Common" @@ -1540,6 +1589,10 @@ SOURCE=..\include\wx\app.h # End Source File # Begin Source File +SOURCE=..\include\wx\apptrait.h +# End Source File +# Begin Source File + SOURCE=..\include\wx\artprov.h # End Source File # Begin Source File @@ -1832,6 +1885,10 @@ SOURCE=..\include\wx\filesys.h # End Source File # Begin Source File +SOURCE=..\include\wx\fmappriv.h +# End Source File +# Begin Source File + SOURCE=..\include\wx\font.h # End Source File # Begin Source File @@ -2462,7 +2519,6 @@ SOURCE=..\include\wx\zipstrm.h SOURCE=..\include\wx\zstream.h # End Source File - # End Group # Begin Group "MSW" @@ -2481,6 +2537,14 @@ SOURCE=..\include\wx\msw\app.h # End Source File # Begin Source File +SOURCE=..\include\wx\msw\apptbase.h +# End Source File +# Begin Source File + +SOURCE=..\include\wx\msw\apptrait.h +# End Source File +# Begin Source File + SOURCE=..\include\wx\msw\bitmap.h # End Source File # Begin Source File @@ -2831,7 +2895,6 @@ SOURCE=..\include\wx\msw\window.h SOURCE=..\include\wx\msw\winundef.h # End Source File - # End Group # Begin Group "Generic" @@ -2992,7 +3055,6 @@ SOURCE=..\include\wx\generic\treectlg.h SOURCE=..\include\wx\generic\wizard.h # End Source File - # End Group # Begin Group "HTML" @@ -3049,7 +3111,6 @@ SOURCE=..\include\wx\html\m_templ.h SOURCE=..\include\wx\html\winpars.h # End Source File - # End Group # End Group # End Target diff --git a/src/x11/app.cpp b/src/x11/app.cpp index bd29c3eac5..92c550e241 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -887,9 +887,10 @@ void wxApp::OnIdle(wxIdleEvent& event) s_inOnIdle = FALSE; } -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { - // **** please implement me! **** + // TODO: use wxMotif implementation? + // Wake up the idle handler processor, even if it is in another thread... } @@ -1061,18 +1062,11 @@ Window wxGetWindowParent(Window window) return (Window) 0; } -void wxExit() +void wxApp::Exit() { - int retValue = 0; - if (wxTheApp) - retValue = wxTheApp->OnExit(); - wxApp::CleanUp(); - /* - * Exit in some platform-specific way. Not recommended that the app calls this: - * only for emergencies. - */ - exit(retValue); + + wxAppConsole::Exit(); } // Yield to other processes -- 2.45.2