Условия для возникновения бага:

  • Запустить несколько приложений (к примеру MS Explorer).
  • Минимизировать их (нужно минимизировать ВСЕ окна).
  • Запустить в полноэкранном режиме SDL-приложение.
  • Нажать Alt+Tab.

Курсор перемещается в координату 0,0. Попытка активировать мышью минимизированное приложение приводит к тому, что курсор снова перемещается в 0,0. Переключиться на минимизированное приложение можно только с помощью Alt+Tab.

Гугл указал на SDL (XP and Vista) window management bugs, со схожей проблемой.
В качестве решения предлагается пропатчить и пересобрать SDL. Я списался с Michael Kurinnoy и он подтвердил, что это 100% рабочее решение.

Сделав небольшое тестовое приложение, я заметил, что этот баг возникает в случае SDL_ShowCursor(0).

Решение напросилось само собой:
[sourcecode language=’cpp’]
SDL_Event evt;
while(SDL_PollEvent(&evt)) {
switch(evt.type) {
case SDL_ACTIVEEVENT:
if(evt.active.state != SDL_APPMOUSEFOCUS) {
if(evt.active.gain == 1) {
SDL_ShowCursor(0);
}
else {
SDL_ShowCursor(1);
}
}
break;
}
}
[/sourcecode]

Естественно, что в коде стоит учитывать был ли курсор спрятан и восстанавливать его в предыдущее состояние.