LINUX.ORG.RU

SDL и fullscreen


0

0

SDL отказывается переходить в полноэкранный режим. Максимум что делает - создает окно без оформления за пределы которого мышь не выезжает. Пробовал на двух системах: на обычном ПК и под VirtualBox'ом (fluxbox & gnome соответственно). Но! Если перед этим выполнить команду xrandr без параметров, то получается нормальный полноэкранный режим. Гугль что-то молчит по этому поводу. Как это можно победить? Вот пример:

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <unistd.h>

int main(int argc, char **argv)
{
        SDL_Surface *main_screen, *tmp;
        SDL_Init(SDL_INIT_VIDEO);
        Uint32 flag = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN;
        main_screen = SDL_SetVideoMode(1024, 768, 32, flag);
        tmp = IMG_Load("img.png");
        SDL_BlitSurface(tmp, NULL, main_screen, NULL);
        SDL_Flip(main_screen);
        sleep(3);
        return 0;
}


Сразу оговорюсь, что понятия не имею в чем дело.

Если посмотреть исходники SDL (это был толстый намёк) становится очевидно, что реализаций переключения режимов там два, и оба под условной компиляцией. Можно выяснить каким именно образом SDL переключает режимы и сравнить с тем, что ждёт XServer.

Я скорее всего ошибаюсь, но если расширение xrandr подтягивается динамически (с подачи одноимённой тулзы), то само переключение вываливается с ошибкой, которую SDL не обрабатывает.

Если я таки прав, то это баг в SDL.

vaulter
()

у меня перешел в полноэкранный и сменил разрешение экрана, так что проблема в системе.

wieker ★★
()

Вот отрывок кода из одного моего проекта, все работает замечательно

void Viewport::setupWindow(int width, int height, int bpp, bool fullScreen)
{
    // Enable OpenGL double buffering
    if(SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) == -1)
        throw std::runtime_error("unable to initialize OpenGL dobule buffering");

    // Create a window and enable full-screen mode when necessary
    Uint32 flags = SDL_OPENGL;
    if(fullScreen)
        flags |= SDL_FULLSCREEN;

    _screen = SDL_SetVideoMode(width, height, bpp, flags);
    if(!_screen)
        throw std::runtime_error("unable to setup video mode");

    ...Skipped...
    ...Skipped...
    ...Skipped...
}

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

С OpenGL тоже не получилось. Попробую собрать SDL из исходников и слинковать с этой версией.

ghoust
() автор топика

Хм. Как ни странно, но с пересобранной версией все заработало идеально. Система и там и там Arch. Пакет стоял дефолтный. При сборке PKGBUILD не менял. Возможно проблема была с версиями библиотек.

ghoust
() автор топика
Ответ на: комментарий от m0rph

Возможно потому что у меня просто x86.

ghoust
() автор топика

И кстати, это конечно вопрос эстетики, но сейчас правильно делать

#include «SDL.h»
#include «SDL_image.h»

а не

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
(Естественно надо добавить директорию с заголовочными файлами SDL в include directories)

Объясняется это тем, что SDL кроссплатформенная библиотека, но только в Linux заголовочные файлы лежат в поддиректории SDL.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

На будущее учту. И раз уж пошла такая пьянка: какую кроссплатформенную библиотеку с поддержкой UTF-8 можно использовать для создания интерфейса в программах на SDL? В 2D. Те что я смотрел либо мертвые, либо русский язык не поддерживают.

ghoust
() автор топика
Ответ на: комментарий от m0rph

Тогда уж так

#include <SDL.h>
#include <SDL_image.h>


Павычки означают «начинать поиск с текущей директории», потом их
принято использовать для отделения заголовочных файлов своего проекта
от заголовочных файлов используемых либ.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Это понятно, но хотелось бы нормального функционала вроде label, button, scrollbar и пр. Хотя вроде бы получилось собрать paragui. Обновлялась давно, но попробую ее.

ghoust
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.