[EU-FOSSA] Enhance the macroable detection to avoid crash

This commit is contained in:
Don HO 2019-02-24 11:34:27 +01:00
parent d7c942ee2f
commit da2d14436c
3 changed files with 27 additions and 15 deletions

View File

@ -54,7 +54,7 @@ void Notepad_plus::macroPlayback(Macro macro)
for (Macro::iterator step = macro.begin(); step != macro.end(); ++step) for (Macro::iterator step = macro.begin(); step != macro.end(); ++step)
{ {
if (step->isPlayable()) if (step->isScintillaMacro())
step->PlayBack(this->_pPublicInterface, _pEditView); step->PlayBack(this->_pPublicInterface, _pEditView);
else else
_findReplaceDlg.execSavedCommand(step->_message, step->_lParameter, step->_sParameter); _findReplaceDlg.execSavedCommand(step->_message, step->_lParameter, step->_sParameter);

View File

@ -666,26 +666,34 @@ recordedMacroStep::recordedMacroStep(int iMessage, uptr_t wParam, uptr_t lParam,
// code comes from Scintilla's Editor.cxx: // code comes from Scintilla's Editor.cxx:
// void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam) // void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam)
bool recordedMacroStep::isMacroable(unsigned int iMessage) bool recordedMacroStep::isMacroable() const
{ {
// Enumerates all macroable messages // Enumerates all macroable messages
switch (iMessage) switch (_message)
{ {
case SCI_REPLACESEL: // (<unused>, const char *text)
case SCI_ADDTEXT: // (int length, const char *s)
case SCI_INSERTTEXT: // (int pos, const char *text)
case SCI_APPENDTEXT: // (int length, const char *s)
case SCI_SEARCHNEXT: // (int searchFlags, const char *text)
case SCI_SEARCHPREV: // (int searchFlags, const char *text)
{
if (_macroType == mtUseSParameter)
return true;
else
return false;
}
case SCI_GOTOLINE: // (int line)
case SCI_GOTOPOS: // (int position)
case SCI_SETSELECTIONMODE: // (int mode)
case SCI_CUT: case SCI_CUT:
case SCI_COPY: case SCI_COPY:
case SCI_PASTE: case SCI_PASTE:
case SCI_CLEAR: case SCI_CLEAR:
case SCI_REPLACESEL:
case SCI_ADDTEXT:
case SCI_INSERTTEXT:
case SCI_APPENDTEXT:
case SCI_CLEARALL: case SCI_CLEARALL:
case SCI_SELECTALL: case SCI_SELECTALL:
case SCI_GOTOLINE:
case SCI_GOTOPOS:
case SCI_SEARCHANCHOR: case SCI_SEARCHANCHOR:
case SCI_SEARCHNEXT:
case SCI_SEARCHPREV:
case SCI_LINEDOWN: case SCI_LINEDOWN:
case SCI_LINEDOWNEXTEND: case SCI_LINEDOWNEXTEND:
case SCI_PARADOWN: case SCI_PARADOWN:
@ -761,7 +769,6 @@ bool recordedMacroStep::isMacroable(unsigned int iMessage)
case SCI_HOMEDISPLAYEXTEND: case SCI_HOMEDISPLAYEXTEND:
case SCI_LINEENDDISPLAY: case SCI_LINEENDDISPLAY:
case SCI_LINEENDDISPLAYEXTEND: case SCI_LINEENDDISPLAYEXTEND:
case SCI_SETSELECTIONMODE:
case SCI_LINEDOWNRECTEXTEND: case SCI_LINEDOWNRECTEXTEND:
case SCI_LINEUPRECTEXTEND: case SCI_LINEUPRECTEXTEND:
case SCI_CHARLEFTRECTEXTEND: case SCI_CHARLEFTRECTEXTEND:
@ -778,7 +785,12 @@ bool recordedMacroStep::isMacroable(unsigned int iMessage)
case SCI_MOVESELECTEDLINESDOWN: case SCI_MOVESELECTEDLINESDOWN:
case SCI_SCROLLTOSTART: case SCI_SCROLLTOSTART:
case SCI_SCROLLTOEND: case SCI_SCROLLTOEND:
{
if (_macroType == mtUseLParameter)
return true; return true;
else
return false;
}
// Filter out all others like display changes. Also, newlines are redundant // Filter out all others like display changes. Also, newlines are redundant
// with char insert messages. // with char insert messages.

View File

@ -300,8 +300,8 @@ struct recordedMacroStep {
bool isValid() const { bool isValid() const {
return true; return true;
}; };
bool isPlayable() const {return _macroType <= mtMenuCommand;}; bool isScintillaMacro() const {return _macroType <= mtMenuCommand;};
bool isMacroable(unsigned int iMessage); bool isMacroable() const;
void PlayBack(Window* pNotepad, ScintillaEditView *pEditView); void PlayBack(Window* pNotepad, ScintillaEditView *pEditView);
}; };