2013-09-10 66 views
2

我正在編寫一個程序,顯示取決於顯示大小的動畫。爲了得到這個與多個顯示器的工作,我有display_data對象的數組:SDL2中的多個顯示

struct window_data 
{ 
    SDL_Rect bounds; 
    SDL_Window *window; 
}; 

和初始化這些爲每個顯示:

int numdisplays = SDL_GetNumVideoDisplays(); 
std::vector<window_data> screens(numdisplays); 
for(int i = 0 ; i < numdisplays ; ++i) 
{ 
    SDL_GetDisplayBounds(i, &(screens[ i ].bounds)); 
    screens[ i ].window 
     = SDL_CreateWindow("Display", screens[ i ].bounds.x, 
          screens[ i ].bounds.y, screens[ i ].bounds.w, 
          screens[ i ].bounds.h, SDL_WINDOW_FULLSCREEN); 
} 

這,只要我的鼠標光標正常工作在主顯示屏中,但是如果我使用輔助顯示屏中的光標啓動程序,它將在輔助顯示屏中繪製兩個窗口,從而僅顯示第二個窗口。這種行爲似乎只取決於光標的位置,而不是我運行程序的終端窗口。

我已驗證無論光標位置如何,都會找到相同的顯示編號和邊界,所以我對程序行爲的變化感到困惑。這是SDL2的預期行爲還是錯誤?無論哪種情況,任何人都可以提出解決方法?

編輯:鼠標依賴關係顯示在Debian與XFCE。我也在Windows上嘗試過這種方式,無論鼠標位置如何,它都會在第二臺顯示器上輸出這兩個窗口。

+0

如何首先啓動的第一個窗口,等待用點擊它然後開始第二。 – this

+0

只要仔細檢查一下,'SDL_GetNumVideoDisplays()'事實上是否會在雙頭Linux機器上返回'2'? [返回當天](http://stackoverflow.com/questions/7927974/sdl-fake-fullscreen-mode-on-dual-monitor-setup-under-linux)多顯示器API有一些問題。 – genpfault

+0

是的。顯示數量:2 窗口#0:x = 0 y = 0 w = 1280 h = 1024 窗口#1:x = 0 y = 1024 w = 1280 h = 800 – trm

回答

1

嘗試SDL_WINDOW_BORDERLESS而不是SDL_WINDOW_FULLSCREEN

我不確定是否有多個全屏窗口可以有意義地共存,特別是一旦你考慮輸入抓取。

嘗試是這樣的:

#include <SDL2/SDL.h> 
#include <vector> 

struct window_data 
{ 
    SDL_Rect bounds; 
    SDL_Window *window; 
    SDL_Renderer* renderer; 
}; 

int main(int argc, char **argv) 
{ 
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) 
     return EXIT_FAILURE; 

    std::vector<window_data> screens(SDL_GetNumVideoDisplays()); 
    for(size_t i = 0; i < screens.size(); ++i) 
    { 
     window_data& screen = screens[ i ]; 
     SDL_GetDisplayBounds(i, &screen.bounds); 
     screen.window = SDL_CreateWindow 
      ( 
      "Display", 
      screen.bounds.x, screen.bounds.y, 
      screen.bounds.w, screen.bounds.h, 
      SDL_WINDOW_BORDERLESS 
      ); 
     screen.renderer = SDL_CreateRenderer(screen.window, 0, SDL_RENDERER_ACCELERATED); 
     SDL_ShowWindow(screen.window); 
    } 

    bool running = true; 
    while(running) 
    { 
     SDL_Event ev; 
     while(SDL_PollEvent(&ev)) 
     { 
      if(ev.type == SDL_QUIT) running = false; 
      if(ev.type == SDL_KEYUP && 
       ev.key.keysym.sym == SDLK_ESCAPE) running = false; 
     } 

     for(size_t i = 0; i < screens.size(); ++i) 
     { 
      window_data& screen = screens[ i ]; 
      SDL_SetRenderDrawColor(screen.renderer, 255, 0, 0, 255); 
      SDL_RenderFillRect(screen.renderer, NULL); 
      SDL_RenderPresent(screen.renderer); 
     } 

     SDL_Delay(33); 
    } 

    for(size_t i = 0; i < screens.size(); ++i) 
    { 
     window_data& screen = screens[ i ]; 
     SDL_DestroyRenderer(screen.renderer); 
     SDL_DestroyWindow(screen.window); 
    } 

    SDL_Quit(); 

    return EXIT_SUCCESS; 
} 
+0

我試過SDL_WINDOW_BORDERLESS,但它顯示的結果相同。我不認爲問題是有多個全屏窗口,但是當鼠標指針在顯示0上開始時,窗口只顯示在正確的顯示上。我試着在顯示寬度和高度的1/2處嘗試SDL_WINDOW_SHOWN,行爲是一樣的。 – trm

+0

這很奇怪。我發佈的程序在帶有兩個顯示器的Win7機器上工作得很好。 – genpfault

+0

在Linux上,我有兩個紅色的屏幕,第一個屏幕上的鼠標,但只有第二個屏幕是紅色的,當鼠標在那裏。一旦我有機會,我會盡快在Windows上測試它,但如果它適合你,它可能是一個實現錯誤。 – trm