在Linux双显示器设置下,如何使用SDL模拟全屏模式?

8

使用SDL 1.3,我想在Linux下创建一个假的全屏SDL_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 );

但是当我有两个显示器时,情况就变得复杂了。窗口跨越多个监视器。SDL仅看到一个双倍大小的虚拟显示器。

我用以下代码进行测试:

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;
}

输出:

display 0: x,y,w,h(0, 0, 2960, 1050)

但我有两个显示器(分辨率分别为1680x1050和1280x1024)。

如何强制窗口仅停留在一个(假设是主要的)显示器上?


1
+1 有趣。这似乎是操作系统的选择,我不确定你能做些什么。 - karlphillip
1
你在使用什么特定的方法来实现多显示器?是Xinerama吗?还是Xrandr?或者是Nvidia Twinview?或者是在你的xorg.conf文件中分别定义屏幕? - genpfault
1
@genpfault:我正在使用默认设置下的Fedora 15(带有gnome-shell)。可能是xrandr的问题(我还不是Linux专家)。但它应该在其他机器上也能工作。 - Frizi
1个回答

2

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 可能也是有成效的。
编辑:在我的系统上尝试了带有 X11MODES_DEBUGtest/testvidinfo.c,并得到了以下结果:
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并获取了我的两个监视器,但却似乎没有以有用的方式将这些信息传回客户端。
不幸的是,看起来你需要在邮件列表中发帖或提交错误报告 :(

你是怎么获取这个xinerama和xrandr信息的?我在测试源代码中没有找到任何相关的内容。 - Frizi
我在src/video/x11/SDL_x11modes.c的顶部取消了#define X11MODES_DEBUG的注释,重新构建/安装了SDL,然后在SDL源代码树中构建/运行了test/testvidinfo.c。请确保您已经安装了Xinerama和Xrandr的开发库(在Ubuntu上是libxinerama-devlibxrandr-dev,对于Fedora我不确定)。 - genpfault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接