diff --git a/interface/wx/accel.h b/interface/wx/accel.h index e60430af76..974731fab6 100644 --- a/interface/wx/accel.h +++ b/interface/wx/accel.h @@ -119,7 +119,10 @@ public: ToString(), i.e. contain the accelerator itself only, or have the format of a full menu item text with i.e. Label TAB Accelerator. In the latter case, the part of the string - before the TAB is ignored. + before the TAB is ignored. Notice that the latter format is only + supported for the compatibility with the previous wxWidgets + versions and the new code should pass only the accelerator string + itself to this function. @return @true if the given string correctly initialized this object (i.e. if IsOk() returns true after this call) diff --git a/src/common/accelcmn.cpp b/src/common/accelcmn.cpp index 718275e160..5df35dc39f 100644 --- a/src/common/accelcmn.cpp +++ b/src/common/accelcmn.cpp @@ -158,11 +158,13 @@ wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut) { // the parser won't like trailing spaces wxString label = text; - label.Trim(true); // the initial \t must be preserved so don't strip leading whitespaces + label.Trim(true); - // If we're passed the entire menu item label instead of just the - // accelerator, skip the label part and only look after the TAB. - // check for accelerators: they are given after '\t' + // For compatibility with the old wx versions which accepted (and actually + // even required) a TAB character in the string passed to this function we + // ignore anything up to the first TAB. Notice however that the correct + // input consists of just the accelerator itself and nothing else, this is + // done for compatibility and compatibility only. int posTab = label.Find(wxT('\t')); if ( posTab == wxNOT_FOUND ) posTab = 0; @@ -274,9 +276,18 @@ wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut) /* static */ wxAcceleratorEntry *wxAcceleratorEntry::Create(const wxString& str) { + const wxString accelStr = str.AfterFirst('\t'); + if ( accelStr.empty() ) + { + // It's ok to pass strings not containing any accelerators at all to + // this function, wxMenuItem code does it and we should just return + // NULL in this case. + return NULL; + } + int flags, keyCode; - if ( !ParseAccel(str, &flags, &keyCode) ) + if ( !ParseAccel(accelStr, &flags, &keyCode) ) return NULL; return new wxAcceleratorEntry(flags, keyCode);