]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/utilscmn.cpp
a few more int/wxPolygonFillMode substitutions in wxRegion and wxGraphicsContext...
[wxWidgets.git] / src / common / utilscmn.cpp
index a0aa6a98c43b5b3bb2cf74a6644c4da420187471..bc45db3b2bb2b8cc19b8b212f3d54bca06a0ab32 100644 (file)
 
 #if wxUSE_BASE
 
-// ----------------------------------------------------------------------------
-// common data
-// ----------------------------------------------------------------------------
-
 // ============================================================================
 // implementation
 // ============================================================================
@@ -125,7 +121,7 @@ int wxHexToDec(const wxString& buf)
     if (buf.GetChar(0) >= wxT('A'))
         firstDigit = buf.GetChar(0) - wxT('A') + 10;
     else
-       firstDigit = buf.GetChar(0) - wxT('0');
+        firstDigit = buf.GetChar(0) - wxT('0');
 
     if (buf.GetChar(1) >= wxT('A'))
         secondDigit = buf.GetChar(1) - wxT('A') + 10;
@@ -166,6 +162,16 @@ wxString wxDecToHex(int dec)
 // misc functions
 // ----------------------------------------------------------------------------
 
+// Don't synthesize KeyUp events holding down a key and producing KeyDown
+// events with autorepeat. On by default and always on in wxMSW. wxGTK version
+// in utilsgtk.cpp.
+#ifndef __WXGTK__
+bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) )
+{
+    return true;    // detectable auto-repeat is the only mode MSW supports
+}
+#endif // !wxGTK
+
 // Return the current date/time
 wxString wxNow()
 {
@@ -184,10 +190,12 @@ wxString wxNow()
 #endif
 }
 
+#if WXWIN_COMPATIBILITY_2_8
 void wxUsleep(unsigned long milliseconds)
 {
     wxMilliSleep(milliseconds);
 }
+#endif
 
 const wxChar *wxGetInstallPrefix()
 {
@@ -224,6 +232,10 @@ bool wxIsPlatformLittleEndian()
 }
 
 
+// ----------------------------------------------------------------------------
+// wxPlatform
+// ----------------------------------------------------------------------------
+
 /*
  * Class to make it easier to specify platform-dependent values
  */
@@ -436,8 +448,7 @@ bool wxGetEmailAddress(wxChar *address, int maxSize)
     if ( !email )
         return false;
 
-    wxStrncpy(address, email, maxSize - 1);
-    address[maxSize - 1] = wxT('\0');
+    wxStrlcpy(address, email.t_str(), maxSize);
 
     return true;
 }
@@ -645,19 +656,9 @@ long wxExecute(const wxString& command,
 }
 
 // ----------------------------------------------------------------------------
-// wxApp::Yield() wrappers for backwards compatibility
+// Id functions
 // ----------------------------------------------------------------------------
 
-bool wxYield()
-{
-    return wxTheApp && wxTheApp->Yield();
-}
-
-bool wxYieldIfNeeded()
-{
-    return wxTheApp && wxTheApp->Yield(true);
-}
-
 // Id generation
 static long wxCurrentId = 100;
 
@@ -711,16 +712,16 @@ Thanks,
 
 /* Byte-wise swap two items of size SIZE. */
 #define SWAP(a, b, size)                                                      \
-  do                                                                              \
-    {                                                                              \
-      register size_t __size = (size);                                              \
-      register char *__a = (a), *__b = (b);                                      \
+  do                                                                          \
+    {                                                                         \
+      register size_t __size = (size);                                        \
+      register char *__a = (a), *__b = (b);                                   \
       do                                                                      \
-        {                                                                      \
-          char __tmp = *__a;                                                      \
+        {                                                                     \
+          char __tmp = *__a;                                                  \
           *__a++ = *__b;                                                      \
-          *__b++ = __tmp;                                                      \
-        } while (--__size > 0);                                                      \
+          *__b++ = __tmp;                                                     \
+        } while (--__size > 0);                                               \
     } while (0)
 
 /* Discontinue quicksort algorithm when partition gets below this size.
@@ -923,9 +924,9 @@ void wxQsort(void *const pbase, size_t total_elems,
   }
 }
 
+#endif // wxUSE_BASE
 
 
-#endif // wxUSE_BASE
 
 // ============================================================================
 // GUI-only functions from now on
@@ -937,11 +938,16 @@ void wxQsort(void *const pbase, size_t total_elems,
 // Launch document with default app
 // ----------------------------------------------------------------------------
 
-bool wxLaunchDefaultApplication(const wxString &document, int flags)
+bool wxLaunchDefaultApplication(const wxStringdocument, int flags)
 {
     wxUnusedVar(flags);
 
-#ifdef __UNIX__
+#ifdef __WXMAC__
+    static const char * const OPEN_CMD = "/usr/bin/open";
+    if ( wxFileExists(OPEN_CMD) &&
+            wxExecute(wxString(OPEN_CMD) + " " + document) )
+        return true;
+#elif defined(__UNIX__)
     // Our best best is to use xdg-open from freedesktop.org cross-desktop
     // compatibility suite xdg-utils
     // (see http://portland.freedesktop.org/wiki/) -- this is installed on
@@ -954,9 +960,26 @@ bool wxLaunchDefaultApplication(const wxString &document, int flags)
         if ( wxExecute(xdg_open + " " + document) )
             return true;
     }
+#elif defined(__WXMSW__)
+    WinStruct<SHELLEXECUTEINFO> sei;
+    sei.lpFile = document.wx_str();
+    sei.lpVerb = _T("open");
+#ifdef __WXWINCE__
+    sei.nShow = SW_SHOWNORMAL; // SW_SHOWDEFAULT not defined under CE (#10216)
+#else
+    sei.nShow = SW_SHOWDEFAULT;
 #endif
 
-   return false;
+    // avoid Windows message box in case of error for consistency with
+    // wxLaunchDefaultBrowser() even if don't show the error ourselves in this
+    // function
+    sei.fMask = SEE_MASK_FLAG_NO_UI;
+
+    if ( ::ShellExecuteEx(&sei) )
+        return true;
+#endif
+
+    return false;
 }
 
 // ----------------------------------------------------------------------------
@@ -1004,13 +1027,14 @@ static bool DoLaunchDefaultBrowser(const wxString& urlOrig, int flags)
             wxRegKey keyDDE(key, wxT("DDEExec"));
             if ( keyDDE.Exists() )
             {
-                const wxString ddeTopic = wxRegKey(keyDDE, wxT("topic"));
-
                 // we only know the syntax of WWW_OpenURL DDE request for IE,
                 // optimistically assume that all other browsers are compatible
                 // with it
+                static const wxChar *TOPIC_OPEN_URL = wxT("WWW_OpenURL");
                 wxString ddeCmd;
-                bool ok = ddeTopic == wxT("WWW_OpenURL");
+                wxRegKey keyTopic(keyDDE, wxT("topic"));
+                bool ok = keyTopic.Exists() &&
+                            keyTopic.QueryDefaultValue() == TOPIC_OPEN_URL;
                 if ( ok )
                 {
                     ddeCmd = keyDDE.QueryDefaultValue();
@@ -1023,7 +1047,7 @@ static bool DoLaunchDefaultBrowser(const wxString& urlOrig, int flags)
                     // in is -1 (meaning "current") by default, replace it with
                     // 0 which means "new" (see KB article 160957)
                     ok = ddeCmd.Replace(wxT("-1"), wxT("0"),
-                                        false /* only first occurence */) == 1;
+                                        false /* only first occurrence */) == 1;
                 }
 
                 if ( ok )
@@ -1039,7 +1063,7 @@ static bool DoLaunchDefaultBrowser(const wxString& urlOrig, int flags)
                     wxLogNull noLog;
 
                     const wxString ddeServer = wxRegKey(keyDDE, wxT("application"));
-                    if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCmd) )
+                    if ( wxExecuteDDE(ddeServer, TOPIC_OPEN_URL, ddeCmd) )
                         return true;
 
                     // this is not necessarily an error: maybe browser is
@@ -1057,22 +1081,10 @@ static bool DoLaunchDefaultBrowser(const wxString& urlOrig, int flags)
     sei.lpFile = url.c_str();
     sei.lpVerb = _T("open");
     sei.nShow = SW_SHOWNORMAL;
+    sei.fMask = SEE_MASK_FLAG_NO_UI; // we give error message ourselves
 
-    ::ShellExecuteEx(&sei);
-
-    const INT_PTR nResult = (INT_PTR)sei.hInstApp;
-
-    // Firefox returns file not found for some reason, so make an exception
-    // for it
-    if ( nResult > 32 || nResult == SE_ERR_FNF )
-    {
-#ifdef __WXDEBUG__
-        // Log something if SE_ERR_FNF happens
-        if ( nResult == SE_ERR_FNF )
-            wxLogDebug(wxT("SE_ERR_FNF from ShellExecute -- maybe FireFox?"));
-#endif // __WXDEBUG__
+    if ( ::ShellExecuteEx(&sei) )
         return true;
-    }
 #elif defined(__WXCOCOA__)
     // NOTE: We need to call the real implementation from src/cocoa/utils.mm
     // because the code must use Objective-C features.
@@ -1414,7 +1426,7 @@ void wxInfoMessageBox(wxWindow* parent)
     msg.Printf(_T("wxWidgets Library (%s port)\n")
                _T("Version %d.%d.%d%s%s, compiled at %s %s\n")
                _T("Runtime version of toolkit used is %d.%d.%s\n")
-               _T("Copyright (c) 1995-2008 wxWidgets team"),
+               _T("Copyright (c) 1995-2009 wxWidgets team"),
                wxPlatformInfo::Get().GetPortIdName().c_str(),
                wxMAJOR_VERSION,
                wxMINOR_VERSION,
@@ -1670,14 +1682,18 @@ bool wxSafeYield(wxWindow *win, bool onlyIfNeeded)
     return rc;
 }
 
-// Don't synthesize KeyUp events holding down a key and producing KeyDown
-// events with autorepeat. On by default and always on in wxMSW. wxGTK version
-// in utilsgtk.cpp.
-#ifndef __WXGTK__
-bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) )
+// ----------------------------------------------------------------------------
+// wxApp::Yield() wrappers for backwards compatibility
+// ----------------------------------------------------------------------------
+
+bool wxYield()
 {
-    return true;    // detectable auto-repeat is the only mode MSW supports
+    return wxTheApp && wxTheApp->Yield();
+}
+
+bool wxYieldIfNeeded()
+{
+    return wxTheApp && wxTheApp->Yield(true);
 }
-#endif // !wxGTK
 
 #endif // wxUSE_GUI