SDL logo

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

  • Запустить несколько приложений (к примеру 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;
   }
}

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