]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cmdline.cpp
Fix for mousewheel events when it is set to page mode instead of lines.
[wxWidgets.git] / src / common / cmdline.cpp
index 2b550d15ec8ff82dac3bca6045f137aa16a07f90..fd6c8f6c54c3f81a367d7561ce2c6d7abec85f77 100644 (file)
@@ -460,6 +460,8 @@ size_t wxCmdLineParser::GetParamCount() const
 
 wxString wxCmdLineParser::GetParam(size_t n) const
 {
+    wxCHECK_MSG( n < GetParamCount(), wxEmptyString, _T("invalid param index") );
+
     return m_data->m_parameters[n];
 }
 
@@ -986,6 +988,28 @@ static wxString GetTypeName(wxCmdLineParamType type)
 // global functions
 // ----------------------------------------------------------------------------
 
+/*
+   This function is mainly used under Windows (as under Unix we always get the
+   command line arguments as argc/argv anyhow) and so it tries to handle the
+   Windows path names (separated by backslashes) correctly. For this it only
+   considers that a backslash may be used to escape another backslash (but
+   normally this is _not_ needed) or a quote but nothing else.
+
+   In particular, to pass a single argument containing a space to the program
+   it should be quoted:
+   
+   myprog.exe foo bar       -> argc = 3, argv[1] = "foo", argv[2] = "bar"
+   myprog.exe "foo bar"     -> argc = 2, argv[1] = "foo bar"
+
+   To pass an argument containing spaces and quotes, the latter should be
+   escaped with a backslash:
+
+   myprog.exe "foo \"bar\"" -> argc = 2, argv[1] = "foo "bar""
+
+   This hopefully matches the conventions used by Explorer/command line
+   interpreter under Windows. If not, this function should be fixed.
+ */
+
 /* static */
 wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p)
 {
@@ -1016,7 +1040,8 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p)
                 p++;
 
                 // if we have 2 backslashes in a row, output one
-                if ( isQuotedByBS )
+                // unless it looks like a UNC path \\machine\dir\file.ext
+                if ( isQuotedByBS || arg.Len() == 0 )
                 {
                     arg += _T('\\');
                     isQuotedByBS = FALSE;
@@ -1045,7 +1070,11 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p)
 
                 case _T(' '):
                 case _T('\t'):
-                    if ( isInsideQuotes || isQuotedByBS )
+                    // we intentionally don't check for preceding backslash
+                    // here as if we allowed it to be used to escape spaces the
+                    // cmd line of the form "foo.exe a:\ c:\bar" wouldn't be
+                    // parsed correctly
+                    if ( isInsideQuotes )
                     {
                         // preserve it, skip endParam below
                         break;