Условия для возникновения бага
- Запустить несколько приложений (к примеру 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).
Решение напросилось само собой
SDL_Event evt; while (SDL_PollEvent(&evt)) { switch (evt.type) { case SDL_ACTIVEEVENT: if (evt.active.state != SDL_APPMOUSEFOCUS) { SDL_ShowCursor(evt.active.gain != 1); } break; } }
Естественно, что в коде стоит учитывать был ли курсор спрятан и восстанавливать его в предыдущее состояние.