Ошибка изменения размера SDL2 в Fedora 21, но нормально в Windows

Я создаю кроссплатформенную игру C++ OpenGL, используя SDL2 в качестве оконного менеджера, и недавно обнаружил, что изменение размера окна имеет некоторые странные проблемы в Linux. Другие окна, такие как Терминал, отлично подходят для изменения размера. Также стоит отметить, что Fedora находится на виртуальной машине VMware.

В окнах изменение размера работает как обычно.

В Fedora21 изменение размера ведет себя странно. Лучшее, что я могу объяснить, это изменение размера окна:

  • он всегда вытягивает правую сторону, когда мышь неподвижна
  • иногда он изменяет размер по вертикали до верхней части экрана, несмотря на изменение размера только по бокам
  • Изменение размера внутрь снизу работает до тех пор, пока мышь не остановится, а затем окно начинает растягиваться наружу с постоянной скоростью (при этом также растягиваясь наружу вправо)
  • Только иногда окно привязывается к тому месту, где вы оставили мышь, когда вы ее отпускаете. В других случаях он остается в саморастянутом положении. Зависит от того, с какой стороны вы растягиваетесь.
  • Когда окно не возвращается к тому месту, где вы его отпустили, иногда окно перемещается на правильную ширину, но находится там, где окно растянулось прямо до него.

Я знаю, что это может быть что-то в моем коде, поэтому я предоставил соответствующий код ниже. Дайте мне знать, если вам нужно увидеть больше. Просто странно, что это происходит в одной ОС, но не в другой. Я также скомпилировал на OSX, так что я тоже посмотрю, что там происходит.

Релевантные кейсы событий

case SDL_WINDOWEVENT_RESIZED:
    if (event.window.windowID == SDL_GetWindowID(mainWindow))
    {
        SDL_SetWindowSize(mainWindow, event.window.data1, event.window.data2);
        reshape(event.window.data1, event.window.data2);
        postRedisplay(); // Change state to redraw
    }
    break;

И мой код изменения формы

void reshape(int w, int h)
{
    g.width = w;
    g.height = h;
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, 0, h, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

person Kelly Bang    schedule 28.02.2015    source источник


Ответы (1)


Спасибо за помощь. Проблема заключалась в том, что SDL обрабатывал изменение размера окна, но тогда я также обрабатывал его вручную. Я не знаю, почему это не было проблемой в Windows, я думаю, в Windows это обрабатывается по-другому.

Решение: удалите следующую строку

SDL_SetWindowSize(window, event.window.data1, event.window.data2);
person Kelly Bang    schedule 10.03.2015