SDL2 — как получить подходящее разрешение экрана

Я пытаюсь открыть полноэкранное окно с помощью SDL2. Я внимательно изучил документацию по отображению и управлению окнами ( https://wiki.libsdl.org/CategoryVideo )... однако я не понимаю, как лучше всего получить разрешение экрана, над которым я на самом деле работаю.

У меня есть следующий пример кода:

SDL_DisplayMode mMode;
SDL_Rect mRect;

int ret0 = SDL_GetDisplayBounds(0, &mRect);
std::cout << "bounds w and h are: " << mRect.w << " x " << mRect.h << std::endl;
int ret2 = SDL_GetCurrentDisplayMode(0, &mMode);
std::cout << "current display res w and h are: " << mMode.w << " x " << mMode.h << std::endl;
int ret3 = SDL_GetDisplayMode(0, 0, &mMode);
std::cout << "display mode res w and h are: " << mMode.w << " x " << mMode.h << std::endl;

Я работаю на одном дисплее с разрешением 1920x1080. Тем не менее, напечатанные результаты:

вывод программы

Кажется, что SDL_GetDisplayMode() — единственная функция, отображающая правильное разрешение, поэтому я склонен использовать ее. Однако я читал, что когда дело доходит до SDL_GetDisplayMode(), режимы отображения сортируются в соответствии с определенным приоритетом, так что вызов с 0 возвращает самое большое поддерживаемое разрешение для дисплея, которое не обязательно является фактическим разрешением (см. также: определение разрешения рабочего стола SDL в Linux).

Мой вопрос: как лучше всего получить правильное разрешение?


person A. Csapo    schedule 07.11.2016    source источник
comment
Я бы использовал эту команду: SDL_GetDisplayBounds(SDL_GetWindowDisplayIndex(window), ...);. Это дает правильное разрешение в вашей системе?   -  person HolyBlackCat    schedule 07.11.2016
comment
Привет, спасибо за предложение. К сожалению, таким образом я получаю то же самое 1280x720... но, конечно, я могу вызвать его только после того, как окно было создано, а это значит, что мне придется изменить размер окна, если разрешение не подходит (это небольшая цена, которую я можно заплатить...)   -  person A. Csapo    schedule 07.11.2016
comment
Вызов этого работает: SDL_GetDisplayMode(0,SDL_GetWindowDisplayIndex(window), &mMode)... но я до сих пор не знаю, всегда ли это будет давать правильные результаты или возвращает какой-то теоретический максимум, как я сказал в посте...   -  person A. Csapo    schedule 07.11.2016
comment
Есть еще одна функция, которую стоит попробовать: SDL_GetDesktopDisplayMode(). Если это не будет работать должным образом, я бы еще раз проверил, действительно ли разрешение вашего экрана установлено на 1920x1980.   -  person HolyBlackCat    schedule 07.11.2016
comment
К сожалению, это не работает должным образом. С этой оговоркой правильно работает только SDL_GetDisplayMode. Мое разрешение действительно установлено на 1920x1080... :S   -  person A. Csapo    schedule 07.11.2016
comment
Это странно. Какая у вас система? Какая именно версия SDL?   -  person HolyBlackCat    schedule 07.11.2016
comment
Какое у вас установлено масштабирование дисплея? 150%?   -  person genpfault    schedule 07.11.2016
comment
Спасибо @genpfault, масштабирование дисплея решило эту проблему. Интересно, почему 150% процентов были указаны ОС как «рекомендуемые».   -  person A. Csapo    schedule 19.03.2017