Я создаю кроссплатформенную игру 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();
}