8

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?

Frizi
  • 2,900
  • 1
  • 19
  • 25
  • 1
    +1 Interesting. This seems like a choice of the operating system and I'm not sure you can do anything about it. – karlphillip Oct 28 '11 at 15:51
  • 1
    What particular method are you using for multimonitor? Xinerama? Xrandr? Nvidia twinview? Separate screen defs. in your xorg.conf? – genpfault Oct 28 '11 at 18:19
  • 1
    @genpfault: I'm using fedora 15 under default settings (with gnome-shell). It is xrandr probably (I'm not an linux expert yet). But it should work on other machines as well. – Frizi Oct 28 '11 at 19:03

1 Answers1

2

src/video/x11/SDL_x11modes.c checks some interesting #defines:

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 :(

genpfault
  • 51,148
  • 11
  • 85
  • 139
  • How did you get this xinerama and xrandr info? I don't have anything related to it inside the test source. – Frizi Oct 29 '11 at 12:27
  • I uncommented the `#define X11MODES_DEBUG` at the top of `src/video/x11/SDL_x11modes.c`, rebuilt/reinstalled SDL, and then built/ran `test/testvidinfo.c` in the SDL source tree. Make sure you have the development libraries for Xinerama and and Xrandr installed (`libxinerama-dev` and `libxrandr-dev` on Ubuntu, dunno about Fedora). – genpfault Oct 29 '11 at 15:51