2013-09-10 2 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 или ошибкой? В любом случае, может ли кто-нибудь предложить обходное решение?

EDIT: зависимость от мыши отображается на Debian с помощью XFCE. Я тоже пробовал это на Windows, и он выводит оба окна на второй монитор, независимо от положения мыши.

+0

Как насчет первого запуска первого окна и ждать, пока используется кликать затем начать второй. – this

+0

Просто для двойной проверки, 'SDL_GetNumVideoDisplays()' действительно возвращает '2' на вашем двухъядерном Linux-поле? [Назад в день] (http://stackoverflow.com/questions/7927974/sdl-fake-fullscreen-mode-on-dual-monitor-setup-under-linux) возникли некоторые проблемы с API-интерфейсом с несколькими мониторами. – genpfault

+0

yep. количество отображений: 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, но он показывает тот же результат , Я не думаю, что проблема связана с несколькими полноэкранными окнами, но окна отображаются только на правильных отображениях, когда указатель мыши начинает отображаться на дисплее. Я пробовал SDL_WINDOW_SHOWN на 1/2 ширины и высоты экрана, а поведение такое же. – trm

+0

Это ... странно. Программа, которую я опубликовала, отлично работала на моей машине Win7 с двумя мониторами. – genpfault

+0

В Linux У меня есть 2 красных экрана с помощью мыши на первом экране, но только второй экран является красным, когда мышь есть. Я проверю его на Windows, как только у меня появится такая возможность, но если это сработает для вас, это, вероятно, ошибка реализации. – trm

Смежные вопросы