X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7cdc2f1e4263b8069921c023a780e7feb05816c5..c1d8296a78d1f630952fc5395e4072c8a654b8ef:/src/os2/utils.cpp diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index d536b29ebe..ccf622b9a2 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,15 +16,16 @@ #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 -#include +#ifdef __EMX__ +#include +#endif #include "wx/log.h" @@ -36,21 +37,21 @@ #include #include -#define INCL_DOS -#define INCL_PM -#define INCL_GPI -#include -#include #define PURE_32 -#include -#include -#include -// In the WIN.INI file -static const wxChar WX_SECTION[] = _T("wxWindows"); +#if defined(__WATCOMC__) +extern "C" +{ + #include +} +#elif !defined(__EMX__) + #include + #include + #include +#endif + +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 @@ -58,549 +59,450 @@ static const wxChar eUSERNAME[] = _T("UserName"); // functions beyond those provided by WinSock // Get full hostname (eg. DoDo.BSn-Germany.crg.de) -bool wxGetHostName(wxChar *buf, int maxSize) +bool wxGetHostName( + wxChar* zBuf +, int nMaxSize +) { #if wxUSE_NET_API - char server[256]; - char computer[256]; - unsigned long ulLevel; - unsigned char* pbBuffer; - unsigned long ulBuffer; - unsigned long* pulTotalAvail; - - NetBios32GetInfo( (const unsigned char*)server - ,(const unsigned char*)computer - ,ulLevel - ,pbBuffer - ,ulBuffer - ,pulTotalAvail - ); - strcpy(buf, server); + char zServer[256]; + char zComputer[256]; + 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 + ,ulLevel + ,zBuffer + ,ulBuffer + ,pulTotalAvail + ); + strcpy(zBuf, zServer); #else - wxChar *sysname; - const wxChar *default_host = _T("noname"); - - if ((sysname = wxGetenv(_T("SYSTEM_NAME"))) == NULL) - { - // GetProfileString(WX_SECTION, eHOSTNAME, default_host, buf, maxSize - 1); - } - else - wxStrncpy(buf, sysname, maxSize - 1); - buf[maxSize] = _T('\0'); + wxChar* zSysname; + const wxChar* zDefaultHost = _T("noname"); + + if ((zSysname = wxGetenv(_T("SYSTEM_NAME"))) == NULL) + { + ::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 *buf ? TRUE : FALSE; + return *zBuf ? true : false; } // Get user ID e.g. jacs -bool wxGetUserId(wxChar *buf, int maxSize) +bool wxGetUserId(wxChar* zBuf, int nType) { - return(U32ELOCL((unsigned char*)buf, (unsigned long *)&maxSize)); +#if defined(__VISAGECPP__) || defined(__WATCOMC__) + // UPM procs return 0 on success + long lrc = U32ELOCU((PUCHAR)zBuf, (PULONG)&nType); + if (lrc == 0) return true; +#endif + return false; } -bool wxGetUserName(wxChar *buf, int maxSize) +bool wxGetUserName( wxChar* zBuf, int nMaxSize ) { #ifdef USE_NET_API - wxGetUserId(buf, maxSize); + wxGetUserId( zBuf, nMaxSize ); #else - wxStrncpy(buf, _T("Unknown User"), maxSize); + wxStrncpy(zBuf, _T("Unknown User"), nMaxSize); #endif - return TRUE; + return true; } -int wxKill(long pid, int sig) +int wxKill(long lPid, + wxSignal WXUNUSED(eSig), + wxKillError* WXUNUSED(peError), + int WXUNUSED(flags)) { - return 0; + return((int)::DosKillProcess(0, (PID)lPid)); } // // Execute a program in an Interactive Shell // -bool wxShell(const wxString& command) -{ - wxChar *shell; - if ((shell = wxGetenv(_T("COMSPEC"))) == NULL) - shell = _T("\\CMD.EXE"); +bool wxShell( + const wxString& rCommand +) +{ + wxChar* zShell = _T("CMD.EXE"); + wxString sInputs; + 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 = (char*)zShell; + + sInputs = _T("/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; - wxChar tmp[255]; - if (command != "") - wxSprintf(tmp, "%s /c %s", shell, WXSTRINGCAST command); - else - wxStrcpy(tmp, shell); + ::DosGetInfoBlocks(&ptib, &ppib); - return (wxExecute((wxChar *)tmp, 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() +// Shutdown or reboot the PC +bool wxShutdown(wxShutdownFlags WXUNUSED(wFlags)) { - // return (long)GetFreeSpace(0); - return 0L; + // TODO + return false; } -// Sleep for nSecs seconds. Attempt a Windows implementation using timers. -static bool inTimer = FALSE; - -class wxSleepTimer: public wxTimer +wxPowerType wxGetPowerType() { - public: - inline void Notify() - { - inTimer = FALSE; - Stop(); - } -}; - -static wxTimer *wxTheSleepTimer = NULL; - -void wxUsleep(unsigned long milliseconds) -{ - ::DosSleep(milliseconds); + // TODO + return wxPOWER_UNKNOWN; } -void wxSleep(int nSecs) +wxBatteryState wxGetBatteryState() { - if (inTimer) - return; - - wxTheSleepTimer = new wxSleepTimer; - inTimer = TRUE; - wxTheSleepTimer->Start(nSecs*1000); - while (inTimer) - { - if (wxTheApp->Pending()) - wxTheApp->Dispatch(); - } - delete wxTheSleepTimer; - wxTheSleepTimer = NULL; + // TODO + return wxBATTERY_UNKNOWN_STATE; } -// Consume all events until no more left -void wxFlushEvents() +// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) +wxMemorySize wxGetFreeMemory() { -// wxYield(); + void* pMemptr = NULL; + LONG lSize; + ULONG lMemFlags; + APIRET rc; + + lMemFlags = PAG_FREE; + rc = ::DosQueryMem(pMemptr, (PULONG)&lSize, &lMemFlags); + if (rc != 0) + lSize = -1L; + return (wxMemorySize)lSize; } -// Output a debug mess., in a system dependent fashion. -void wxDebugMsg(const wxChar *fmt ...) +// Get Process ID +unsigned long wxGetProcessId() { - va_list ap; - static wxChar buffer[512]; + return (unsigned long)getpid(); +} - if (!wxTheApp->GetWantDebugOutput()) - return ; +// ---------------------------------------------------------------------------- +// env vars +// ---------------------------------------------------------------------------- - va_start(ap, fmt); +bool wxGetEnv(const wxString& var, wxString *value) +{ + // wxGetenv is defined as getenv() + wxChar *p = wxGetenv(var); + if ( !p ) + return false; - sprintf(buffer,fmt,ap) ; + if ( value ) + { + *value = p; + } - va_end(ap); + return true; } -// Non-fatal error: pop up message box and (possibly) continue -void wxError(const wxString& msg, const wxString& title) +bool wxSetEnv(const wxString& variable, const wxChar *value) { - wxSprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST msg); - if (::WinMessageBox( HWND_DESKTOP - ,NULL - ,(PSZ)wxBuffer - ,(PSZ)WXSTRINGCAST title - ,0 - ,MB_ICONEXCLAMATION | MB_YESNO - ) == MBID_YES) - wxExit(); -} +#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; -// Fatal error: pop up message box and abort -void wxFatalError(const wxString& rMsg, const wxString& rTitle) -{ - unsigned long rc; - - rc = ::WinMessageBox( HWND_DESKTOP - ,NULL - ,WXSTRINGCAST rMsg - ,WXSTRINGCAST rTitle - ,0 - ,MB_NOICON | MB_OK - ); - DosExit(EXIT_PROCESS, rc); -} + // transform to ANSI + const char *p = s.mb_str(); -// Emit a beeeeeep -void wxBell() -{ - DosBeep(1000,1000); // 1kHz during 1 sec. -} + // the string will be free()d by libc + char *buf = (char *)malloc(strlen(p) + 1); + strcpy(buf, p); -// Chris Breeze 27/5/98: revised WIN32 code to -// detect WindowsNT correctly -int wxGetOsVersion(int *majorVsn, int *minorVsn) -{ - ULONG aulSysInfo[QSV_MAX] = {0}; - - if (DosQuerySysInfo( 1L - ,QSV_MAX - ,(PVOID)aulSysInfo - ,sizeof(ULONG) * QSV_MAX - )) - { - *majorVsn = aulSysInfo[QSV_VERSION_MAJOR]; - *minorVsn = aulSysInfo[QSV_VERSION_MINOR]; - return wxWINDOWS_OS2; - } - return wxWINDOWS; // error if we get here, return generic value + return putenv(buf) == 0; +#else // no way to set an env var + wxUnusedVar(variable); + wxUnusedVar(value); + return false; +#endif } -// Reading and writing resources (eg WIN.INI, .Xdefaults) -// TODO: Ability to read and write to an INI file - -#if wxUSE_RESOURCES -bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file) +void wxMilliSleep( + unsigned long ulMilliseconds +) { -// TODO: -/* - if (file != "") - return (WritePrivateProfileString((PCSZ)WXSTRINGCAST section, (PCSZ)WXSTRINGCAST entry, (PCSZ)value, (PCSZ)WXSTRINGCAST file) != 0); - else - return (WriteProfileString((PCSZ)WXSTRINGCAST section, (PCSZ)WXSTRINGCAST entry, (PCSZ)WXSTRINGCAST value) != 0); -*/ - return FALSE; + ::DosSleep(ulMilliseconds); } -bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file) +void wxMicroSleep( + unsigned long ulMicroseconds +) { - wxChar buf[50]; - wxSprintf(buf, "%.4f", value); - return wxWriteResource(section, entry, buf, file); + ::DosSleep(ulMicroseconds/1000); } -bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file) +void wxSleep( + int nSecs +) { - wxChar buf[50]; - wxSprintf(buf, "%ld", value); - return wxWriteResource(section, entry, buf, file); + ::DosSleep(1000 * nSecs); } -bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file) +// Consume all events until no more left +void wxFlushEvents() { - wxChar buf[50]; - wxSprintf(buf, "%d", value); - return wxWriteResource(section, entry, buf, file); +// wxYield(); } -bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file) +// Emit a beeeeeep +void wxBell() { - static const wxChar defunkt[] = _T("$$default"); -// TODO: -/* - if (file != "") - { - int n = GetPrivateProfileString((PCSZ)WXSTRINGCAST section, (PCSZ)WXSTRINGCAST entry, (PCSZ)defunkt, - (PSZ)wxBuffer, 1000, (PCSZ)WXSTRINGCAST file); - if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) - return FALSE; - } - else - { - int n = GetProfileString((PCSZ)WXSTRINGCAST section, (PCSZ)WXSTRINGCAST entry, (LPCTSTR)defunkt, - (PSZ)wxBuffer, 1000); - if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) - return FALSE; - } - if (*value) delete[] (*value); - *value = copystring(wxBuffer); - return TRUE; -*/ - return FALSE; + DosBeep(1000,1000); // 1kHz during 1 sec. } -bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file) +wxString wxGetOsDescription() { - 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; -} + wxString strVer(_T("OS/2")); + ULONG ulSysInfo[QSV_MAX] = {0}; -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 (::DosQuerySysInfo( 1L, + QSV_MAX, + (PVOID)ulSysInfo, + sizeof(ULONG) * QSV_MAX + ) == 0L ) + { + wxString ver; + ver.Printf( _T(" ver. %d.%d rev. %c"), + int(ulSysInfo[QSV_VERSION_MAJOR] / 10), + int(ulSysInfo[QSV_VERSION_MINOR]), + char(ulSysInfo[QSV_VERSION_REVISION]) + ); + strVer += ver; + } + + return strVer; } -bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file) +void wxAppTraits::InitializeGui(unsigned long &WXUNUSED(ulHab)) { - 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 -// --------------------------------------------------------------------------- - -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 *cursor) +void wxAppTraits::TerminateGui(unsigned long WXUNUSED(ulHab)) { - if ( gs_wxBusyCursorCount++ == 0 ) - { - gs_wxBusyCursor = (HCURSOR)cursor->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; } // --------------------------------------------------------------------------- -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. + // 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 + // 256 was taken from os2def.h #ifndef MAX_PATH # define MAX_PATH 256 #endif + const wxChar *szHome = wxGetenv((wxChar*)"HOME"); + if ( szHome == NULL ) { + // we're homeless, use current directory. + rStrDir = wxT("."); + } + else + rStrDir = szHome; - char DirName[256]; - ULONG DirLen; - - ::DosQueryCurrentDir( 0, DirName, &DirLen); - strDir = DirName; - return strDir.c_str(); + return rStrDir.c_str(); } -// Hack for MS-DOS -wxChar *wxGetUserHome (const wxString& user) +// Hack for OS/2 +#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 *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) - { - wxStrcpy(wxBuffer, home); - Unix2DosFilename(wxBuffer); - return wxBuffer; - } - return NULL; // No home known! -} + wxChar* zHome; + wxString sUser1(rUser); -// Check whether this window wants to process messages, e.g. Stop button -// in long calculations. -bool wxCheckForInterrupt(wxWindow *wnd) -{ - if(wnd){ - QMSG msg; - HAB hab; - HWND hwndFilter; + wxChar *wxBuffer = new wxChar[256]; +#ifndef __EMX__ + if (!sUser1.empty()) + { + wxChar zTmp[64]; - HWND win= (HWND) wnd->GetHWND(); - while(::WinPeekMsg(hab,&msg,hwndFilter,0,0,PM_REMOVE)) + 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 = wxEmptyString; + } + } +#endif + if (sUser1.empty()) { - ::WinDispatchMsg( hab, &msg ); + if ((zHome = wxGetenv(_T("HOME"))) != NULL) + { + wxStrcpy(wxBuffer, zHome); + wxUnix2DosFilename(wxBuffer); +#if wxUSE_UNICODE + wxWCharBuffer retBuffer (wxBuffer); + delete[] wxBuffer; + return retBuffer; +#else + wxStrcpy(zHome, wxBuffer); + delete[] wxBuffer; + return zHome; +#endif + } } - return TRUE;//*** temporary? - } - else{ - wxFAIL_MSG(_T("wnd==NULL !!!")); - - return FALSE;//*** temporary? - } -} - -wxChar *wxLoadUserResource(const wxString& resourceName, const wxString& resourceType) -{ - wxChar *s = NULL; - -/* -* How to in PM? -* -* #if !defined(__WIN32__) || defined(__TWIN32__) -* HRSRC hResource = ::FindResource(wxGetInstance(), WXSTRINGCAST resourceName, WXSTRINGCAST resourceType); -* #else -* #ifdef UNICODE -* HRSRC hResource = ::FindResourceW(wxGetInstance(), WXSTRINGCAST resourceName, WXSTRINGCAST resourceType); -* #else -* HRSRC hResource = ::FindResourceA(wxGetInstance(), WXSTRINGCAST resourceName, WXSTRINGCAST resourceType); -* #endif -* #endif -* -* if (hResource == 0) -* return NULL; -* HGLOBAL hData = ::LoadResource(wxGetInstance(), hResource); -* if (hData == 0) -* return NULL; -* wxChar *theText = (wxChar *)LockResource(hData); -* if (!theText) -* return NULL; -* -* s = copystring(theText); -*/ - return s; + delete[] wxBuffer; + return (wxChar*)wxEmptyString; // No home known! } -void wxGetMousePosition( int* x, int* y ) -{ - POINTL pt; - ::WinQueryPointerPos( HWND_DESKTOP, & pt ); - *x = pt.x; - *y = pt.y; -}; - -// Return TRUE if we have a colour display -bool wxColourDisplay() +wxString WXDLLEXPORT wxPMErrorToStr(ERRORID vError) { - bool flag; - // TODO: use DosQueryDevCaps to figure it out - return flag; -} + wxString sError; -// 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 - )) + // + // Remove the high order byte -- it is useless + // + vError &= 0x0000ffff; + switch(vError) { - nPlanes = (int)lArray[CAPS_COLOR_PLANES]; - nBitsPerPixel = (int)lArray[CAPS_COLOR_BITCOUNT]; - nDepth = nPlanes * nBitsPerPixel; - } - DevCloseDC(hDc); - return (nDepth); -} + case PMERR_INVALID_HWND: + sError = wxT("Invalid window handle specified"); + break; -// Get size of display -void wxDisplaySize(int *width, int *height) -{ - 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]; - } - DevCloseDC(hDc); -} + case PMERR_INVALID_FLAG: + sError = wxT("Invalid flag bit set"); + break; -bool wxDirExists(const wxString& dir) -{ - // TODO: Control program file stuff - return TRUE; -} + case PMERR_NO_MSG_QUEUE: + sError = wxT("No message queue available"); + break; -// --------------------------------------------------------------------------- -// window information functions -// --------------------------------------------------------------------------- + case PMERR_INVALID_PARM: + sError = wxT("Parameter contained invalid data"); + break; -wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd) -{ - wxString str; - long len = ::WinQueryWindowTextLength((HWND)hWnd) + 1; - ::WinQueryWindowText((HWND)hWnd, len, str.GetWriteBuf((int)len)); - str.UngetWriteBuf(); + case PMERR_INVALID_PARAMETERS: + sError = wxT("Parameter value is out of range"); + break; - return str; -} + case PMERR_PARAMETER_OUT_OF_RANGE: + sError = wxT("Parameter value is out of range"); + break; -wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd) -{ - wxString str; + case PMERR_INVALID_INTEGER_ATOM: + sError = wxT("Not a valid atom"); + break; - int len = 256; // some starting value + case PMERR_INVALID_HATOMTBL: + sError = wxT("Atom table handle is invalid"); + break; - for ( ;; ) - { - int count = ::WinQueryClassName((HWND)hWnd, len, str.GetWriteBuf(len)); + case PMERR_INVALID_ATOM_NAME: + sError = wxT("Not a valid atom name"); + break; - str.UngetWriteBuf(); - if ( count == len ) - { - // the class name might have been truncated, retry with larger - // buffer - len *= 2; - } - else - { + 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 str; -} + return(sError); +} // end of wxPMErrorToStr + +// replacement for implementation in unix/utilsunx.cpp, +// to be used by all X11 based ports. +struct wxEndProcessData; -WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd) +void wxHandleProcessTermination(wxEndProcessData *WXUNUSED(proc_data)) { - return ::WinQueryWindowUShort((HWND)hWnd, QWS_ID); + // For now, just do nothing. To be filled in as needed. } -