Kaydet (Commit) 23c22d3d authored tarafından Michael Meeks's avatar Michael Meeks

fdo#62094 - fix infinite loop in radio button group iteration.

Simplify the code too - we copy the vector anyway, so reversing it
should be cheap.

Change-Id: Ie655ba3044c7e0dd5a15b0e839a3712a32a1e298
üst 129836c9
...@@ -544,39 +544,14 @@ namespace ...@@ -544,39 +544,14 @@ namespace
return (pWindow && isVisibleInLayout(pWindow) && isEnabledInLayout(pWindow) && pWindow->IsInputEnabled()); return (pWindow && isVisibleInLayout(pWindow) && isEnabledInLayout(pWindow) && pWindow->IsInputEnabled());
} }
bool backInGroup(std::vector<RadioButton*>::reverse_iterator aRevStart, std::vector<RadioButton*> &rGroup) bool focusNextInGroup(std::vector<RadioButton*>::iterator aStart, std::vector<RadioButton*> &rGroup)
{ {
std::vector<RadioButton*>::reverse_iterator aI(aRevStart); std::vector<RadioButton*>::iterator aI(aStart);
while (aI != rGroup.rend())
{
Window *pWindow = *aI;
if (isSuitableDestination(pWindow))
{
pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_BACKWARD );
return true;
}
}
aI = rGroup.rbegin();
while (aI != aRevStart)
{
Window *pWindow = *aI;
if (isSuitableDestination(pWindow))
{
pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_BACKWARD );
return true;
}
}
return false; if (aStart != rGroup.end())
} ++aI;
bool forwardInGroup(std::vector<RadioButton*>::iterator aStart, std::vector<RadioButton*> &rGroup) for (; aI != rGroup.end(); ++aI)
{
std::vector<RadioButton*>::iterator aI(aStart);
while (++aI != rGroup.end())
{ {
Window *pWindow = *aI; Window *pWindow = *aI;
...@@ -587,8 +562,7 @@ namespace ...@@ -587,8 +562,7 @@ namespace
} }
} }
aI = rGroup.begin(); for (aI = rGroup.begin(); aI != aStart; ++aI)
while (aI != aStart)
{ {
Window *pWindow = *aI; Window *pWindow = *aI;
...@@ -597,6 +571,7 @@ namespace ...@@ -597,6 +571,7 @@ namespace
pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_FORWARD ); pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_FORWARD );
return true; return true;
} }
aI++;
} }
return false; return false;
...@@ -609,14 +584,14 @@ namespace ...@@ -609,14 +584,14 @@ namespace
if (aGroup.size() == 1) //only one button in group if (aGroup.size() == 1) //only one button in group
return false; return false;
if (bBackward)
std::reverse(aGroup.begin(), aGroup.end());
std::vector<RadioButton*>::iterator aStart(std::find(aGroup.begin(), aGroup.end(), pSourceWindow)); std::vector<RadioButton*>::iterator aStart(std::find(aGroup.begin(), aGroup.end(), pSourceWindow));
assert(aStart != aGroup.end()); assert(aStart != aGroup.end());
if (bBackward) return focusNextInGroup(aStart, aGroup);
return backInGroup(std::vector<RadioButton*>::reverse_iterator(aStart), aGroup);
else
return forwardInGroup(aStart, aGroup);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment