Using SDL 1.3 I want to create fake fullscreen SDL_Window under linux. It is easy if i have only one display. I just got current display mode and created a window.
SDL_GetDesktopDisplayMode(0, &mode); SDL_Window *win = SDL_CreateWindow("my window", 0,0,mode.w, mode.h, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS );
But when i have two displays, things get complicated. The window spreads across multiple monitors. SDL sees only one, double sized virtual display.
I tested it with this code
int num = SDL_GetNumVideoDisplays(); for( int i=0; i < num; i++ ) { SDL_Rect displayRect; SDL_GetDisplayBounds( i, &displayRect ); std::cout << "display " << i << ": x,y,w,h(" << displayRect.x << ", " << displayRect.y << ", " << displayRect.w << ", " << displayRect.h << ")" << std::endl; }
output:
display 0: x,y,w,h(0, 0, 2960, 1050)
But i have two displays (1680x1050 and 1280x1024).
How to force the window to stay on only one (assume main) display?
src/video/x11/SDL_x11modes.c
checks some interesting #define
s:
SDL_VIDEO_DRIVER_X11_XINERAMA SDL_VIDEO_DRIVER_X11_XRANDR SDL_VIDEO_DRIVER_X11_XVIDMODE
You might check include/SDL_config.h
to see which path(s) your copy is following. Rebuilding with X11MODES_DEBUG
defined may also be productive.
EDIT: Tried test/testvidinfo.c
on my system with X11MODES_DEBUG
and got this:
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
You can see SDL has queried Xinerama and gotten both of my monitors but doesn't seem to communicate that back to the client in a useful manner.
Sadly it looks like you need to post to the mailing list or file a bug :(