SDL2中的多个显示

时间:2013-09-10 21:11:12

标签: c++ sdl

我正在编写一个显示动画的程序,该动画取决于显示器的大小。为了使其适用于多个显示器,我有一个display_data对象数组:

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的预期行为,还是一个错误?在任何一种情况下,任何人都可以提出解决方法吗?

编辑:使用XFCE在Debian上显示鼠标依赖性。我也在Windows上试过它,它在第二台显示器上输出两个窗口,无论鼠标位置如何。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

您可以在SDL_WINDOWPOS_UNDEFINED_DISPLAY的位置参数中结合使用SDL_CreateWindow宏和SDL_WINDOW_FULLSCREEN参数。

类似的东西:

SDL_CreateWindow(
        "Window Name",
        SDL_WINDOWPOS_UNDEFINED_DISPLAY(display),
        SDL_WINDOWPOS_UNDEFINED_DISPLAY(display),
        0,
        0,
        SDL_WINDOW_FULLSCREEN),

该宏没有很好的文档说明,但是您可以通过阅读源代码来清楚地了解宏的工作原理。