SDL поддельный полноэкранный режим при настройке с двумя мониторами в Linux

#c #linux #sdl #multiple-monitors

#c #linux #sdl #несколько мониторов

Вопрос:

Используя SDL 1.3, я хочу создать поддельный полноэкранный SDL_Window под Linux. Это легко, если у меня только один дисплей. Я только что получил текущий режим отображения и создал окно.

 SDL_GetDesktopDisplayMode(0, amp;mode);

SDL_Window *win = SDL_CreateWindow("my window",
    0,0,mode.w, mode.h,
    SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS );
 

Но когда у меня два дисплея, все усложняется. Окно распространяется на несколько мониторов. SDL видит только один виртуальный дисплей двойного размера.

Я протестировал его с помощью этого кода

 int num = SDL_GetNumVideoDisplays();
for( int i=0; i < num; i   )
{
    SDL_Rect displayRect;
    SDL_GetDisplayBounds( i, amp;displayRect );
    std::cout
        << "display " << i << ": x,y,w,h("
        << displayRect.x << ", "
        << displayRect.y << ", "
        << displayRect.w << ", "
        << displayRect.h << ")"
        << std::endl;
}
 

вывод:

 display 0: x,y,w,h(0, 0, 2960, 1050)
 

Но у меня два дисплея (1680×1050 и 1280×1024).

Как заставить окно оставаться только на одном (предположим, главном) дисплее?

Комментарии:

1. 1 Интересно. Это похоже на выбор операционной системы, и я не уверен, что вы можете что-то с этим поделать.

2. Какой конкретный метод вы используете для multimonitor? Xinerama? Xrandr? Nvidia twinview? Отдельные определения экрана. в вашем xorg.conf?

3. @genpfault: я использую fedora 15 с настройками по умолчанию (с gnome-shell). Вероятно, это xrandr (я еще не эксперт по Linux). Но он должен работать и на других машинах.

Ответ №1:

src/video/x11/SDL_x11modes.c проверяет некоторые интересные #define :

 SDL_VIDEO_DRIVER_X11_XINERAMA
SDL_VIDEO_DRIVER_X11_XRANDR
SDL_VIDEO_DRIVER_X11_XVIDMODE
 

Вы можете проверить include/SDL_config.h , по какому пути (путям) следует ваша копия. Перестройка с X11MODES_DEBUG помощью defined также может быть продуктивной.

РЕДАКТИРОВАТЬ: попробовал test/testvidinfo.c в моей системе X11MODES_DEBUG и получил это:

 Built-in video drivers: x11, dummy
Video driver: x11
Number of displays: 1
Display 0: 2646x1024 at 0,0
  Current mode: 2646x1024@0Hz, 32 bits-per-pixel
      Red Mask = 0x00ff0000
      Green Mask = 0x0000ff00
      Blue Mask = 0x000000ff
X11 detected Xinerama:
xinerama 0: 1366x768 0 0
xinerama 1: 1280x1024 1366 0
XRANDR: XRRQueryVersion: V1.3
XRANDR: mode =    0[0], w = 1366, h =  768, rate =   60
XRANDR: mode =    1[0], w = 1360, h =  768, rate =   60
XRANDR: mode =    2[0], w = 1024, h =  768, rate =   60
XRANDR: mode =    3[0], w =  800, h =  600, rate =   60
XRANDR: mode =    3[1], w =  800, h =  600, rate =   56
XRANDR: mode =    4[0], w =  640, h =  480, rate =   60
Xinerama is enabled
XRandR is enabled
  Fullscreen video modes:
    Mode 0: 2646x1024@0Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 1: 1366x768@60Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 2: 1366x768@0Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 3: 1360x768@60Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 4: 1024x768@60Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 5: 800x600@60Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 6: 800x600@56Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 7: 640x480@60Hz, 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
Current resolution: 2646x1024
 

Вы можете видеть, что SDL запросил Xinerama и получил оба моих монитора, но, похоже, не сообщает об этом клиенту полезным образом.

К сожалению, похоже, что вам нужно отправить сообщение в список рассылки или сообщить об ошибке: (

Комментарии:

1. Как вы получили эту информацию о xinerama и xrandr? У меня нет ничего, связанного с этим, внутри тестового источника.

2. Я раскомментировал #define X11MODES_DEBUG вверху src/video/x11/SDL_x11modes.c , перестроил / переустановил SDL, а затем построил / запустил test/testvidinfo.c в дереве исходных текстов SDL. Убедитесь, что у вас установлены библиотеки разработки для Xinerama и Xrandr ( libxinerama-dev и libxrandr-dev на Ubuntu, не знаю о Fedora).