X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/10e5b9303b7faa4db7f5c0772c18fe093759f05a..6d9022fe3bb50a75b9b5eaf5cf32558e518ba310:/src/os2/utils.cpp diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index fc30b63a6e..5ac046f10a 100644 --- a/src/os2/utils.cpp +++ b/src/os2/utils.cpp @@ -24,7 +24,9 @@ #include "wx/intl.h" #include -#include +#ifdef __EMX__ +#include +#endif #include "wx/log.h" @@ -36,15 +38,13 @@ #include #include -#define INCL_DOS -#define INCL_PM -#define INCL_GPI -#include -#include #define PURE_32 + +#ifndef __EMX__ #include #include #include +#endif static const wxChar WX_SECTION[] = _T("wxWindows"); static const wxChar eHOSTNAME[] = _T("HostName"); @@ -65,10 +65,10 @@ bool wxGetHostName( #if wxUSE_NET_API char zServer[256]; char zComputer[256]; - unsigned long ulLevel; - unsigned char* zBuffer; - unsigned long ulBuffer; - unsigned long* pulTotalAvail; + unsigned long ulLevel = 0; + unsigned char* zBuffer = NULL; + unsigned long ulBuffer = 256; + unsigned long* pulTotalAvail = NULL; NetBios32GetInfo( (const unsigned char*)zServer ,(const unsigned char*)zComputer @@ -102,10 +102,16 @@ bool wxGetHostName( // Get user ID e.g. jacs bool wxGetUserId( wxChar* zBuf -, int nMaxSize +, int nType ) { - return(U32ELOCL((unsigned char*)zBuf, (unsigned long *)&nMaxSize)); +#if defined(__VISAGECPP__) + long lrc; + // UPM procs return 0 on success + lrc = U32ELOCU((unsigned char*)zBuf, (unsigned long *)&nType); + if (lrc == 0) return TRUE; +#endif + return FALSE; } bool wxGetUserName( @@ -125,7 +131,8 @@ bool wxGetUserName( int wxKill( long lPid -, int nSig +, wxSignal eSig +, wxKillError* peError ) { return((int)::DosKillProcess(0, (PID)lPid)); @@ -138,30 +145,63 @@ bool wxShell( const wxString& rCommand ) { - wxChar* zShell; - - if ((zShell = wxGetenv(_T("COMSPEC"))) == NULL) - zShell = _T("\\CMD.EXE"); - + wxChar* zShell = _T("CMD.EXE"); + wxString sInputs; wxChar zTmp[255]; + STARTDATA SData = {0}; + PSZ PgmTitle = "Command Shell"; + APIRET rc; + PID vPid = 0; + ULONG ulSessID = 0; + UCHAR achObjBuf[256] = {0}; //error data if DosStart fails + RESULTCODES vResult; + + SData.Length = sizeof(STARTDATA); + SData.Related = SSF_RELATED_INDEPENDENT; + SData.FgBg = SSF_FGBG_FORE; + SData.TraceOpt = SSF_TRACEOPT_NONE; + SData.PgmTitle = PgmTitle; + SData.PgmName = zShell; + + sInputs = "/C " + rCommand; + SData.PgmInputs = (BYTE*)sInputs.c_str(); + SData.TermQ = 0; + SData.Environment = 0; + SData.InheritOpt = SSF_INHERTOPT_SHELL; + SData.SessionType = SSF_TYPE_WINDOWABLEVIO; + SData.IconFile = 0; + SData.PgmHandle = 0; + SData.PgmControl = SSF_CONTROL_VISIBLE | SSF_CONTROL_MAXIMIZE; + SData.InitXPos = 30; + SData.InitYPos = 40; + SData.InitXSize = 200; + SData.InitYSize = 140; + SData.Reserved = 0; + SData.ObjectBuffer = (char*)achObjBuf; + SData.ObjectBuffLen = (ULONG)sizeof(achObjBuf); + + rc = ::DosStartSession(&SData, &ulSessID, &vPid); + if (rc == 0 || rc == 457) // NO_ERROR or SMG_START_IN_BACKGROUND + { + PTIB ptib; + PPIB ppib; - if (rCommand != "") - wxSprintf( zTmp - ,"%s /c %s" - ,zShell - ,WXSTRINGCAST rCommand - ); - else - wxStrcpy(zTmp, zShell); + ::DosGetInfoBlocks(&ptib, &ppib); - return (wxExecute((wxChar*)zTmp, FALSE) != 0); + ::DosWaitChild( DCWA_PROCESS + ,DCWW_WAIT + ,&vResult + ,&ppib->pib_ulpid + ,vPid + ); + } + return (rc != 0); } // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) -long wxGetFreeMemory( - void* pMemptr -) +long wxGetFreeMemory() { + void* pMemptr = NULL; ULONG lSize; ULONG lMemFlags; APIRET rc; @@ -173,6 +213,49 @@ long wxGetFreeMemory( return (long)lSize; } +// ---------------------------------------------------------------------------- +// env vars +// ---------------------------------------------------------------------------- + +bool wxGetEnv(const wxString& var, wxString *value) +{ + // wxGetenv is defined as getenv() + wxChar *p = wxGetenv(var); + if ( !p ) + return FALSE; + + if ( value ) + { + *value = p; + } + + return TRUE; +} + +bool wxSetEnv(const wxString& variable, const wxChar *value) +{ +#if defined(HAVE_SETENV) + return setenv(variable.mb_str(), value ? wxString(value).mb_str().data() + : NULL, 1 /* overwrite */) == 0; +#elif defined(HAVE_PUTENV) + wxString s = variable; + if ( value ) + s << _T('=') << value; + + // transform to ANSI + const char *p = s.mb_str(); + + // the string will be free()d by libc + char *buf = (char *)malloc(strlen(p) + 1); + strcpy(buf, p); + + return putenv(buf) == 0; +#else // no way to set an env var + return FALSE; +#endif +} + + // Sleep for nSecs seconds. Attempt a Windows implementation using timers. static bool inTimer = FALSE; @@ -192,7 +275,7 @@ void wxUsleep( unsigned long ulMilliseconds ) { - ::DosSleep(ulMilliseconds); + ::DosSleep(ulMilliseconds/1000l); } void wxSleep( @@ -208,6 +291,8 @@ void wxFlushEvents() // wxYield(); } +#if WXWIN_COMPATIBILITY_2_2 + // Output a debug mess., in a system dependent fashion. void wxDebugMsg( const wxChar* zFmt ... @@ -229,6 +314,7 @@ void wxError( , const wxString& rTitle ) { + wxBuffer = new wxChar[256]; wxSprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST rMsg); if (::WinMessageBox( HWND_DESKTOP ,NULL @@ -237,6 +323,7 @@ void wxError( ,0 ,MB_ICONEXCLAMATION | MB_YESNO ) == MBID_YES) + delete[] wxBuffer; wxExit(); } @@ -258,6 +345,8 @@ void wxFatalError( DosExit(EXIT_PROCESS, ulRc); } +#endif // WXWIN_COMPATIBILITY_2_2 + // Emit a beeeeeep void wxBell() { @@ -272,14 +361,17 @@ int wxGetOsVersion( ) { ULONG ulSysInfo[QSV_MAX] = {0}; - - if (::DosQuerySysInfo( 1L - ,QSV_MAX - ,(PVOID)ulSysInfo - ,sizeof(ULONG) * QSV_MAX - )) + 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; } @@ -295,8 +387,8 @@ bool wxWriteResource( , const wxString& rFile ) { - HAB hab; - HINI hIni; + HAB hab = 0; + HINI hIni = 0; if (rFile != "") { @@ -336,40 +428,69 @@ bool wxWriteResource( ); } -bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file) +bool wxWriteResource( + const wxString& rSection +, const wxString& rEntry +, long lValue +, const wxString& rFile +) { - wxChar buf[50]; - wxSprintf(buf, "%ld", value); - return wxWriteResource(section, entry, buf, file); + wxChar zBuf[50]; + + wxSprintf(zBuf, "%ld", lValue); + return wxWriteResource( rSection + ,rEntry + ,zBuf + ,rFile + ); } -bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file) +bool wxWriteResource( + const wxString& rSection +, const wxString& rEntry +, int lValue +, const wxString& rFile +) { - wxChar buf[50]; - wxSprintf(buf, "%d", value); - return wxWriteResource(section, entry, buf, file); + wxChar zBuf[50]; + + wxSprintf(zBuf, "%d", lValue); + return wxWriteResource( rSection + ,rEntry + ,zBuf + ,rFile + ); } -bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file) +bool wxGetResource( + const wxString& rSection +, const wxString& rEntry +, wxChar** ppValue +, const wxString& rFile +) { - HAB hab; - HINI hIni; - static const wxChar defunkt[] = _T("$$default"); + HAB hab = 0; + HINI hIni = 0; + wxChar zDefunkt[] = _T("$$default"); + char zBuf[1000]; - if (file != "") + if (rFile != "") { - hIni = ::PrfOpenProfile(hab, (PSZ)WXSTRINGCAST file); + hIni = ::PrfOpenProfile(hab, (PSZ)WXSTRINGCAST rFile); if (hIni != 0L) { ULONG n = ::PrfQueryProfileString( hIni - ,(PSZ)WXSTRINGCAST section - ,(PSZ)WXSTRINGCAST entry - ,(PSZ)defunkt - ,(void*)wxBuffer + ,(PSZ)WXSTRINGCAST rSection + ,(PSZ)WXSTRINGCAST rEntry + ,(PSZ)zDefunkt + ,(PVOID)zBuf ,1000 ); - if (n == 0L || wxStrcmp(wxBuffer, defunkt) == 0) + if (zBuf == NULL) return FALSE; + if (n == 0L || wxStrcmp(zBuf, zDefunkt) == 0) + return FALSE; + zBuf[n-1] = '\0'; } else return FALSE; @@ -377,58 +498,107 @@ bool wxGetResource(const wxString& section, const wxString& entry, wxChar **valu else { ULONG n = ::PrfQueryProfileString( HINI_PROFILE - ,(PSZ)WXSTRINGCAST section - ,(PSZ)WXSTRINGCAST entry - ,(PSZ)defunkt - ,(void*)wxBuffer + ,(PSZ)WXSTRINGCAST rSection + ,(PSZ)WXSTRINGCAST rEntry + ,(PSZ)zDefunkt + ,(PVOID)zBuf ,1000 ); - if (n == 0L || wxStrcmp(wxBuffer, defunkt) == 0) + if (zBuf == NULL) + return FALSE; + if (n == 0L || wxStrcmp(zBuf, zDefunkt) == 0) return FALSE; + zBuf[n-1] = '\0'; } - if (*value) - delete[] (*value); - *value = copystring(wxBuffer); + strcpy((char*)*ppValue, zBuf); return TRUE; } -bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file) +bool wxGetResource( + const wxString& rSection +, const wxString& rEntry +, float* pValue +, const wxString& rFile +) { - 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; + 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& section, const wxString& entry, long *value, const wxString& file) +bool wxGetResource( + const wxString& rSection +, const wxString& rEntry +, long* pValue +, const wxString& rFile +) { - 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; + 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& section, const wxString& entry, int *value, const wxString& file) +bool wxGetResource( + const wxString& rSection +, const wxString& rEntry +, int* pValue +, const wxString& rFile +) { - 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; + 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 @@ -441,11 +611,13 @@ HCURSOR gs_wxBusyCursorOld = 0; // old cursor static int gs_wxBusyCursorCount = 0; // Set the cursor to the busy cursor for all windows -void wxBeginBusyCursor(wxCursor *cursor) +void wxBeginBusyCursor( + wxCursor* pCursor +) { if ( gs_wxBusyCursorCount++ == 0 ) { - gs_wxBusyCursor = (HCURSOR)cursor->GetHCURSOR(); + gs_wxBusyCursor = (HCURSOR)pCursor->GetHCURSOR(); ::WinSetPointer(HWND_DESKTOP, (HPOINTER)gs_wxBusyCursor); } //else: nothing to do, already set @@ -454,10 +626,11 @@ void wxBeginBusyCursor(wxCursor *cursor) // Restore cursor to normal void wxEndBusyCursor() { - wxCHECK_RET( gs_wxBusyCursorCount > 0, - _T("no matching wxBeginBusyCursor() for wxEndBusyCursor()")); + wxCHECK_RET( gs_wxBusyCursorCount > 0 + ,_T("no matching wxBeginBusyCursor() for wxEndBusyCursor()") + ); - if ( --gs_wxBusyCursorCount == 0 ) + if (--gs_wxBusyCursorCount == 0) { ::WinSetPointer(HWND_DESKTOP, (HPOINTER)gs_wxBusyCursorOld); gs_wxBusyCursorOld = 0; @@ -467,188 +640,659 @@ void wxEndBusyCursor() // TRUE if we're between the above two calls bool wxIsBusy() { - return (gs_wxBusyCursorCount > 0); + return (gs_wxBusyCursorCount > 0); } // --------------------------------------------------------------------------- -const wxChar* wxGetHomeDir(wxString *pstr) +const wxChar* wxGetHomeDir( + wxString* pStr +) { - wxString& strDir = *pstr; + wxString& rStrDir = *pStr; - // OS/2 has no idea about home, - // so use the working directory instead? + // OS/2 has no idea about home, + // so use the working directory instead? - // 256 was taken from os2def.h + // 256 was taken from os2def.h #ifndef MAX_PATH # define MAX_PATH 256 #endif + char zDirName[256]; + ULONG ulDirLen; - char DirName[256]; - ULONG DirLen; - - ::DosQueryCurrentDir( 0, DirName, &DirLen); - strDir = DirName; - return strDir.c_str(); + ::DosQueryCurrentDir(0, zDirName, &ulDirLen); + rStrDir = zDirName; + return rStrDir.c_str(); } // Hack for OS/2 -wxChar *wxGetUserHome (const wxString& user) -{ - wxChar *home; - wxString user1(user); - - if (user1 != _T("")) { - wxChar tmp[64]; - if (wxGetUserId(tmp, sizeof(tmp)/sizeof(char))) { - // Guests belong in the temp dir - if (wxStricmp(tmp, _T("annonymous")) == 0) { - if ((home = wxGetenv(_T("TMP"))) != NULL || - (home = wxGetenv(_T("TMPDIR"))) != NULL || - (home = wxGetenv(_T("TEMP"))) != NULL) - return *home ? home : (wxChar*)_T("\\"); - } - if (wxStricmp(tmp, WXSTRINGCAST user1) == 0) - user1 = _T(""); - } - } - if (user1 == _T("")) - if ((home = wxGetenv(_T("HOME"))) != NULL) +wxChar* wxGetUserHome ( + const wxString& rUser +) +{ + wxChar* zHome; + wxString sUser1(rUser); + + wxBuffer = new wxChar[256]; +#ifndef __EMX__ + if (sUser1 != _T("")) { - wxStrcpy(wxBuffer, home); - Unix2DosFilename(wxBuffer); - return wxBuffer; + wxChar zTmp[64]; + + if (wxGetUserId( zTmp + ,sizeof(zTmp)/sizeof(char) + )) + { + // Guests belong in the temp dir + if (wxStricmp(zTmp, _T("annonymous")) == 0) + { + if ((zHome = wxGetenv(_T("TMP"))) != NULL || + (zHome = wxGetenv(_T("TMPDIR"))) != NULL || + (zHome = wxGetenv(_T("TEMP"))) != NULL) + delete[] wxBuffer; + return *zHome ? zHome : (wxChar*)_T("\\"); + } + if (wxStricmp(zTmp, WXSTRINGCAST sUser1) == 0) + sUser1 = _T(""); + } + } +#endif + if (sUser1 == _T("")) + { + if ((zHome = wxGetenv(_T("HOME"))) != NULL) + { + wxStrcpy(wxBuffer, zHome); + Unix2DosFilename(wxBuffer); + wxStrcpy(zHome, wxBuffer); + delete[] wxBuffer; + return zHome; + } } - return NULL; // No home known! + delete[] wxBuffer; + return NULL; // No home known! } // Check whether this window wants to process messages, e.g. Stop button // in long calculations. -bool wxCheckForInterrupt(wxWindow *wnd) +bool wxCheckForInterrupt( + wxWindow* pWnd +) { - if(wnd){ - QMSG msg; - HAB hab; - HWND hwndFilter; + if(pWnd) + { + QMSG vMsg; + HAB hab = 0; + HWND hwndFilter = NULLHANDLE; + HWND hwndWin= (HWND) pWnd->GetHWND(); - HWND win= (HWND) wnd->GetHWND(); - while(::WinPeekMsg(hab,&msg,hwndFilter,0,0,PM_REMOVE)) + while(::WinPeekMsg(hab, &vMsg, hwndFilter, 0, 0, PM_REMOVE)) + { + ::WinDispatchMsg(hab, &vMsg); + } + return TRUE;//*** temporary? + } + else { - ::WinDispatchMsg( hab, &msg ); + wxFAIL_MSG(_T("pWnd==NULL !!!")); + return FALSE;//*** temporary? } - return TRUE;//*** temporary? - } - else{ - wxFAIL_MSG(_T("wnd==NULL !!!")); - - return FALSE;//*** temporary? - } } -void wxGetMousePosition( int* x, int* y ) +void wxGetMousePosition( + int* pX +, int* pY +) { - POINTL pt; - ::WinQueryPointerPos( HWND_DESKTOP, & pt ); - *x = pt.x; - *y = pt.y; + POINTL vPt; + + ::WinQueryPointerPos(HWND_DESKTOP, &vPt); + *pX = vPt.x; + *pY = vPt.y; }; // Return TRUE if we have a colour display bool wxColourDisplay() { - bool flag; - // TODO: use DosQueryDevCaps to figure it out - return flag; +#if 0 + HPS hpsScreen; + HDC hdcScreen; + LONG lColors; + + hpsScreen = ::WinGetScreenPS(HWND_DESKTOP); + hdcScreen = ::GpiQueryDevice(hpsScreen); + ::DevQueryCaps(hdcScreen, CAPS_COLORS, 1L, &lColors); + return(lColors > 1L); +#else + // I don't see how the PM display could not be color. Besides, this + // was leaking DCs and PSs!!! MN + return TRUE; +#endif } // Returns depth of screen int wxDisplayDepth() { - HDC hDc = ::WinOpenWindowDC((HWND)NULL); - long lArray[CAPS_COLOR_BITCOUNT]; - int nPlanes; - int nBitsPerPixel; - int nDepth; - - if(DevQueryCaps( hDc - ,CAPS_FAMILY - ,CAPS_COLOR_BITCOUNT - ,lArray - )) - { - nPlanes = (int)lArray[CAPS_COLOR_PLANES]; - nBitsPerPixel = (int)lArray[CAPS_COLOR_BITCOUNT]; - nDepth = nPlanes * nBitsPerPixel; + HPS hpsScreen; + HDC hdcScreen; + LONG lPlanes; + LONG lBitsPerPixel; + static LONG nDepth = 0; + + // The screen colordepth ain't gonna change. No reason to query + // it over and over! + if (!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); + ::WinReleasePS(hpsScreen); } - DevCloseDC(hDc); return (nDepth); } // Get size of display -void wxDisplaySize(int *width, int *height) +void wxDisplaySize( + int* pWidth +, int* pHeight +) { - HDC hDc = ::WinOpenWindowDC((HWND)NULL); - long lArray[CAPS_HEIGHT]; - - if(DevQueryCaps( hDc - ,CAPS_FAMILY - ,CAPS_HEIGHT - ,lArray - )) - { - *width = (int)lArray[CAPS_WIDTH]; - *height = (int)lArray[CAPS_HEIGHT]; + HPS hpsScreen; + HDC hdcScreen; + static LONG lWidth = 0; + static LONG lHeight = 0; + + // The screen size ain't gonna change either so just cache the values + if (!lWidth) { + hpsScreen = ::WinGetScreenPS(HWND_DESKTOP); + hdcScreen = ::GpiQueryDevice(hpsScreen); + ::DevQueryCaps(hdcScreen, CAPS_WIDTH, 1L, &lWidth); + ::DevQueryCaps(hdcScreen, CAPS_HEIGHT, 1L, &lHeight); + ::DevCloseDC(hdcScreen); + ::WinReleasePS(hpsScreen); } - DevCloseDC(hDc); + *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 + ); + ::DevCloseDC(hdcScreen); + ::WinReleasePS(hpsScreen); } -bool wxDirExists(const wxString& dir) +void wxClientDisplayRect(int *x, int *y, int *width, int *height) { - // TODO: Control program file stuff - return TRUE; + // 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 WXDLLEXPORT wxGetWindowText( + WXHWND hWnd +) { - wxString str; - long len = ::WinQueryWindowTextLength((HWND)hWnd) + 1; - ::WinQueryWindowText((HWND)hWnd, len, str.GetWriteBuf((int)len)); - str.UngetWriteBuf(); + wxString vStr; + long lLen = ::WinQueryWindowTextLength((HWND)hWnd) + 1; + + ::WinQueryWindowText((HWND)hWnd, lLen, vStr.GetWriteBuf((int)lLen)); + vStr.UngetWriteBuf(); - return str; + return vStr; } -wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd) +wxString WXDLLEXPORT wxGetWindowClass( + WXHWND hWnd +) { - wxString str; - - int len = 256; // some starting value + wxString vStr; + int nLen = 256; // some starting value for ( ;; ) { - int count = ::WinQueryClassName((HWND)hWnd, len, str.GetWriteBuf(len)); + int nCount = ::WinQueryClassName((HWND)hWnd, nLen, vStr.GetWriteBuf(nLen)); - str.UngetWriteBuf(); - if ( count == len ) + vStr.UngetWriteBuf(); + if (nCount == nLen ) { // the class name might have been truncated, retry with larger // buffer - len *= 2; + nLen *= 2; } else { break; } } - return str; + return vStr; } -WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd) +WXWORD WXDLLEXPORT wxGetWindowId( + WXHWND hWnd +) { return ::WinQueryWindowUShort((HWND)hWnd, QWS_ID); } +wxString WXDLLEXPORT wxPMErrorToStr( + ERRORID vError +) +{ + wxString sError; + + // + // Remove the high order byte -- it is useless + // + vError &= 0x0000ffff; + switch(vError) + { + case PMERR_INVALID_HWND: + sError = wxT("Invalid window handle specified"); + break; + + case PMERR_INVALID_FLAG: + sError = wxT("Invalid flag bit set"); + break; + + case PMERR_NO_MSG_QUEUE: + sError = wxT("No message queue available"); + break; + + case PMERR_INVALID_PARM: + sError = wxT("Parameter contained invalid data"); + break; + + case PMERR_INVALID_PARAMETERS: + sError = wxT("Parameter value is out of range"); + break; + + case PMERR_PARAMETER_OUT_OF_RANGE: + sError = wxT("Parameter value is out of range"); + break; + + case PMERR_INVALID_INTEGER_ATOM: + sError = wxT("Not a valid atom"); + break; + + case PMERR_INVALID_HATOMTBL: + sError = wxT("Atom table handle is invalid"); + break; + + case PMERR_INVALID_ATOM_NAME: + sError = wxT("Not a valid atom name"); + break; + + case PMERR_ATOM_NAME_NOT_FOUND: + sError = wxT("Valid name format, but cannot find name in atom table"); + break; + + default: + sError = wxT("Unknown error"); + } + return(sError); +} // end of wxPMErrorToStr + +void wxDrawBorder( + HPS hPS +, RECTL& rRect +, WXDWORD dwStyle +) +{ + POINTL vPoint[2]; + + vPoint[0].x = rRect.xLeft; + vPoint[0].y = rRect.yBottom; + ::GpiMove(hPS, &vPoint[0]); + if (dwStyle & wxSIMPLE_BORDER || + dwStyle & wxSTATIC_BORDER) + { + vPoint[1].x = rRect.xRight - 1; + vPoint[1].y = rRect.yTop - 1; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + } + if (dwStyle & wxSUNKEN_BORDER) + { + LINEBUNDLE vLineBundle; + + vLineBundle.lColor = 0x00FFFFFF; // WHITE + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[1].x = rRect.xRight - 1; + vPoint[1].y = rRect.yTop - 1; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + vPoint[0].x = rRect.xLeft + 1; + vPoint[0].y = rRect.yBottom + 1; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xRight - 2; + vPoint[1].y = rRect.yTop - 2; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + + vLineBundle.lColor = 0x00000000; // BLACK + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[0].x = rRect.xLeft + 2; + vPoint[0].y = rRect.yBottom + 2; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xLeft + 2; + vPoint[1].y = rRect.yTop - 3; + ::GpiLine(hPS, &vPoint[1]); + vPoint[1].x = rRect.xRight - 3; + vPoint[1].y = rRect.yTop - 3; + ::GpiLine(hPS, &vPoint[1]); + + vPoint[0].x = rRect.xLeft + 3; + vPoint[0].y = rRect.yBottom + 3; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xLeft + 3; + vPoint[1].y = rRect.yTop - 4; + ::GpiLine(hPS, &vPoint[1]); + vPoint[1].x = rRect.xRight - 4; + vPoint[1].y = rRect.yTop - 4; + ::GpiLine(hPS, &vPoint[1]); + } + if (dwStyle & wxDOUBLE_BORDER) + { + LINEBUNDLE vLineBundle; + + vLineBundle.lColor = 0x00FFFFFF; // WHITE + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[1].x = rRect.xRight - 1; + vPoint[1].y = rRect.yTop - 1; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + vLineBundle.lColor = 0x00000000; // WHITE + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[0].x = rRect.xLeft + 2; + vPoint[0].y = rRect.yBottom + 2; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xRight - 2; + vPoint[1].y = rRect.yTop - 2; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + vLineBundle.lColor = 0x00FFFFFF; // BLACK + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[0].x = rRect.xLeft + 3; + vPoint[0].y = rRect.yBottom + 3; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xRight - 3; + vPoint[1].y = rRect.yTop - 3; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + } + if (dwStyle & wxRAISED_BORDER) + { + LINEBUNDLE vLineBundle; + + vLineBundle.lColor = 0x00000000; // BLACK + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[1].x = rRect.xRight - 1; + vPoint[1].y = rRect.yTop - 1; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + vPoint[0].x = rRect.xLeft + 1; + vPoint[0].y = rRect.yBottom + 1; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xRight - 2; + vPoint[1].y = rRect.yTop - 2; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + + vLineBundle.lColor = 0x00FFFFFF; // WHITE + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[0].x = rRect.xLeft + 2; + vPoint[0].y = rRect.yBottom + 2; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xLeft + 2; + vPoint[1].y = rRect.yTop - 3; + ::GpiLine(hPS, &vPoint[1]); + vPoint[1].x = rRect.xRight - 3; + vPoint[1].y = rRect.yTop - 3; + ::GpiLine(hPS, &vPoint[1]); + + vPoint[0].x = rRect.xLeft + 3; + vPoint[0].y = rRect.yBottom + 3; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xLeft + 3; + vPoint[1].y = rRect.yTop - 4; + ::GpiLine(hPS, &vPoint[1]); + vPoint[1].x = rRect.xRight - 4; + vPoint[1].y = rRect.yTop - 4; + ::GpiLine(hPS, &vPoint[1]); + } +} // end of wxDrawBorder + +void wxOS2SetFont( + HWND hWnd +, const wxFont& rFont +) +{ + char zFont[128]; + char zFacename[30]; + char zWeight[30]; + char zStyle[30]; + + if (hWnd == NULLHANDLE) + return; + + // + // The fonts available for Presentation Params are just three + // outline fonts, the rest are available to the GPI, so we must + // map the families to one of these three + // + switch(rFont.GetFamily()) + { + case wxSCRIPT: + strcpy(zFacename, "Script"); + break; + + case wxDECORATIVE: + case wxROMAN: + strcpy(zFacename,"Tms Rmn"); + break; + + case wxTELETYPE: + strcpy(zFacename, "Courier"); + break; + + case wxMODERN: + strcpy(zFacename, "System VIO"); + break; + + case wxSWISS: + strcpy(zFacename, "Helv"); + break; + + case wxDEFAULT: + default: + strcpy(zFacename, "System VIO"); + break; + } + + switch(rFont.GetWeight()) + { + default: + case wxNORMAL: + case wxLIGHT: + zWeight[0] = '\0'; + break; + + case wxBOLD: + case wxFONTWEIGHT_MAX: + strcpy(zWeight, "Bold"); + break; + } + + switch(rFont.GetStyle()) + { + case wxITALIC: + case wxSLANT: + strcpy(zStyle, "Italic"); + break; + + default: + zStyle[0] = '\0'; + break; + } + sprintf(zFont, "%d.%s", rFont.GetPointSize(), zFacename); + if (zWeight[0] != '\0') + { + strcat(zFont, " "); + strcat(zFont, zWeight); + } + if (zStyle[0] != '\0') + { + strcat(zFont, " "); + strcat(zFont, zStyle); + } + ::WinSetPresParam(hWnd, PP_FONTNAMESIZE, strlen(zFont) + 1, (PVOID)zFont); +} // end of wxOS2SetFont