SDLの偽のフルスクリーンモードをlinuxの下でデュアルモニター設定にする

SDL 1.3の使用linuxの下に偽のフルスクリーンSDL_Windowを作成したいと思います。私は1つだけのディスプレイを持っている場合は簡単です。 私は現在の表示モードを得て、ウィンドウを作成しました。

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

しかし、私は2つのディスプレイを持っていると、ものは複雑になります。ウィンドウは複数のモニターにまたがって広がっています。 SDLでは、1つのダブルサイズの仮想ディスプレイしか表示されません。

私はこのコードでテストしました

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)

しかし、私は2つのディスプレイ(1680x1050と1280x1024)を持っています。

どのようにウィンドウを1つだけ(メインと仮定して)ディスプレイに留めるか?

8
+1興味深い。これはオペレーティングシステムの選択のように思えますが、私はあなたがそれについて何かできることを確信していません。
追加された 著者 karlphillip,
あなたはマルチモニターのためにどのような特別な方法を使用していますか? Xinerama? Xrandr? Nvidia twinview?スクリーンデフを別にする。あなたのxorg.confに?
追加された 著者 genpfault,
@genpfault:デフォルト設定(gnome-shell)でfedora 15を使用しています。おそらくxrandrです(私はまだLinuxの専門家ではありません)。しかし、他のマシンでも動作するはずです。
追加された 著者 Frizi,

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

include/SDL_config.h をチェックして、コピーがどのパスに従っているかを調べることができます。定義された X11MODES_DEBUG で再構築することも生産的である可能性があります。

編集:私のシステムで X11MODES_DEBUG を使って test/testvidinfo.c を試してみました。

Built-in video drivers: x11, dummy
Video driver: x11
Number of displays: 1
Display 0: 2646x1024 at 0,0
  Current mode: [email protected], 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: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 1: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 2: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 3: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 4: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 5: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 6: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
    Mode 7: [email protected], 32 bits-per-pixel
        Red Mask = 0x00ff0000
        Green Mask = 0x0000ff00
        Blue Mask = 0x000000ff
Current resolution: 2646x1024

SDLがXineramaを照会し、両方のモニタを取得したが、それを有用な方法でクライアントに返信していないように見えることがわかります。

残念ながら、メーリングリストに投稿したり、バグを報告したりする必要があるようです。

2
追加された
src/video/x11/SDL_x11modes.c の上部にある #define X11MODES_DEBUG のコメントを外し、SDLを再構築して再インストールした後、 test/testvidinfo .c をSDLソースツリーに追加します。 XineramaとXrandrの開発用ライブラリがインストールされていることを確認してください(Ubuntuでは、libxrandama-dev および libxrandr-dev )。
追加された 著者 genpfault,
このxineramaとxrandrの情報はどうやって得ましたか?私はテストソースの中にそれに関連するものは何も持っていません。
追加された 著者 Frizi,