X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b07135ba7aba848ed2d993be93f778f7385151da..a4388683f1b20020b5425c59c401d6ab673860de:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index e8cc1ac459..3a114037d9 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -30,6 +30,8 @@ #include "wx/msw/private.h" #include "wx/timer.h" +#include + #include #ifndef __GNUWIN32__ @@ -68,6 +70,54 @@ #endif #include +//// BEGIN for console support: VC++ only + +#if defined(__WXDEBUG__) && !defined(__WIN16__) && defined(_MSC_VER) && !defined(__NO_VC_CRTDBG__) + #define wxUSE_VC_CRTDBG +#else + #undef wxUSE_VC_CRTDBG +#endif + +#ifdef wxUSE_VC_CRTDBG + // VC++ uses this macro as debug/release mode indicator + #ifndef _DEBUG + #define _DEBUG + #endif + + #include + +#if wxUSE_IOSTREAMH +// N.B. BC++ doesn't have istream.h, ostream.h +# include +# include +# include + +#else +# include +# include +# include +# ifdef _MSC_VER + using namespace std; +# endif +#endif + +/* 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(__FILE__,__LINE__) +# endif + +#endif + +/// END for console support + // In the WIN.INI file static const char WX_SECTION[] = "wxWindows"; static const char eHOSTNAME[] = "HostName"; @@ -101,7 +151,10 @@ bool wxGetHostName(char *buf, int maxSize) // Get user ID e.g. jacs bool wxGetUserId(char *buf, int maxSize) { -#if defined(__WIN32__) && !defined(__win32s__) && 0 +#if defined(__WIN32__) && !defined(__win32s__) + + // VZ: why should it be so complicated?? +#if 0 // Gets the current user's full name according to the MS article PSS ID // Number: Q119670 // Seems to be the same as the login name for me? @@ -145,11 +198,19 @@ bool wxGetUserId(char *buf, int maxSize) -1, buf, 256, NULL, NULL ); } return( TRUE ); -/* - DWORD nSize = maxSize; - return ::GetUserName(buf, &nSize); -*/ -#else +#else // 1 + DWORD nSize = maxSize; + if ( ::GetUserName(buf, &nSize) == 0 ) + { + wxLogSysError("Can not get user name"); + + return FALSE; + } + + return TRUE; +#endif // 0/1 + +#else // Win16 or Win32s char *user; const char *default_id = "anonymous"; @@ -168,22 +229,7 @@ bool wxGetUserId(char *buf, int maxSize) // Get user name e.g. Julian Smart bool wxGetUserName(char *buf, int maxSize) { - const char *default_name = "Unknown User"; -#if defined(__WIN32__) -/* - DWORD nSize = maxSize; - In VC++ 4.0, results in unresolved symbol __imp__GetUserNameA - if (GetUserName(buf, &nSize)) - return TRUE; - else -*/ - // Could use NIS, MS-Mail or other site specific programs - // Use wxWindows configuration data - GetProfileString(WX_SECTION, eUSERNAME, default_name, buf, maxSize - 1); - return *buf ? TRUE : FALSE; -// } -#else -#if !defined(__WATCOMC__) && !defined(__GNUWIN32__) && wxUSE_PENWINDOWS +#if wxUSE_PENWINDOWS && !defined(__WATCOMC__) && !defined(__GNUWIN32__) extern HANDLE g_hPenWin; // PenWindows Running? if (g_hPenWin) { @@ -197,10 +243,19 @@ bool wxGetUserName(char *buf, int maxSize) { // Could use NIS, MS-Mail or other site specific programs // Use wxWindows configuration data - GetProfileString(WX_SECTION, eUSERNAME, default_name, buf, maxSize - 1); + bool ok = GetProfileString(WX_SECTION, eUSERNAME, "", buf, maxSize - 1) != 0; + if ( !ok ) + { + ok = wxGetUserId(buf, maxSize); + } + + if ( !ok ) + { + strncpy(buf, "Unknown User", maxSize); + } } - return *buf ? TRUE : FALSE; -#endif + + return TRUE; } int wxKill(long pid, int sig) @@ -322,7 +377,7 @@ void wxBell(void) //#ifdef __WIN32__ // Beep(1000,1000) ; // 1kHz during 1 sec. //#else - MessageBeep(-1) ; + MessageBeep((UINT)-1) ; //#endif } @@ -1023,3 +1078,70 @@ void OutputDebugStringW95(const char* lpOutputString, ...) #endif + +#ifdef wxUSE_VC_CRTDBG + +// maximum mumber of lines the output console should have +static const WORD MAX_CONSOLE_LINES = 500; + +BOOL WINAPI MyConsoleHandler( DWORD dwCtrlType ) { // control signal type + FreeConsole(); + return TRUE; +} + +void wxRedirectIOToConsole() +{ + int hConHandle; + long lStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + FILE *fp; + + // allocate a console for this app + AllocConsole(); + + // set the screen buffer to be big enough to let us scroll text + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), + &coninfo); + coninfo.dwSize.Y = MAX_CONSOLE_LINES; + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), + coninfo.dwSize); + + // redirect unbuffered STDOUT to the console + lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + if(hConHandle <= 0) return; + fp = _fdopen( hConHandle, "w" ); + *stdout = *fp; + setvbuf( stdout, NULL, _IONBF, 0 ); + + // redirect unbuffered STDIN to the console + lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + if(hConHandle <= 0) return; + fp = _fdopen( hConHandle, "r" ); + *stdin = *fp; + setvbuf( stdin, NULL, _IONBF, 0 ); + + // redirect unbuffered STDERR to the console + lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + if(hConHandle <= 0) return; + fp = _fdopen( hConHandle, "w" ); + *stderr = *fp; + setvbuf( stderr, NULL, _IONBF, 0 ); + + // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog + // point to console as well + ios::sync_with_stdio(); + + SetConsoleCtrlHandler(MyConsoleHandler, TRUE); + +} +#else +// Not supported +void wxRedirectIOToConsole() +{ +} +#endif + +