1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Miscellaneous utilities 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) 1998 Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  15 // ---------------------------------------------------------------------------- 
  17 // ---------------------------------------------------------------------------- 
  19 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__) 
  20 // Some older compilers (such as EMX) cannot handle 
  21 // #pragma interface/implementation correctly, iff 
  22 // #pragma implementation is used in _two_ translation 
  23 // units (as created by e.g. event.cpp compiled for 
  24 // libwx_base and event.cpp compiled for libwx_gui_core). 
  25 // So we must not use those pragmas for those compilers in 
  27     #pragma interface "utils.h" 
  30 #include "wx/object.h" 
  32 #include "wx/filefn.h" 
  34 class WXDLLIMPEXP_BASE wxArrayString
; 
  36 // need this for wxGetDiskSpace() as we can't, unfortunately, forward declare 
  38 #include "wx/longlong.h" 
  47 // ---------------------------------------------------------------------------- 
  48 // Forward declaration 
  49 // ---------------------------------------------------------------------------- 
  51 class WXDLLIMPEXP_CORE wxProcess
; 
  52 class WXDLLIMPEXP_CORE wxFrame
; 
  53 class WXDLLIMPEXP_CORE wxWindow
; 
  54 class WXDLLIMPEXP_CORE wxWindowList
; 
  55 class WXDLLIMPEXP_CORE wxPoint
; 
  57 // ---------------------------------------------------------------------------- 
  59 // ---------------------------------------------------------------------------- 
  61 #define wxMax(a,b)            (((a) > (b)) ? (a) : (b)) 
  62 #define wxMin(a,b)            (((a) < (b)) ? (a) : (b)) 
  64 // ---------------------------------------------------------------------------- 
  65 // String functions (deprecated, use wxString) 
  66 // ---------------------------------------------------------------------------- 
  68 // Make a copy of this string using 'new' 
  69 #if WXWIN_COMPATIBILITY_2_4 
  70 WXDLLIMPEXP_BASE wxChar
* copystring(const wxChar 
*s
); 
  73 // A shorter way of using strcmp 
  74 #define wxStringEq(s1, s2) (s1 && s2 && (wxStrcmp(s1, s2) == 0)) 
  76 // ---------------------------------------------------------------------------- 
  77 // Miscellaneous functions 
  78 // ---------------------------------------------------------------------------- 
  81 WXDLLIMPEXP_BASE 
void wxBell(); 
  83 // Get OS description as a user-readable string 
  84 WXDLLIMPEXP_BASE wxString 
wxGetOsDescription(); 
  87 WXDLLIMPEXP_BASE 
int wxGetOsVersion(int *majorVsn 
= (int *) NULL
, 
  88                                int *minorVsn 
= (int *) NULL
); 
  90 // Return a string with the current date/time 
  91 WXDLLIMPEXP_BASE wxString 
wxNow(); 
  93 // Return path where wxWidgets is installed (mostly useful in Unices) 
  94 WXDLLIMPEXP_BASE 
const wxChar 
*wxGetInstallPrefix(); 
  95 // Return path to wxWin data (/usr/share/wx/%{version}) (Unices) 
  96 WXDLLIMPEXP_BASE wxString 
wxGetDataDir(); 
 101 // Get the state of a key (true if pressed, false if not) 
 102 // This is generally most useful getting the state of 
 103 // the modifier or toggle keys. 
 104 WXDLLEXPORT 
bool wxGetKeyState(wxKeyCode key
); 
 107 // Don't synthesize KeyUp events holding down a key and producing 
 108 // KeyDown events with autorepeat. On by default and always on 
 110 WXDLLEXPORT 
bool wxSetDetectableAutoRepeat( bool flag 
); 
 112 // ---------------------------------------------------------------------------- 
 113 // Window ID management 
 114 // ---------------------------------------------------------------------------- 
 116 // Generate a unique ID 
 117 WXDLLEXPORT 
long wxNewId(); 
 119 // Ensure subsequent IDs don't clash with this one 
 120 WXDLLEXPORT 
void wxRegisterId(long id
); 
 122 // Return the current ID 
 123 WXDLLEXPORT 
long wxGetCurrentId(); 
 127 // ---------------------------------------------------------------------------- 
 128 // Various conversions 
 129 // ---------------------------------------------------------------------------- 
 131 // these functions are deprecated, use wxString methods instead! 
 132 #if WXWIN_COMPATIBILITY_2_4 
 134 WXDLLIMPEXP_DATA_BASE(extern const wxChar
*) wxFloatToStringStr
; 
 135 WXDLLIMPEXP_DATA_BASE(extern const wxChar
*) wxDoubleToStringStr
; 
 137 WXDLLIMPEXP_BASE 
void StringToFloat(const wxChar 
*s
, float *number
); 
 138 WXDLLIMPEXP_BASE wxChar
* FloatToString(float number
, const wxChar 
*fmt 
= wxFloatToStringStr
); 
 139 WXDLLIMPEXP_BASE 
void StringToDouble(const wxChar 
*s
, double *number
); 
 140 WXDLLIMPEXP_BASE wxChar
* DoubleToString(double number
, const wxChar 
*fmt 
= wxDoubleToStringStr
); 
 141 WXDLLIMPEXP_BASE 
void StringToInt(const wxChar 
*s
, int *number
); 
 142 WXDLLIMPEXP_BASE 
void StringToLong(const wxChar 
*s
, long *number
); 
 143 WXDLLIMPEXP_BASE wxChar
* IntToString(int number
); 
 144 WXDLLIMPEXP_BASE wxChar
* LongToString(long number
); 
 146 #endif // WXWIN_COMPATIBILITY_2_4 
 148 // Convert 2-digit hex number to decimal 
 149 WXDLLIMPEXP_BASE 
int wxHexToDec(const wxString
& buf
); 
 151 // Convert decimal integer to 2-character hex string 
 152 WXDLLIMPEXP_BASE 
void wxDecToHex(int dec
, wxChar 
*buf
); 
 153 WXDLLIMPEXP_BASE wxString 
wxDecToHex(int dec
); 
 155 // ---------------------------------------------------------------------------- 
 156 // Process management 
 157 // ---------------------------------------------------------------------------- 
 159 // NB: for backwars compatibility reasons the values of wxEXEC_[A]SYNC *must* 
 160 //     be 0 and 1, don't change! 
 164     // execute the process asynchronously 
 167     // execute it synchronously, i.e. wait until it finishes 
 170     // under Windows, don't hide the child even if it's IO is redirected (this 
 171     // is done by default) 
 174     // under Unix, if the process is the group leader then killing -pid kills 
 175     // all children as well as pid 
 176     wxEXEC_MAKE_GROUP_LEADER 
= 4 
 179 // Execute another program. 
 181 // If flags contain wxEXEC_SYNC, return -1 on failure and the exit code of the 
 182 // process if everything was ok. Otherwise (i.e. if wxEXEC_ASYNC), return 0 on 
 183 // failure and the PID of the launched process if ok. 
 184 WXDLLIMPEXP_BASE 
long wxExecute(wxChar 
**argv
, int flags 
= wxEXEC_ASYNC
, 
 185                            wxProcess 
*process 
= (wxProcess 
*) NULL
); 
 186 WXDLLIMPEXP_BASE 
long wxExecute(const wxString
& command
, int flags 
= wxEXEC_ASYNC
, 
 187                            wxProcess 
*process 
= (wxProcess 
*) NULL
); 
 189 // execute the command capturing its output into an array line by line, this is 
 190 // always synchronous 
 191 WXDLLIMPEXP_BASE 
long wxExecute(const wxString
& command
, 
 192                            wxArrayString
& output
); 
 194 // also capture stderr (also synchronous) 
 195 WXDLLIMPEXP_BASE 
long wxExecute(const wxString
& command
, 
 196                            wxArrayString
& output
, 
 197                            wxArrayString
& error
); 
 201     wxSIGNONE 
= 0,  // verify if the process exists under Unix 
 208     wxSIGIOT 
= wxSIGABRT
,   // another name 
 219     // further signals are different in meaning between different Unix systems 
 224     wxKILL_OK
,              // no error 
 225     wxKILL_BAD_SIGNAL
,      // no such signal 
 226     wxKILL_ACCESS_DENIED
,   // permission denied 
 227     wxKILL_NO_PROCESS
,      // no such process 
 228     wxKILL_ERROR            
// another, unspecified error 
 233     wxSHUTDOWN_POWEROFF
,    // power off the computer 
 234     wxSHUTDOWN_REBOOT       
// shutdown and reboot 
 237 // Shutdown or reboot the PC 
 238 WXDLLIMPEXP_BASE 
bool wxShutdown(wxShutdownFlags wFlags
); 
 240 // send the given signal to the process (only NONE and KILL are supported under 
 241 // Windows, all others mean TERM), return 0 if ok and -1 on error 
 243 // return detailed error in rc if not NULL 
 244 WXDLLIMPEXP_BASE 
int wxKill(long pid
, 
 245                        wxSignal sig 
= wxSIGTERM
, 
 246                        wxKillError 
*rc 
= NULL
); 
 248 // Execute a command in an interactive shell window (always synchronously) 
 249 // If no command then just the shell 
 250 WXDLLIMPEXP_BASE 
bool wxShell(const wxString
& command 
= wxEmptyString
); 
 252 // As wxShell(), but must give a (non interactive) command and its output will 
 253 // be returned in output array 
 254 WXDLLIMPEXP_BASE 
bool wxShell(const wxString
& command
, wxArrayString
& output
); 
 256 // Sleep for nSecs seconds 
 257 WXDLLIMPEXP_BASE 
void wxSleep(int nSecs
); 
 259 // Sleep for a given amount of milliseconds 
 260 WXDLLIMPEXP_BASE 
void wxMilliSleep(unsigned long milliseconds
); 
 262 // Sleep for a given amount of microseconds 
 263 WXDLLIMPEXP_BASE 
void wxMicroSleep(unsigned long microseconds
); 
 265 // Sleep for a given amount of milliseconds (old, bad name), use wxMilliSleep 
 266 wxDEPRECATED( WXDLLIMPEXP_BASE 
void wxUsleep(unsigned long milliseconds
) ); 
 268 // Get the process id of the current process 
 269 WXDLLIMPEXP_BASE 
unsigned long wxGetProcessId(); 
 271 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) 
 272 WXDLLIMPEXP_BASE 
long wxGetFreeMemory(); 
 274 // should wxApp::OnFatalException() be called? 
 275 WXDLLIMPEXP_BASE 
bool wxHandleFatalExceptions(bool doit 
= true); 
 277 // ---------------------------------------------------------------------------- 
 278 // Environment variables 
 279 // ---------------------------------------------------------------------------- 
 281 // returns true if variable exists (value may be NULL if you just want to check 
 283 WXDLLIMPEXP_BASE 
bool wxGetEnv(const wxString
& var
, wxString 
*value
); 
 285 // set the env var name to the given value, return true on success 
 286 WXDLLIMPEXP_BASE 
bool wxSetEnv(const wxString
& var
, const wxChar 
*value
); 
 288 // remove the env var from environment 
 289 inline bool wxUnsetEnv(const wxString
& var
) { return wxSetEnv(var
, NULL
); } 
 291 // ---------------------------------------------------------------------------- 
 292 // Network and username functions. 
 293 // ---------------------------------------------------------------------------- 
 295 // NB: "char *" functions are deprecated, use wxString ones! 
 298 WXDLLIMPEXP_BASE 
bool wxGetEmailAddress(wxChar 
*buf
, int maxSize
); 
 299 WXDLLIMPEXP_BASE wxString 
wxGetEmailAddress(); 
 302 WXDLLIMPEXP_BASE 
bool wxGetHostName(wxChar 
*buf
, int maxSize
); 
 303 WXDLLIMPEXP_BASE wxString 
wxGetHostName(); 
 306 WXDLLIMPEXP_BASE wxString 
wxGetFullHostName(); 
 307 WXDLLIMPEXP_BASE 
bool wxGetFullHostName(wxChar 
*buf
, int maxSize
); 
 309 // Get user ID e.g. jacs (this is known as login name under Unix) 
 310 WXDLLIMPEXP_BASE 
bool wxGetUserId(wxChar 
*buf
, int maxSize
); 
 311 WXDLLIMPEXP_BASE wxString 
wxGetUserId(); 
 313 // Get user name e.g. Julian Smart 
 314 WXDLLIMPEXP_BASE 
bool wxGetUserName(wxChar 
*buf
, int maxSize
); 
 315 WXDLLIMPEXP_BASE wxString 
wxGetUserName(); 
 317 // Get current Home dir and copy to dest (returns pstr->c_str()) 
 318 WXDLLIMPEXP_BASE wxString 
wxGetHomeDir(); 
 319 WXDLLIMPEXP_BASE 
const wxChar
* wxGetHomeDir(wxString 
*pstr
); 
 321 // Get the user's home dir (caller must copy --- volatile) 
 322 // returns NULL is no HOME dir is known 
 323 #if defined(__UNIX__) && wxUSE_UNICODE 
 324 WXDLLIMPEXP_BASE 
const wxMB2WXbuf 
wxGetUserHome(const wxString
& user 
= wxEmptyString
); 
 326 WXDLLIMPEXP_BASE wxChar
* wxGetUserHome(const wxString
& user 
= wxEmptyString
); 
 329 // get number of total/free bytes on the disk where path belongs 
 330 WXDLLIMPEXP_BASE 
bool wxGetDiskSpace(const wxString
& path
, 
 331                                 wxLongLong 
*pTotal 
= NULL
, 
 332                                 wxLongLong 
*pFree 
= NULL
); 
 334 #if wxUSE_GUI // GUI only things from now on 
 336 // ---------------------------------------------------------------------------- 
 337 // Menu accelerators related things 
 338 // ---------------------------------------------------------------------------- 
 340 WXDLLEXPORT wxChar
* wxStripMenuCodes(const wxChar 
*in
, wxChar 
*out 
= (wxChar 
*) NULL
); 
 341 WXDLLEXPORT wxString 
wxStripMenuCodes(const wxString
& str
); 
 344 class WXDLLEXPORT wxAcceleratorEntry
; 
 345 WXDLLEXPORT wxAcceleratorEntry 
*wxGetAccelFromString(const wxString
& label
); 
 346 #endif // wxUSE_ACCEL 
 348 // ---------------------------------------------------------------------------- 
 350 // ---------------------------------------------------------------------------- 
 352 // Returns menu item id or wxNOT_FOUND if none. 
 353 WXDLLEXPORT 
int wxFindMenuItemId(wxFrame 
*frame
, const wxString
& menuString
, const wxString
& itemString
); 
 355 // Find the wxWindow at the given point. wxGenericFindWindowAtPoint 
 356 // is always present but may be less reliable than a native version. 
 357 WXDLLEXPORT wxWindow
* wxGenericFindWindowAtPoint(const wxPoint
& pt
); 
 358 WXDLLEXPORT wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
); 
 360 // NB: this function is obsolete, use wxWindow::FindWindowByLabel() instead 
 362 // Find the window/widget with the given title or label. 
 363 // Pass a parent to begin the search from, or NULL to look through 
 365 WXDLLEXPORT wxWindow
* wxFindWindowByLabel(const wxString
& title
, wxWindow 
*parent 
= (wxWindow 
*) NULL
); 
 367 // NB: this function is obsolete, use wxWindow::FindWindowByName() instead 
 369 // Find window by name, and if that fails, by label. 
 370 WXDLLEXPORT wxWindow
* wxFindWindowByName(const wxString
& name
, wxWindow 
*parent 
= (wxWindow 
*) NULL
); 
 372 // ---------------------------------------------------------------------------- 
 373 // Message/event queue helpers 
 374 // ---------------------------------------------------------------------------- 
 376 // Yield to other apps/messages and disable user input 
 377 WXDLLEXPORT 
bool wxSafeYield(wxWindow 
*win 
= NULL
, bool onlyIfNeeded 
= false); 
 379 // Enable or disable input to all top level windows 
 380 WXDLLEXPORT 
void wxEnableTopLevelWindows(bool enable 
= true); 
 382 // Check whether this window wants to process messages, e.g. Stop button 
 383 // in long calculations. 
 384 WXDLLEXPORT 
bool wxCheckForInterrupt(wxWindow 
*wnd
); 
 386 // Consume all events until no more left 
 387 WXDLLEXPORT 
void wxFlushEvents(); 
 389 // a class which disables all windows (except, may be, thegiven one) in its 
 390 // ctor and enables them back in its dtor 
 391 class WXDLLEXPORT wxWindowDisabler
 
 394     wxWindowDisabler(wxWindow 
*winToSkip 
= (wxWindow 
*)NULL
); 
 398     wxWindowList 
*m_winDisabled
; 
 400     DECLARE_NO_COPY_CLASS(wxWindowDisabler
) 
 403 // ---------------------------------------------------------------------------- 
 405 // ---------------------------------------------------------------------------- 
 407 // Set the cursor to the busy cursor for all windows 
 408 class WXDLLEXPORT wxCursor
; 
 409 WXDLLEXPORT_DATA(extern wxCursor
*) wxHOURGLASS_CURSOR
; 
 410 WXDLLEXPORT 
void wxBeginBusyCursor(wxCursor 
*cursor 
= wxHOURGLASS_CURSOR
); 
 412 // Restore cursor to normal 
 413 WXDLLEXPORT 
void wxEndBusyCursor(); 
 415 // true if we're between the above two calls 
 416 WXDLLEXPORT 
bool wxIsBusy(); 
 418 // Convenience class so we can just create a wxBusyCursor object on the stack 
 419 class WXDLLEXPORT wxBusyCursor
 
 422     wxBusyCursor(wxCursor
* cursor 
= wxHOURGLASS_CURSOR
) 
 423         { wxBeginBusyCursor(cursor
); } 
 425         { wxEndBusyCursor(); } 
 427     // FIXME: These two methods are currently only implemented (and needed?) 
 428     //        in wxGTK.  BusyCursor handling should probably be moved to 
 429     //        common code since the wxGTK and wxMSW implementations are very 
 430     //        similar except for wxMSW using HCURSOR directly instead of 
 432     static const wxCursor 
&GetStoredCursor(); 
 433     static const wxCursor 
GetBusyCursor(); 
 437 // ---------------------------------------------------------------------------- 
 438 // Reading and writing resources (eg WIN.INI, .Xdefaults) 
 439 // ---------------------------------------------------------------------------- 
 442 WXDLLEXPORT 
bool wxWriteResource(const wxString
& section
, const wxString
& entry
, const wxString
& value
, const wxString
& file 
= wxEmptyString
); 
 443 WXDLLEXPORT 
bool wxWriteResource(const wxString
& section
, const wxString
& entry
, float value
, const wxString
& file 
= wxEmptyString
); 
 444 WXDLLEXPORT 
bool wxWriteResource(const wxString
& section
, const wxString
& entry
, long value
, const wxString
& file 
= wxEmptyString
); 
 445 WXDLLEXPORT 
bool wxWriteResource(const wxString
& section
, const wxString
& entry
, int value
, const wxString
& file 
= wxEmptyString
); 
 447 WXDLLEXPORT 
bool wxGetResource(const wxString
& section
, const wxString
& entry
, wxChar 
**value
, const wxString
& file 
= wxEmptyString
); 
 448 WXDLLEXPORT 
bool wxGetResource(const wxString
& section
, const wxString
& entry
, float *value
, const wxString
& file 
= wxEmptyString
); 
 449 WXDLLEXPORT 
bool wxGetResource(const wxString
& section
, const wxString
& entry
, long *value
, const wxString
& file 
= wxEmptyString
); 
 450 WXDLLEXPORT 
bool wxGetResource(const wxString
& section
, const wxString
& entry
, int *value
, const wxString
& file 
= wxEmptyString
); 
 451 #endif // wxUSE_RESOURCES 
 453 void WXDLLEXPORT 
wxGetMousePosition( int* x
, int* y 
); 
 455 // MSW only: get user-defined resource from the .res file. 
 456 // Returns NULL or newly-allocated memory, so use delete[] to clean up. 
 458     WXDLLEXPORT 
extern const wxChar
* wxUserResourceStr
; 
 459     WXDLLEXPORT wxChar
* wxLoadUserResource(const wxString
& resourceName
, const wxString
& resourceType 
= wxUserResourceStr
); 
 462 // ---------------------------------------------------------------------------- 
 463 // Display and colorss (X only) 
 464 // ---------------------------------------------------------------------------- 
 467     void *wxGetDisplay(); 
 471     WXDisplay 
*wxGetDisplay(); 
 472     bool wxSetDisplay(const wxString
& display_name
); 
 473     wxString 
wxGetDisplayName(); 
 478 #ifdef __VMS__ // Xlib.h for VMS is not (yet) compatible with C++ 
 479                // The resulting warnings are switched off here 
 480 #pragma message disable nosimpint 
 482 // #include <X11/Xlib.h> 
 484 #pragma message enable nosimpint 
 491 // ---------------------------------------------------------------------------- 
 492 // wxYield(): these functions are obsolete, please use wxApp methods instead! 
 493 // ---------------------------------------------------------------------------- 
 495 // Yield to other apps/messages 
 496 WXDLLIMPEXP_BASE 
bool wxYield(); 
 498 // Like wxYield, but fails silently if the yield is recursive. 
 499 WXDLLIMPEXP_BASE 
bool wxYieldIfNeeded(); 
 501 // ---------------------------------------------------------------------------- 
 502 // Error message functions used by wxWidgets (deprecated, use wxLog) 
 503 // ---------------------------------------------------------------------------- 
 505 #if WXWIN_COMPATIBILITY_2_2 
 507 // Format a message on the standard error (UNIX) or the debugging 
 509 WXDLLIMPEXP_BASE 
void wxDebugMsg(const wxChar 
*fmt 
...) ATTRIBUTE_PRINTF_1
; 
 511 // Non-fatal error (continues) 
 512 WXDLLIMPEXP_DATA_BASE(extern const wxChar
*) wxInternalErrorStr
; 
 513 WXDLLIMPEXP_BASE 
void wxError(const wxString
& msg
, const wxString
& title 
= wxInternalErrorStr
); 
 515 // Fatal error (exits) 
 516 WXDLLIMPEXP_DATA_BASE(extern const wxChar
*) wxFatalErrorStr
; 
 517 WXDLLIMPEXP_BASE 
void wxFatalError(const wxString
& msg
, const wxString
& title 
= wxFatalErrorStr
); 
 519 #endif // WXWIN_COMPATIBILITY_2_2