SDL fake fullscreen mode on dual monitor setup under linux

匿名 (未验证) 提交于 2019-12-03 08:41:19

问题:

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



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!