问题
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?
回答1:
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 :(
来源:https://stackoverflow.com/questions/7927974/sdl-fake-fullscreen-mode-on-dual-monitor-setup-under-linux