Проблем с преоразмеряването на SDL2 във Fedora 21, но добре в Windows

Създавам междуплатформена C++ OpenGL игра, използвайки SDL2 като мениджър на прозорци, и наскоро открих, че преоразмеряването на прозореца има някои странни проблеми в linux. Други прозорци като Terminal работят добре за преоразмеряване. Може също така да се отбележи, че Fedora е във виртуална машина на VMware.

В Windows преоразмеряването функционира нормално.

Във 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