#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).