X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/29d83fc1e5d41ef6adb7984127ce5dc013b09815..6db6bfd1ce8c6c4b06a74e04fad3470ac792a770:/src/os2/utils.cpp diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index cf95be9855..cbec9f74c1 100644 --- a/src/os2/utils.cpp +++ b/src/os2/utils.cpp @@ -6,7 +6,7 @@ // Created: 09/17/99 // RCS-ID: $Id$ // Copyright: (c) David Webster -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx.h". @@ -16,12 +16,11 @@ #include "wx/setup.h" #include "wx/utils.h" #include "wx/app.h" - #include "wx/cursor.h" #endif //WX_PRECOMP #include "wx/os2/private.h" -#include "wx/timer.h" #include "wx/intl.h" +#include "wx/apptrait.h" #include #ifdef __EMX__ @@ -35,45 +34,24 @@ #include #include #include -// -// already defined via nerror.h in app.h so undef them -// -#ifdef EEXIST -#undef EEXIST -#endif -#ifdef ENOENT -#undef ENOENT -#endif -#ifdef EMFILE -#undef EMFILE -#endif -#ifdef EINTR -#undef EINTR -#endif -#ifdef EINVAL -#undef EINVAL -#endif -#ifdef ENOMEM -#undef ENOMEM -#endif -#ifdef EACCES -#undef EACCES -#endif #include #include #define PURE_32 -#ifndef __EMX__ -#include -#include -#include +#if defined(__WATCOMC__) +extern "C" +{ + #include +} +#elif !defined(__EMX__) + #include + #include + #include #endif -static const wxChar WX_SECTION[] = _T("wxWindows"); +static const wxChar WX_SECTION[] = _T("wxWidgets"); static const wxChar eHOSTNAME[] = _T("HostName"); -static const wxChar eUSERID[] = _T("UserId"); -static const wxChar eUSERNAME[] = _T("UserName"); // For the following functions we SHOULD fill in support // for Windows-NT (which I don't know) as I assume it begin @@ -108,55 +86,46 @@ bool wxGetHostName( if ((zSysname = wxGetenv(_T("SYSTEM_NAME"))) == NULL) { - ULONG n = ::PrfQueryProfileString( HINI_PROFILE - ,(PSZ)WX_SECTION - ,(PSZ)eHOSTNAME - ,(PSZ)zDefaultHost - ,(void*)zBuf - ,(ULONG)nMaxSize - 1 - ); + ::PrfQueryProfileString( HINI_PROFILE + ,(PSZ)WX_SECTION + ,(PSZ)eHOSTNAME + ,(PSZ)zDefaultHost + ,(void*)zBuf + ,(ULONG)nMaxSize - 1 + ); } else wxStrncpy(zBuf, zSysname, nMaxSize - 1); zBuf[nMaxSize] = _T('\0'); #endif - return *zBuf ? TRUE : FALSE; + return *zBuf ? true : false; } // Get user ID e.g. jacs -bool wxGetUserId( - wxChar* zBuf -, int nType -) +bool wxGetUserId(wxChar* zBuf, int nType) { -#ifndef __EMX__ - long lrc; +#if defined(__VISAGECPP__) || defined(__WATCOMC__) // UPM procs return 0 on success - lrc = U32ELOCU((unsigned char*)zBuf, (unsigned long *)&nType); - if (lrc == 0) return TRUE; + long lrc = U32ELOCU((PUCHAR)zBuf, (PULONG)&nType); + if (lrc == 0) return true; #endif - return FALSE; + return false; } -bool wxGetUserName( - wxChar* zBuf -, int nMaxSize -) +bool wxGetUserName( wxChar* zBuf, int nMaxSize ) { #ifdef USE_NET_API - wxGetUserId( zBuf - ,nMaxSize - ); + wxGetUserId( zBuf, nMaxSize ); #else wxStrncpy(zBuf, _T("Unknown User"), nMaxSize); #endif - return TRUE; + return true; } -int wxKill( - long lPid -, int nSig -) +int wxKill(long lPid, + wxSignal WXUNUSED(eSig), + wxKillError* WXUNUSED(peError), + int WXUNUSED(flags)) { return((int)::DosKillProcess(0, (PID)lPid)); } @@ -170,7 +139,6 @@ bool wxShell( { wxChar* zShell = _T("CMD.EXE"); wxString sInputs; - wxChar zTmp[255]; STARTDATA SData = {0}; PSZ PgmTitle = "Command Shell"; APIRET rc; @@ -184,9 +152,9 @@ bool wxShell( SData.FgBg = SSF_FGBG_FORE; SData.TraceOpt = SSF_TRACEOPT_NONE; SData.PgmTitle = PgmTitle; - SData.PgmName = zShell; + SData.PgmName = (char*)zShell; - sInputs = "/C " + rCommand; + sInputs = _T("/C ") + rCommand; SData.PgmInputs = (BYTE*)sInputs.c_str(); SData.TermQ = 0; SData.Environment = 0; @@ -221,19 +189,44 @@ bool wxShell( return (rc != 0); } +// Shutdown or reboot the PC +bool wxShutdown(wxShutdownFlags WXUNUSED(wFlags)) +{ + // TODO + return false; +} + +wxPowerType wxGetPowerType() +{ + // TODO + return wxPOWER_UNKNOWN; +} + +wxBatteryState wxGetBatteryState() +{ + // TODO + return wxBATTERY_UNKNOWN_STATE; +} + // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) -long wxGetFreeMemory() +wxMemorySize wxGetFreeMemory() { void* pMemptr = NULL; - ULONG lSize; + LONG lSize; ULONG lMemFlags; APIRET rc; lMemFlags = PAG_FREE; - rc = ::DosQueryMem(pMemptr, &lSize, &lMemFlags); + rc = ::DosQueryMem(pMemptr, (PULONG)&lSize, &lMemFlags); if (rc != 0) - return -1L; - return (long)lSize; + lSize = -1L; + return (wxMemorySize)lSize; +} + +// Get Process ID +unsigned long wxGetProcessId() +{ + return (unsigned long)getpid(); } // ---------------------------------------------------------------------------- @@ -245,14 +238,14 @@ bool wxGetEnv(const wxString& var, wxString *value) // wxGetenv is defined as getenv() wxChar *p = wxGetenv(var); if ( !p ) - return FALSE; + return false; if ( value ) { *value = p; } - return TRUE; + return true; } bool wxSetEnv(const wxString& variable, const wxChar *value) @@ -274,31 +267,24 @@ bool wxSetEnv(const wxString& variable, const wxChar *value) return putenv(buf) == 0; #else // no way to set an env var - return FALSE; + wxUnusedVar(variable); + wxUnusedVar(value); + return false; #endif } - -// Sleep for nSecs seconds. Attempt a Windows implementation using timers. -static bool inTimer = FALSE; - -class wxSleepTimer: public wxTimer +void wxMilliSleep( + unsigned long ulMilliseconds +) { -public: - inline void Notify() - { - inTimer = FALSE; - Stop(); - } -}; - -static wxTimer* wxTheSleepTimer = NULL; + ::DosSleep(ulMilliseconds); +} -void wxUsleep( - unsigned long ulMilliseconds +void wxMicroSleep( + unsigned long ulMicroseconds ) { - ::DosSleep(ulMilliseconds/1000l); + ::DosSleep(ulMicroseconds/1000); } void wxSleep( @@ -314,6 +300,8 @@ void wxFlushEvents() // wxYield(); } +#if WXWIN_COMPATIBILITY_2_2 + // Output a debug mess., in a system dependent fashion. void wxDebugMsg( const wxChar* zFmt ... @@ -335,7 +323,7 @@ void wxError( , const wxString& rTitle ) { - wxBuffer = new wxChar[256]; + wxChar *wxBuffer = new wxChar[256]; wxSprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST rMsg); if (::WinMessageBox( HWND_DESKTOP ,NULL @@ -366,300 +354,42 @@ void wxFatalError( DosExit(EXIT_PROCESS, ulRc); } +#endif // WXWIN_COMPATIBILITY_2_2 + // Emit a beeeeeep void wxBell() { DosBeep(1000,1000); // 1kHz during 1 sec. } -// Chris Breeze 27/5/98: revised WIN32 code to -// detect WindowsNT correctly -int wxGetOsVersion( - int* pMajorVsn -, int* pMinorVsn -) -{ - ULONG ulSysInfo[QSV_MAX] = {0}; - APIRET ulrc; - - ulrc = ::DosQuerySysInfo( 1L - ,QSV_MAX - ,(PVOID)ulSysInfo - ,sizeof(ULONG) * QSV_MAX - ); - if (ulrc == 0L) - { - *pMajorVsn = ulSysInfo[QSV_VERSION_MAJOR]; - *pMajorVsn = *pMajorVsn/10; - *pMinorVsn = ulSysInfo[QSV_VERSION_MINOR]; - return wxWINDOWS_OS2; - } - return wxWINDOWS; // error if we get here, return generic value -} - -// Reading and writing resources (eg WIN.INI, .Xdefaults) -#if wxUSE_RESOURCES -bool wxWriteResource( - const wxString& rSection -, const wxString& rEntry -, const wxString& rValue -, const wxString& rFile -) -{ - HAB hab = 0; - HINI hIni = 0; - - if (rFile != "") - { - hIni = ::PrfOpenProfile(hab, (PSZ)WXSTRINGCAST rFile); - if (hIni != 0L) - { - return (::PrfWriteProfileString( hIni - ,(PSZ)WXSTRINGCAST rSection - ,(PSZ)WXSTRINGCAST rEntry - ,(PSZ)WXSTRINGCAST rValue - )); - } - } - else - return (::PrfWriteProfileString( HINI_PROFILE - ,(PSZ)WXSTRINGCAST rSection - ,(PSZ)WXSTRINGCAST rEntry - ,(PSZ)WXSTRINGCAST rValue - )); - return FALSE; -} - -bool wxWriteResource( - const wxString& rSection -, const wxString& rEntry -, float fValue -, const wxString& rFile -) -{ - wxChar zBuf[50]; - - wxSprintf(zBuf, "%.4f", fValue); - return wxWriteResource( rSection - ,rEntry - ,zBuf - ,rFile - ); -} - -bool wxWriteResource( - const wxString& rSection -, const wxString& rEntry -, long lValue -, const wxString& rFile -) -{ - wxChar zBuf[50]; - - wxSprintf(zBuf, "%ld", lValue); - return wxWriteResource( rSection - ,rEntry - ,zBuf - ,rFile - ); -} - -bool wxWriteResource( - const wxString& rSection -, const wxString& rEntry -, int lValue -, const wxString& rFile -) -{ - wxChar zBuf[50]; - - wxSprintf(zBuf, "%d", lValue); - return wxWriteResource( rSection - ,rEntry - ,zBuf - ,rFile - ); -} - -bool wxGetResource( - const wxString& rSection -, const wxString& rEntry -, wxChar** ppValue -, const wxString& rFile -) -{ - HAB hab = 0; - HINI hIni = 0; - wxChar zDefunkt[] = _T("$$default"); - char zBuf[1000]; - - if (rFile != "") - { - hIni = ::PrfOpenProfile(hab, (PSZ)WXSTRINGCAST rFile); - if (hIni != 0L) - { - ULONG n = ::PrfQueryProfileString( hIni - ,(PSZ)WXSTRINGCAST rSection - ,(PSZ)WXSTRINGCAST rEntry - ,(PSZ)zDefunkt - ,(PVOID)zBuf - ,1000 - ); - if (zBuf == NULL) - return FALSE; - if (n == 0L || wxStrcmp(zBuf, zDefunkt) == 0) - return FALSE; - zBuf[n-1] = '\0'; - } - else - return FALSE; - } - else - { - ULONG n = ::PrfQueryProfileString( HINI_PROFILE - ,(PSZ)WXSTRINGCAST rSection - ,(PSZ)WXSTRINGCAST rEntry - ,(PSZ)zDefunkt - ,(PVOID)zBuf - ,1000 - ); - if (zBuf == NULL) - return FALSE; - if (n == 0L || wxStrcmp(zBuf, zDefunkt) == 0) - return FALSE; - zBuf[n-1] = '\0'; - } - strcpy((char*)*ppValue, zBuf); - return TRUE; -} - -bool wxGetResource( - const wxString& rSection -, const wxString& rEntry -, float* pValue -, const wxString& rFile -) -{ - wxChar* zStr = NULL; - - zStr = new wxChar[1000]; - bool bSucc = wxGetResource( rSection - ,rEntry - ,(wxChar **)&zStr - ,rFile - ); - - if (bSucc) - { - *pValue = (float)wxStrtod(zStr, NULL); - delete[] zStr; - return TRUE; - } - else - { - delete[] zStr; - return FALSE; - } -} - -bool wxGetResource( - const wxString& rSection -, const wxString& rEntry -, long* pValue -, const wxString& rFile -) -{ - wxChar* zStr = NULL; - - zStr = new wxChar[1000]; - bool bSucc = wxGetResource( rSection - ,rEntry - ,(wxChar **)&zStr - ,rFile - ); - if (bSucc) - { - *pValue = wxStrtol(zStr, NULL, 10); - delete[] zStr; - return TRUE; - } - else - { - delete[] zStr; - return FALSE; - } -} - -bool wxGetResource( - const wxString& rSection -, const wxString& rEntry -, int* pValue -, const wxString& rFile -) +void wxAppTraits::InitializeGui(unsigned long &WXUNUSED(ulHab)) { - wxChar* zStr = NULL; - - zStr = new wxChar[1000]; - bool bSucc = wxGetResource( rSection - ,rEntry - ,(wxChar **)&zStr - ,rFile - ); - - if (bSucc) - { - *pValue = (int)wxStrtol(zStr, NULL, 10); - delete[] zStr; - return TRUE; - } - else - { - delete[] zStr; - return FALSE; - } } -#endif // wxUSE_RESOURCES - -// --------------------------------------------------------------------------- -// helper functions for showing a "busy" cursor -// --------------------------------------------------------------------------- -HCURSOR gs_wxBusyCursor = 0; // new, busy cursor -HCURSOR gs_wxBusyCursorOld = 0; // old cursor -static int gs_wxBusyCursorCount = 0; - -// Set the cursor to the busy cursor for all windows -void wxBeginBusyCursor( - wxCursor* pCursor -) +void wxAppTraits::TerminateGui(unsigned long WXUNUSED(ulHab)) { - if ( gs_wxBusyCursorCount++ == 0 ) - { - gs_wxBusyCursor = (HCURSOR)pCursor->GetHCURSOR(); - ::WinSetPointer(HWND_DESKTOP, (HPOINTER)gs_wxBusyCursor); - } - //else: nothing to do, already set } -// Restore cursor to normal -void wxEndBusyCursor() +wxToolkitInfo & wxConsoleAppTraits::GetToolkitInfo() { - wxCHECK_RET( gs_wxBusyCursorCount > 0 - ,_T("no matching wxBeginBusyCursor() for wxEndBusyCursor()") - ); + static wxToolkitInfo vInfo; + ULONG ulSysInfo[QSV_MAX] = {0}; + APIRET ulrc; - if (--gs_wxBusyCursorCount == 0) + vInfo.name = _T("wxBase"); + ulrc = ::DosQuerySysInfo( 1L + ,QSV_MAX + ,(PVOID)ulSysInfo + ,sizeof(ULONG) * QSV_MAX + ); + if (ulrc == 0L) { - ::WinSetPointer(HWND_DESKTOP, (HPOINTER)gs_wxBusyCursorOld); - gs_wxBusyCursorOld = 0; + vInfo.versionMajor = ulSysInfo[QSV_VERSION_MAJOR] / 10; + vInfo.versionMinor = ulSysInfo[QSV_VERSION_MINOR]; } -} - -// TRUE if we're between the above two calls -bool wxIsBusy() -{ - return (gs_wxBusyCursorCount > 0); + vInfo.os = wxOS2_PM; + return vInfo; } // --------------------------------------------------------------------------- @@ -670,32 +400,40 @@ const wxChar* wxGetHomeDir( wxString& rStrDir = *pStr; // OS/2 has no idea about home, - // so use the working directory instead? + // so use the working directory instead. + // However, we might have a valid HOME directory, + // as is used on many machines that have unix utilities + // on them, so we should use that, if available. // 256 was taken from os2def.h #ifndef MAX_PATH # define MAX_PATH 256 #endif - char zDirName[256]; - ULONG ulDirLen; + const wxChar *szHome = wxGetenv((wxChar*)"HOME"); + if ( szHome == NULL ) { + // we're homeless, use current directory. + rStrDir = wxT("."); + } + else + rStrDir = szHome; - ::DosQueryCurrentDir(0, zDirName, &ulDirLen); - rStrDir = zDirName; return rStrDir.c_str(); } // Hack for OS/2 -wxChar* wxGetUserHome ( - const wxString& rUser -) +#if wxUSE_UNICODE +const wxMB2WXbuf wxGetUserHome( const wxString &rUser ) +#else // just for binary compatibility -- there is no 'const' here +wxChar* wxGetUserHome ( const wxString &rUser ) +#endif { wxChar* zHome; wxString sUser1(rUser); - wxBuffer = new wxChar[256]; + wxChar *wxBuffer = new wxChar[256]; #ifndef __EMX__ - if (sUser1 != _T("")) + if (!sUser1.empty()) { wxChar zTmp[64]; @@ -717,208 +455,28 @@ wxChar* wxGetUserHome ( } } #endif - if (sUser1 == _T("")) + if (sUser1.empty()) { if ((zHome = wxGetenv(_T("HOME"))) != NULL) { wxStrcpy(wxBuffer, zHome); - Unix2DosFilename(wxBuffer); + wxUnix2DosFilename(wxBuffer); +#if wxUSE_UNICODE + wxWCharBuffer retBuffer (wxBuffer); + delete[] wxBuffer; + return retBuffer; +#else wxStrcpy(zHome, wxBuffer); delete[] wxBuffer; return zHome; +#endif } } delete[] wxBuffer; - return NULL; // No home known! + return (wxChar*)wxEmptyString; // No home known! } -// Check whether this window wants to process messages, e.g. Stop button -// in long calculations. -bool wxCheckForInterrupt( - wxWindow* pWnd -) -{ - if(pWnd) - { - QMSG vMsg; - HAB hab = 0; - HWND hwndFilter = NULLHANDLE; - HWND hwndWin= (HWND) pWnd->GetHWND(); - - while(::WinPeekMsg(hab, &vMsg, hwndFilter, 0, 0, PM_REMOVE)) - { - ::WinDispatchMsg(hab, &vMsg); - } - return TRUE;//*** temporary? - } - else - { - wxFAIL_MSG(_T("pWnd==NULL !!!")); - return FALSE;//*** temporary? - } -} - -void wxGetMousePosition( - int* pX -, int* pY -) -{ - POINTL vPt; - - ::WinQueryPointerPos(HWND_DESKTOP, &vPt); - *pX = vPt.x; - *pY = vPt.y; -}; - -// Return TRUE if we have a colour display -bool wxColourDisplay() -{ - HPS hpsScreen; - HDC hdcScreen; - LONG lColors; - - hpsScreen = ::WinGetScreenPS(HWND_DESKTOP); - hdcScreen = ::GpiQueryDevice(hpsScreen); - ::DevQueryCaps(hdcScreen, CAPS_COLORS, 1L, &lColors); - return(lColors > 1L); -} - -// Returns depth of screen -int wxDisplayDepth() -{ - HPS hpsScreen; - HDC hdcScreen; - LONG lPlanes; - LONG lBitsPerPixel; - LONG nDepth; - - hpsScreen = ::WinGetScreenPS(HWND_DESKTOP); - hdcScreen = ::GpiQueryDevice(hpsScreen); - ::DevQueryCaps(hdcScreen, CAPS_COLOR_PLANES, 1L, &lPlanes); - ::DevQueryCaps(hdcScreen, CAPS_COLOR_BITCOUNT, 1L, &lBitsPerPixel); - - nDepth = (int)(lPlanes * lBitsPerPixel); - DevCloseDC(hdcScreen); - return (nDepth); -} - -// Get size of display -void wxDisplaySize( - int* pWidth -, int* pHeight -) -{ - HPS hpsScreen; - HDC hdcScreen; - LONG lWidth; - LONG lHeight; - - hpsScreen = ::WinGetScreenPS(HWND_DESKTOP); - hdcScreen = ::GpiQueryDevice(hpsScreen); - ::DevQueryCaps(hdcScreen, CAPS_WIDTH, 1L, &lWidth); - ::DevQueryCaps(hdcScreen, CAPS_HEIGHT, 1L, &lHeight); - DevCloseDC(hdcScreen); - *pWidth = (int)lWidth; - *pHeight = (int)lHeight; -} - -void wxDisplaySizeMM( - int* pWidth -, int* pHeight -) -{ - HPS hpsScreen; - HDC hdcScreen; - - hpsScreen = ::WinGetScreenPS(HWND_DESKTOP); - hdcScreen = ::GpiQueryDevice(hpsScreen); - - if (pWidth) - ::DevQueryCaps( hdcScreen - ,CAPS_HORIZONTAL_RESOLUTION - ,1L - ,(PLONG)pWidth - ); - if (pHeight) - ::DevQueryCaps( hdcScreen - ,CAPS_VERTICAL_RESOLUTION - ,1L - ,(PLONG)pHeight - ); -} - -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ - // This is supposed to return desktop dimensions minus any window - // manager panels, menus, taskbars, etc. If there is a way to do that - // for this platform please fix this function, otherwise it defaults - // to the entire desktop. - if (x) *x = 0; - if (y) *y = 0; - wxDisplaySize(width, height); -} - - -bool wxDirExists( - const wxString& rDir -) -{ - return (::DosSetCurrentDir(WXSTRINGCAST rDir)); -} - -// --------------------------------------------------------------------------- -// window information functions -// --------------------------------------------------------------------------- - -wxString WXDLLEXPORT wxGetWindowText( - WXHWND hWnd -) -{ - wxString vStr; - long lLen = ::WinQueryWindowTextLength((HWND)hWnd) + 1; - - ::WinQueryWindowText((HWND)hWnd, lLen, vStr.GetWriteBuf((int)lLen)); - vStr.UngetWriteBuf(); - - return vStr; -} - -wxString WXDLLEXPORT wxGetWindowClass( - WXHWND hWnd -) -{ - wxString vStr; - int nLen = 256; // some starting value - - for ( ;; ) - { - int nCount = ::WinQueryClassName((HWND)hWnd, nLen, vStr.GetWriteBuf(nLen)); - - vStr.UngetWriteBuf(); - if (nCount == nLen ) - { - // the class name might have been truncated, retry with larger - // buffer - nLen *= 2; - } - else - { - break; - } - } - return vStr; -} - -WXWORD WXDLLEXPORT wxGetWindowId( - WXHWND hWnd -) -{ - return ::WinQueryWindowUShort((HWND)hWnd, QWS_ID); -} - -wxString WXDLLEXPORT wxPMErrorToStr( - ERRORID vError -) +wxString WXDLLEXPORT wxPMErrorToStr(ERRORID vError) { wxString sError; @@ -974,4 +532,11 @@ wxString WXDLLEXPORT wxPMErrorToStr( return(sError); } // end of wxPMErrorToStr +// replacement for implementation in unix/utilsunx.cpp, +// to be used by all X11 based ports. +struct wxEndProcessData; +void wxHandleProcessTermination(wxEndProcessData *WXUNUSED(proc_data)) +{ + // For now, just do nothing. To be filled in as needed. +}