2011-10-28 91 views
8

使用SDL 1.3我想在linux下創建假全屏SDL_Window。如果我只有一個顯示器很容易。 我剛剛獲得當前顯示模式並創建了一個窗口。SDL假全屏模式在Linux下的雙顯示器設置

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) 

但是我有兩個顯示器(1680×1050 1280×1024和)。

如何強制窗口停留在只有一個(假設主)顯示?

+1

+1有趣。這似乎是在操作系統的選擇,我不知道你可以做任何事情。 – karlphillip

+1

你使用多種監視器的方法是什麼?Xinerama?Xrandr?Nvidia twinview?在你的xorg.conf文件中單獨顯示屏幕? – genpfault

+1

@genpfault:我在默認設置下(使用gnome-shell)使用fedora 15。 xrandr可能(我不是linux專家),但它也可以在其他機器上工作 – Frizi

回答

2

src/video/x11/SDL_x11modes.c檢查了一些有趣的#define S:

SDL_VIDEO_DRIVER_X11_XINERAMA 
SDL_VIDEO_DRIVER_X11_XRANDR 
SDL_VIDEO_DRIVER_X11_XVIDMODE 

您可能會檢查include/SDL_config.h,看看哪條路徑(S)的副本以下。定義的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的查詢,並得到我的兩個顯示器,但似乎並沒有傳達回客戶端一種有用的方式。

可悲的是它看起來像你需要發佈到郵件列表或提交錯誤:(

+0

你是如何得到這個xinerama和xrandr信息的?我在測試源裏沒有任何與它有關的東西 – Frizi

+0

I取消註釋src/video/x11/S頂部的#define X11MODES_DEBUG DL_x11modes.c',重建/重新安裝SDL,然後在SDL源代碼樹中構建/運行'test/testvidinfo.c'。確保你已經安裝了用於Xinerama和Xrandr的開發庫(Ubuntu上的libxinerama-dev和libxrandr-dev,不知道Fedora)。 – genpfault