VirtualBox

Changeset 81537 in vbox for trunk/src/VBox/Frontends/VBoxSDL


Ignore:
Timestamp:
Oct 25, 2019 11:46:30 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134270
Message:

FE/VBoxSDL: Added first support for SDL2 (by setting VBOX_WITH_SDL2). Very rough / hacky by now and needs more testing first before enabling by default. Also fixed non-starting with SDL 1.2.x on Windows hosts.

Known limitations / todos when running with SDL 2 for now:

  • No alpha channel support for cursors.
  • No mouse wheel support.
  • Desktop geometry handling needs a revamp for multi monitor setups.
  • Check / revamp dirty rectangle blitting.
  • OpenGL renderer needs testing wrt texture blitting.
Location:
trunk/src/VBox/Frontends/VBoxSDL
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxSDL/Framebuffer.cpp

    r77370 r81537  
    113113                     bool fUpdateImage)
    114114{
    115     int rc;
    116115    LogFlow(("VBoxSDLFB::VBoxSDLFB\n"));
    117116
     
    119118    mfUpdateImage   = fUpdateImage;
    120119    mScreen         = NULL;
    121 #ifdef VBOX_WITH_SDL13
    122     mWindow         = 0;
    123     mTexture        = 0;
     120#ifdef VBOX_WITH_SDL2
     121    mpWindow        = NULL;
     122    mpTexture       = NULL;
     123    mpRenderer      = NULL;
    124124#endif
    125125    mSurfVRAM       = NULL;
     
    150150    mfUpdates = false;
    151151
    152     rc = RTCritSectInit(&mUpdateLock);
     152    int rc = RTCritSectInit(&mUpdateLock);
    153153    AssertMsg(rc == VINF_SUCCESS, ("Error from RTCritSectInit!\n"));
    154154
     
    161161#endif
    162162
    163     return 0;
     163#ifdef VBOX_WITH_SDL2
     164    rc = SDL_GetRendererInfo(mpRenderer, &mRenderInfo);
     165    if (RT_SUCCESS(rc))
     166    {
     167        if (fShowSDLConfig)
     168            RTPrintf("Render info:\n"
     169                     "  Name:                    %s\n"
     170                     "  Render flags:            0x%x\n"
     171                     "  SDL video driver:        %s\n",
     172                     mRenderInfo.name,
     173                     mRenderInfo.flags,
     174                     RTEnvGet("SDL_VIDEODRIVER"));
     175    }
     176#endif
     177
     178    return rc;
    164179}
    165180
     
    184199}
    185200
     201/* static */
    186202bool VBoxSDLFB::init(bool fShowSDLConfig)
    187203{
     
    195211    if (!RTEnvExist("SDL_VIDEODRIVER"))
    196212    {
    197         _putenv("SDL_VIDEODRIVER=directx");
    198 //        _putenv("SDL_VIDEODRIVER=windib");
     213# ifndef VBOX_WITH_SDL2
     214        /* Always select the windib driver by default, as the directx one is known to be broken on newer Windows OSes. */
     215        RTEnvSet("SDL_VIDEODRIVER", "windib");
     216# else
     217        RTEnvSet("SDL_VIDEODRIVER", "directx");
     218# endif
    199219    }
    200220#endif
     
    204224    RTEnvSet("SDL_VIDEO_X11_DGAMOUSE", "0");
    205225#endif
     226
    206227    int rc = SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_NOPARACHUTE);
    207228    if (rc != 0)
     
    212233    gfSdlInitialized = true;
    213234
     235#ifdef VBOX_WITH_SDL2
     236    RT_NOREF(fShowSDLConfig);
     237#else
    214238    const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
    215     Assert(videoInfo);
     239    AssertPtr(videoInfo);
    216240    if (videoInfo)
    217241    {
     
    244268                         RTEnvGet("SDL_VIDEODRIVER"));
    245269    }
    246 
    247     if (12320 == g_cbIco64x01)
    248     {
    249         gWMIcon = SDL_AllocSurface(SDL_SWSURFACE, 64, 64, 24, 0xff, 0xff00, 0xff0000, 0);
    250         /** @todo make it as simple as possible. No PNM interpreter here... */
    251         if (gWMIcon)
    252         {
    253             memcpy(gWMIcon->pixels, g_abIco64x01+32, g_cbIco64x01-32);
    254             SDL_WM_SetIcon(gWMIcon, NULL);
    255         }
    256     }
     270#endif /* !VBOX_WITH_SDL2 */
     271
     272#ifndef VBOX_WITH_SDL2
     273    gWMIcon = SDL_AllocSurface(SDL_SWSURFACE, 64, 64, 24, 0xff, 0xff00, 0xff0000, 0);
     274    /** @todo make it as simple as possible. No PNM interpreter here... */
     275    if (gWMIcon)
     276    {
     277        memcpy(gWMIcon->pixels, g_abIco64x01+32, g_cbIco64x01-32);
     278        SDL_WM_SetIcon(gWMIcon, NULL);
     279    }
     280#endif
    257281
    258282    return true;
     
    270294        AssertMsg(gSdlNativeThread == RTThreadNativeSelf(), ("Wrong thread! SDL is not threadsafe!\n"));
    271295        SDL_QuitSubSystem(SDL_INIT_VIDEO);
     296
     297#ifndef VBOX_WITH_SDL2
    272298        if (gWMIcon)
    273299        {
     
    275301            gWMIcon = NULL;
    276302        }
     303#endif
    277304    }
    278305}
     
    581608        /* nope, we don't want that (but still don't freak out if it is set) */
    582609#ifdef DEBUG
    583         printf("VBoxSDL::VideoModeSupported: we refused mode %dx%dx%d\n", width, height, bpp);
     610        RTPrintf("VBoxSDL::VideoModeSupported: we refused mode %dx%dx%d\n", width, height, bpp);
    584611#endif
    585612        *supported = false;
     
    770797{
    771798    LogFlow(("VBoxSDL:resizeSDL\n"));
     799
     800#ifdef VBOX_WITH_SDL2
     801    const int cDisplays = SDL_GetNumVideoDisplays();
     802    if (cDisplays > 0)
     803    {
     804        for (int d = 0; d < cDisplays; d++)
     805        {
     806            const int cDisplayModes = SDL_GetNumDisplayModes(d);
     807            for (int m = 0; m < cDisplayModes; m++)
     808            {
     809                SDL_DisplayMode mode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };
     810                if (SDL_GetDisplayMode(d, m, &mode) != 0)
     811                {
     812                    RTPrintf("Display #%d, mode %d:\t\t%i bpp\t%i x %i",
     813                             SDL_BITSPERPIXEL(mode.format), mode.w, mode.h);
     814                }
     815
     816                if (m == 0)
     817                {
     818                    /*
     819                     * according to the SDL documentation, the API guarantees that
     820                     * the modes are sorted from larger to smaller, so we just
     821                     * take the first entry as the maximum.
     822                     */
     823                    mMaxScreenWidth  = mode.w;
     824                    mMaxScreenHeight = mode.h;
     825                }
     826
     827                /* Keep going. */
     828            }
     829        }
     830    }
     831    else
     832        AssertFailed(); /** @todo */
     833#else
    772834
    773835    /*
     
    814876        mMaxScreenHeight = ~(uint32_t)0;
    815877    }
     878#endif /* VBOX_WITH_SDL2 */
    816879
    817880    uint32_t newWidth;
     
    841904    mTopOffset = 0;
    842905
    843 #if defined(VBOX_WITH_SDL13)
     906#ifdef VBOX_WITH_SDL2
    844907    int sdlWindowFlags = SDL_WINDOW_SHOWN;
    845908    if (mfResizable)
    846909        sdlWindowFlags |= SDL_WINDOW_RESIZABLE;
    847     if (!mWindow)
     910    if (!mpWindow)
    848911    {
    849912        SDL_DisplayMode desktop_mode;
     
    851914        int y = 40 + mScreenId * 15;
    852915
    853         SDL_GetDesktopDisplayMode(&desktop_mode);
     916        SDL_GetDesktopDisplayMode(mScreenId, &desktop_mode);
    854917        /* create new window */
    855918
    856919        char szTitle[64];
    857920        RTStrPrintf(szTitle, sizeof(szTitle), "SDL window %d", mScreenId);
    858         mWindow = SDL_CreateWindow(szTitle, x, y,
     921        mpWindow = SDL_CreateWindow(szTitle, x, y,
    859922                                   newWidth, newHeight, sdlWindowFlags);
    860         if (SDL_CreateRenderer(mWindow, -1,
    861                                SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTDISCARD) < 0)
     923        mpRenderer = SDL_CreateRenderer(mpWindow, -1, 0 /* SDL_RendererFlags */);
     924        if (mpRenderer)
     925        {
     926            SDL_GetRendererInfo(mpRenderer, &mRenderInfo);
     927
     928            mpTexture = SDL_CreateTexture(mpRenderer, desktop_mode.format,
     929                                          SDL_TEXTUREACCESS_STREAMING, newWidth, newHeight);
     930            if (!mpTexture)
     931                AssertReleaseFailed();
     932        }
     933        else
    862934            AssertReleaseFailed();
    863935
    864         SDL_GetRendererInfo(&mRenderInfo);
    865 
    866         mTexture = SDL_CreateTexture(desktop_mode.format,
    867                                      SDL_TEXTUREACCESS_STREAMING, newWidth, newHeight);
    868         if (!mTexture)
    869             AssertReleaseFailed();
     936        if (12320 == g_cbIco64x01)
     937        {
     938            gWMIcon = SDL_CreateRGBSurface(0 /* Flags, must be 0 */, 64, 64, 24, 0xff, 0xff00, 0xff0000, 0);
     939            /** @todo make it as simple as possible. No PNM interpreter here... */
     940            if (gWMIcon)
     941            {
     942                memcpy(gWMIcon->pixels, g_abIco64x01+32, g_cbIco64x01-32);
     943                SDL_SetWindowIcon(mpWindow, gWMIcon);
     944            }
     945        }
    870946    }
    871947    else
     
    876952
    877953        /* resize current window */
    878         SDL_GetWindowSize(mWindow, &w, &h);
     954        SDL_GetWindowSize(mpWindow, &w, &h);
    879955
    880956        if (w != (int)newWidth || h != (int)newHeight)
    881             SDL_SetWindowSize(mWindow, newWidth, newHeight);
    882 
    883         SDL_QueryTexture(mTexture, &format, &access, &w, &h);
    884         SDL_SelectRenderer(mWindow);
    885         SDL_DestroyTexture(mTexture);
    886         mTexture = SDL_CreateTexture(format, access, newWidth, newHeight);
    887         if (!mTexture)
     957            SDL_SetWindowSize(mpWindow, newWidth, newHeight);
     958
     959        SDL_QueryTexture(mpTexture, &format, &access, &w, &h);
     960        SDL_DestroyTexture(mpTexture);
     961        mpTexture = SDL_CreateTexture(mpRenderer, format, access, newWidth, newHeight);
     962        if (!mpTexture)
    888963            AssertReleaseFailed();
    889964    }
     
    895970    uint32_t format;
    896971
    897     if (SDL_QueryTexture(mTexture, &format, NULL, &w, &h) < 0)
     972    if (SDL_QueryTexture(mpTexture, &format, NULL, &w, &h) < 0)
    898973        AssertReleaseFailed();
    899974
     
    901976        AssertReleaseFailed();
    902977
    903     if (SDL_QueryTexturePixels(mTexture, &pixels, &pitch) == 0)
     978    if (SDL_LockTexture(mpTexture, NULL /* SDL_Rect */, &pixels, &pitch) == 0)
    904979    {
    905980        mScreen = SDL_CreateRGBSurfaceFrom(pixels, w, h, bpp, pitch,
    906981                                           Rmask, Gmask, Bmask, Amask);
     982        SDL_UnlockTexture(mpTexture); /** @BUGBUG See: https://bugzilla.libsdl.org/show_bug.cgi?id=1586 */
    907983    }
    908984    else
     
    9331009    SDL_VERSION(&info.version);
    9341010    if (SDL_GetWMInfo(&info))
    935         mWinId = (LONG64) info.info.x11.wmwindow;
     1011        mWinId = (LONG64) info.info.x11.wmpWindow;
    9361012# elif defined(RT_OS_DARWIN)
    9371013    mWinId = (intptr_t)VBoxSDLGetDarwinWindowId();
     
    9391015    /* XXX ignore this for other architectures */
    9401016# endif
    941 #endif
     1017#endif /* VBOX_WITH_SDL2 */
    9421018#ifdef VBOX_SECURELABEL
    9431019    /*
     
    9711047            mCenterYOffset = (mFixedSDLHeight - (mGuestYRes + mLabelHeight)) / 2;
    9721048    }
    973 #endif
     1049#endif /* VBOX_SECURELABEL */
     1050
    9741051    AssertMsg(mScreen, ("Error: SDL_SetVideoMode failed!\n"));
    9751052    if (mScreen)
     
    9801057#endif
    9811058        if (mfShowSDLConfig)
    982             RTPrintf("Resized to %dx%d, screen surface type: %s\n", mScreen->w, mScreen->h,
    983                      ((mScreen->flags & SDL_HWSURFACE) == 0) ? "software" : "hardware");
     1059            RTPrintf("Resized to %dx%d\n", mScreen->w, mScreen->h);
    9841060    }
    9851061}
     
    10791155    SDL_BlitSurface(mSurfVRAM, &srcRect, mScreen, &dstRect);
    10801156    /* hardware surfaces don't need update notifications */
    1081 #if defined(VBOX_WITH_SDL13)
     1157#if defined(VBOX_WITH_SDL2)
    10821158    AssertRelease(mScreen->flags & SDL_PREALLOC);
    1083     SDL_SelectRenderer(mWindow);
    1084     SDL_DirtyTexture(mTexture, 1, &dstRect);
    1085     AssertRelease(mRenderInfo.flags & SDL_RENDERER_PRESENTCOPY);
    1086     SDL_RenderCopy(mTexture, &dstRect, &dstRect);
    1087     SDL_RenderPresent();
     1159    /** @todo Do we need to update the dirty rect for the texture for SDL2 here as well? */
     1160    SDL_RenderClear(mpRenderer);
     1161    SDL_RenderCopy(mpRenderer, mpTexture, &dstRect, &dstRect);
     1162    SDL_RenderPresent(mpRenderer);
    10881163#else
    10891164    if ((mScreen->flags & SDL_HWSURFACE) == 0)
     
    11311206void VBoxSDLFB::getFullscreenGeometry(uint32_t *width, uint32_t *height)
    11321207{
     1208#ifndef VBOX_WITH_SDL2
    11331209    SDL_Rect **modes;
    11341210
     
    11591235        }
    11601236    }
    1161 }
     1237#else
     1238    SDL_DisplayMode dm;
     1239    int rc = SDL_GetDesktopDisplayMode(0, &dm); /** @BUGBUG Handle multi monitor setups! */
     1240    if (rc == 0)
     1241    {
     1242        *width  = dm.w;
     1243        *height = dm.w;
     1244    }
     1245#endif
     1246}
     1247
     1248#ifdef VBOX_WITH_SDL2
     1249int VBoxSDLFB::setWindowTitle(const char *pcszTitle)
     1250{
     1251    SDL_SetWindowTitle(mpWindow, pcszTitle);
     1252
     1253    return VINF_SUCCESS;
     1254}
     1255#endif
    11621256
    11631257#ifdef VBOX_SECURELABEL
     
    13021396HRESULT VBoxSDLFBOverlay::init()
    13031397{
    1304     mBlendedBits = SDL_CreateRGBSurface(SDL_ANYFORMAT, mOverlayWidth, mOverlayHeight, 32,
     1398#ifndef VBOX_WITH_SDL2
     1399    Uint32 fFlags = SDL_ANYFORMAT;
     1400#else
     1401    Uint32 fFlags = 0;
     1402#endif
     1403
     1404    mBlendedBits = SDL_CreateRGBSurface(fFlags, mOverlayWidth, mOverlayHeight, 32,
    13051405                                        0x00ff0000, 0x0000ff00, 0x000000ff, 0);
    13061406    AssertMsgReturn(mBlendedBits != NULL, ("Failed to create an SDL surface\n"),
    13071407                    E_OUTOFMEMORY);
    1308     mOverlayBits = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, mOverlayWidth,
     1408
     1409#ifndef VBOX_WITH_SDL2
     1410    fFlags = SDL_SWSURFACE | SDL_SRCALPHA, mOverlayWidth;
     1411#else
     1412    fFlags = 0;
     1413#endif
     1414
     1415    mOverlayBits = SDL_CreateRGBSurface(fFlags,
    13091416                                        mOverlayHeight, 32, 0x00ff0000, 0x0000ff00,
    1310                                         0x000000ff, 0xff000000);
     1417                                        0x000000ff, 0xff000000, 0);
    13111418    AssertMsgReturn(mOverlayBits != NULL, ("Failed to create an SDL surface\n"),
    13121419                    E_OUTOFMEMORY);
     
    16171724    mOverlayHeight = h;
    16181725    SDL_FreeSurface(mOverlayBits);
    1619     mBlendedBits = SDL_CreateRGBSurface(SDL_ANYFORMAT, mOverlayWidth, mOverlayHeight, 32,
     1726
     1727#ifndef VBOX_WITH_SDL2
     1728    Uint32 fFlags = SDL_ANYFORMAT;
     1729#else
     1730    Uint32 fFlags = 0;
     1731#endif
     1732
     1733    mBlendedBits = SDL_CreateRGBSurface(fFlags, mOverlayWidth, mOverlayHeight, 32,
    16201734                                        0x00ff0000, 0x0000ff00, 0x000000ff, 0);
    16211735    AssertMsgReturn(mBlendedBits != NULL, ("Failed to create an SDL surface\n"),
    16221736                    E_OUTOFMEMORY);
    1623     mOverlayBits = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, mOverlayWidth,
     1737
     1738#ifndef VBOX_WITH_SDL2
     1739    fFlags = SDL_SWSURFACE | SDL_SRCALPHA;
     1740#else
     1741    fFlags = 0;
     1742#endif
     1743
     1744    mOverlayBits = SDL_CreateRGBSurface(fFlags, mOverlayWidth,
    16241745                                        mOverlayHeight, 32, 0x00ff0000, 0x0000ff00,
    16251746                                        0x000000ff, 0xff000000);
  • trunk/src/VBox/Frontends/VBoxSDL/Framebuffer.h

    r76582 r81537  
    4242extern DECLSPEC void (SDLCALL *pTTF_Quit)(void);
    4343}
    44 #endif /* VBOX_SECURELABEL && !VBOX_WITH_SDL13 */
     44#endif /* VBOX_SECURELABEL && !VBOX_WITH_SDL2 */
    4545
    4646class VBoxSDLFBOverlay;
     
    118118    int32_t getXOffset() { return mCenterXOffset; }
    119119    int32_t getYOffset() { return mCenterYOffset; }
    120 #ifdef VBOX_WITH_SDL13
    121     bool hasWindow(SDL_WindowID id) { return mScreen && mWindow == id; }
     120#ifdef VBOX_WITH_SDL2
     121    SDL_Window *getWindow() { return mpWindow; }
     122    bool hasWindow(uint32_t id) { return mScreen && SDL_GetWindowID(mpWindow) == id; }
     123    int setWindowTitle(const char *pcszTitle);
    122124#endif
    123125#ifdef VBOX_SECURELABEL
     
    134136    /** current SDL framebuffer pointer (also includes screen width/height) */
    135137    SDL_Surface *mScreen;
    136 #ifdef VBOX_WITH_SDL13
     138#ifdef VBOX_WITH_SDL2
    137139    /** the SDL window */
    138     SDL_WindowID mWindow;
     140    SDL_Window *mpWindow;
    139141    /** the texture */
    140     SDL_TextureID mTexture;
     142    SDL_Texture *mpTexture;
     143    /** renderer */
     144    SDL_Renderer *mpRenderer;
    141145    /** render info */
    142146    SDL_RendererInfo mRenderInfo;
  • trunk/src/VBox/Frontends/VBoxSDL/Makefile.kmk

    r80569 r81537  
    5050VBoxSDL_SOURCES.darwin = \
    5151        VBoxSDLMain-darwin.m \
    52        Framebuffer-darwin.m
     52        Framebuffer-darwin.m
    5353
    5454VBoxSDL_DEFS       =
    55 ifdef VBOX_WITH_SDL13
    56  VBoxSDL_DEFS     += VBOX_WITH_SDL13
    57 else
     55ifdef VBOX_WITH_SDL2
     56 VBoxSDL_DEFS     += VBOX_WITH_SDL2
     57endif
     58if !defined(VBOX_WITH_SDL2)
    5859 ifdef VBOX_WITH_SECURELABEL
    5960  VBoxSDL_DEFS    += VBOX_SECURELABEL
     
    161162endif # !VBOX_WITH_HARDENING || "$(KBUILD_TARGET)" != "darwin"
    162163include $(FILE_KBUILD_SUB_FOOTER)
    163 
  • trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp

    r80824 r81537  
    4646#endif
    4747
     48#include "VBoxSDL.h"
     49
    4850#ifdef _MSC_VER
    4951# pragma warning(push)
     
    5759#endif
    5860
    59 #include "VBoxSDL.h"
    6061#include "Framebuffer.h"
    6162#include "Helper.h"
     
    173174static void    SetFullscreen(bool enable);
    174175
    175 #ifdef VBOX_WITH_SDL13
    176 static VBoxSDLFB * getFbFromWinId(SDL_WindowID id);
     176#ifdef VBOX_WITH_SDL2
     177static VBoxSDLFB *getFbFromWinId(Uint32 id);
    177178#endif
    178179
     
    226227#endif
    227228static SDL_Cursor *gpCustomCursor = NULL;
    228 #ifndef VBOX_WITH_SDL13
     229#ifndef VBOX_WITH_SDL2
    229230static WMcursor   *gpCustomOrigWMcursor = NULL;
    230231#endif
     
    233234static SDL_TimerID gSdlQuitTimer = NULL;
    234235
    235 #if defined(VBOXSDL_WITH_X11) && !defined(VBOX_WITH_SDL13)
     236#if defined(VBOXSDL_WITH_X11) && !defined(VBOX_WITH_SDL2)
    236237static SDL_SysWMinfo gSdlInfo;
    237238#endif
     
    537538                /* SDL feature not available on Quartz */
    538539#else
     540                bool fCanShow = false;
     541
     542# ifdef VBOX_WITH_SDL2
     543                Uint32 winId = 0;
     544
     545                VBoxSDLFB *fb = getFbFromWinId(winId);
     546
     547                SDL_SysWMinfo info;
     548                SDL_VERSION(&info.version);
     549                if (SDL_GetWindowWMInfo(fb->getWindow(), &info))
     550                    fCanShow = true;
     551# else
    539552                SDL_SysWMinfo info;
    540553                SDL_VERSION(&info.version);
    541554                if (!SDL_GetWMInfo(&info))
     555                    fCanShow = false;
     556                else
     557                    fCanShow = true;
     558# endif /* VBOX_WITH_SDL2 */
     559
     560                if (fCanShow)
     561                    pCSWEv->AddApproval(NULL);
     562                else
    542563                    pCSWEv->AddVeto(NULL);
    543                 else
    544                     pCSWEv->AddApproval(NULL);
    545564#endif
    546565                break;
     
    558577                SDL_SysWMinfo info;
    559578                SDL_VERSION(&info.version);
     579# ifdef VBOX_WITH_SDL2
     580                VBoxSDLFB *fb = getFbFromWinId(winId);
     581                if (SDL_GetWindowWMInfo(fb->getWindow(), &info))
     582# else
    560583                if (SDL_GetWMInfo(&info))
     584# endif /* VBOX_WITH_SDL2 */
    561585                {
    562586# if defined(VBOXSDL_WITH_X11)
    563587                    pSWEv->COMSETTER(WinId)((LONG64)info.info.x11.wmwindow);
    564588# elif defined(RT_OS_WINDOWS)
     589#  ifdef VBOX_WITH_SDL2
     590                    pSWEv->COMSETTER(WinId)((intptr_t)info.info.win.window);
     591#  else
    565592                    pSWEv->COMSETTER(WinId)((intptr_t)info.window);
    566 # else
     593#  endif /* VBOX_WITH_SDL2 */
     594# else /* !RT_OS_WINDOWS */
    567595                    AssertFailed();
    568596# endif
     
    793821                      || !strcmp(argv[1], "--detecthostkey")))
    794822    {
    795         int rc = SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_NOPARACHUTE);
     823        Uint32 fInitSubSystem = SDL_INIT_VIDEO | SDL_INIT_TIMER;
     824#ifndef VBOX_WITH_SDL2
     825        fInitSubSystem |= SDL_INIT_NOPARACHUTE;
     826#endif
     827        int rc = SDL_InitSubSystem(fInitSubSystem);
    796828        if (rc != 0)
    797829        {
     
    800832        }
    801833        /* we need a video window for the keyboard stuff to work */
     834#ifndef VBOX_WITH_SDL2 /** @todo Is this correct? */
    802835        if (!SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE))
    803836        {
     
    805838            return 1;
    806839        }
    807 
     840#endif
    808841        RTPrintf("Please hit one or two function key(s) to get the --hostkey value...\n");
    809842
     
    21742207    gpDefaultCursor = SDL_GetCursor();
    21752208
    2176 #if !defined(VBOX_WITH_SDL13)
     2209#if !defined(VBOX_WITH_SDL2)
    21772210# if defined(VBOXSDL_WITH_X11)
    21782211    /* Get Window Manager info. We only need the X11 display. */
     
    22042237        gpCustomCursor->wm_cursor = NULL;
    22052238    }
    2206 #endif /* !VBOX_WITH_SDL13 */
     2239#endif /* !VBOX_WITH_SDL2 */
    22072240
    22082241    /*
     
    24462479    UpdateTitlebar(TITLEBAR_NORMAL);
    24472480
     2481#ifdef VBOX_WITH_SDL2
     2482    /* Key repeats are enabled by default on SDL2. */
     2483#else
    24482484    /*
    24492485     * Enable keyboard repeats
    24502486     */
    24512487    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
     2488#endif
    24522489
    24532490    /*
     
    24832520             * The screen needs to be repainted.
    24842521             */
    2485 #ifdef VBOX_WITH_SDL13
     2522#ifdef VBOX_WITH_SDL2
    24862523            case SDL_WINDOWEVENT:
    24872524            {
     
    24992536                        break;
    25002537                    }
     2538                    case SDL_WINDOWEVENT_FOCUS_LOST:
     2539                    {
     2540                        break;
     2541                    }
     2542                    case SDL_WINDOWEVENT_RESIZED:
     2543                    {
     2544                        if (gpDisplay)
     2545                        {
     2546                            if (gfIgnoreNextResize)
     2547                            {
     2548                                gfIgnoreNextResize = FALSE;
     2549                                break;
     2550                            }
     2551                            uResizeWidth  = event.window.data1;
     2552#ifdef VBOX_SECURELABEL
     2553                            if (fSecureLabel)
     2554                                uResizeHeight = RT_MAX(0, event.window.data2 - SECURE_LABEL_HEIGHT);
     2555                            else
     2556#endif
     2557                                uResizeHeight = event.window.data2;
     2558                            if (gSdlResizeTimer)
     2559                                SDL_RemoveTimer(gSdlResizeTimer);
     2560                            gSdlResizeTimer = SDL_AddTimer(300, ResizeTimer, NULL);
     2561                        }
     2562                        break;
     2563                    }
    25012564                    default:
    25022565                        break;
     
    25172580            case SDL_KEYUP:
    25182581            {
     2582#ifdef VBOX_WITH_SDL2
     2583                SDL_Keycode ksym = event.key.keysym.sym;
     2584#else
    25192585                SDLKey ksym = event.key.keysym.sym;
    2520 
     2586#endif
    25212587                switch (enmHKeyState)
    25222588                {
     
    26602726                {
    26612727                    VBoxSDLFB *fb;
    2662 #ifdef VBOX_WITH_SDL13
     2728#ifdef VBOX_WITH_SDL2
    26632729                    fb = getFbFromWinId(event.motion.windowID);
    26642730#else
    26652731                    fb = gpFramebuffer[0];
    26662732#endif
     2733                    AssertPtrBreak(fb);
    26672734                    SendMouseEvent(fb, 0, 0, 0);
    26682735                }
     
    26882755                else if (gfGrabbed || UseAbsoluteMouse())
    26892756                {
     2757#ifdef VBOX_WITH_SDL2
     2758                    int dz = 0; /** @todo Implement mouse wheel support with SDL2 (event SDL_MOUSEWHEEL). */
     2759#else
    26902760                    int dz = bev->button == SDL_BUTTON_WHEELUP
    26912761                                         ? -1
     
    26932763                                                       ? +1
    26942764                                                       :  0;
    2695 
     2765#endif
    26962766                    /* end host key combination (CTRL+MouseButton) */
    26972767                    switch (enmHKeyState)
     
    27192789
    27202790                    VBoxSDLFB *fb;
    2721 #ifdef VBOX_WITH_SDL13
     2791#ifdef VBOX_WITH_SDL2
    27222792                    fb = getFbFromWinId(event.button.windowID);
    27232793#else
    27242794                    fb = gpFramebuffer[0];
    27252795#endif
     2796                    AssertPtrBreak(fb);
    27262797                    SendMouseEvent(fb, dz, event.type == SDL_MOUSEBUTTONDOWN, bev->button);
    27272798                }
     
    27292800            }
    27302801
     2802#ifndef VBOX_WITH_SDL2
    27312803            /*
    27322804             * The window has gained or lost focus.
    27332805             */
    2734             case SDL_ACTIVEEVENT:
     2806            case SDL_ACTIVEEVENT: /** @todo Needs to be also fixed with SDL2? Check! */
    27352807            {
    27362808                /*
     
    27512823
    27522824            /*
    2753              * The SDL window was resized
     2825             * The SDL window was resized.
     2826             * For SDL2 this is done in SDL_WINDOWEVENT.
    27542827             */
    27552828            case SDL_VIDEORESIZE:
     
    27752848                break;
    27762849            }
     2850#endif
    27772851
    27782852            /*
     
    30103084    }
    30113085
    3012 #ifndef VBOX_WITH_SDL13
     3086#ifndef VBOX_WITH_SDL2
    30133087    /* restore the default cursor and free the custom one if any */
    30143088    if (gpDefaultCursor)
     
    33283402
    33293403#ifdef VBOXSDL_WITH_X11
    3330 # ifdef VBOX_WITH_SDL13
     3404# ifdef VBOX_WITH_SDL2
    33313405
    33323406    switch (ev->keysym.sym)
     
    36623736static void ProcessKey(SDL_KeyboardEvent *ev)
    36633737{
    3664 #if (defined(DEBUG) || defined(VBOX_WITH_STATISTICS)) && !defined(VBOX_WITH_SDL13)
     3738#if (defined(DEBUG) || defined(VBOX_WITH_STATISTICS)) && !defined(VBOX_WITH_SDL2)
    36653739    if (gpMachineDebugger && ev->type == SDL_KEYDOWN)
    36663740    {
     
    39264000    if (!gfGuestNeedsHostCursor && gfRelativeMouseGuest)
    39274001        SDL_ShowCursor(SDL_DISABLE);
     4002#ifdef VBOX_WITH_SDL2
     4003    SDL_SetRelativeMouseMode(SDL_TRUE);
     4004#else
    39284005    SDL_WM_GrabInput(SDL_GRAB_ON);
    39294006    // dummy read to avoid moving the mouse
    3930     SDL_GetRelativeMouseState(
    3931 #ifdef VBOX_WITH_SDL13
    3932                               0,
    3933 #endif
    3934                               NULL, NULL);
     4007    SDL_GetRelativeMouseState(NULL, NULL);
     4008#endif
    39354009    gfGrabbed = TRUE;
    39364010    UpdateTitlebar(TITLEBAR_NORMAL);
     
    39424016static void InputGrabEnd(void)
    39434017{
     4018#ifdef VBOX_WITH_SDL2
     4019    SDL_SetRelativeMouseMode(SDL_FALSE);
     4020#else
    39444021    SDL_WM_GrabInput(SDL_GRAB_OFF);
     4022#endif
    39454023    if (!gfGuestNeedsHostCursor && gfRelativeMouseGuest)
    39464024        SDL_ShowCursor(SDL_ENABLE);
     
    39624040    bool abs;
    39634041
    3964 #ifdef VBOX_WITH_SDL13
     4042#ifdef VBOX_WITH_SDL2
    39654043    if (!fb)
    39664044    {
    3967         SDL_GetMouseState(0, &x, &y);
     4045        SDL_GetMouseState(&x, &y);
    39684046        RTPrintf("MouseEvent: Cannot find fb mouse = %d,%d\n", x, y);
    39694047        return;
     
    39974075    int  yMax = yMin + (int)fb->getGuestYRes();
    39984076
    3999     state = abs ? SDL_GetMouseState(
    4000 #ifdef VBOX_WITH_SDL13
    4001                                     0,
    4002 #endif
    4003                                     &x, &y)
    4004                 : SDL_GetRelativeMouseState(
    4005 #ifdef VBOX_WITH_SDL13
    4006                                             0,
    4007 #endif
    4008                                             &x, &y);
     4077    state = abs ? SDL_GetMouseState(&x, &y)
     4078                : SDL_GetRelativeMouseState(&x, &y);
    40094079
    40104080    /*
     
    44204490    setUITitle(szTitle);
    44214491#else
     4492# ifdef VBOX_WITH_SDL2
     4493    for (unsigned i = 0; i < gcMonitors; i++)
     4494        gpFramebuffer[i]->setWindowTitle(szTitle);
     4495# else
    44224496    SDL_WM_SetCaption(szTitle, VBOX_PRODUCT);
     4497# endif
    44234498#endif
    44244499}
     
    45094584        HBITMAP hBitmap;
    45104585        void *lpBits;
    4511         HCURSOR hAlphaCursor = NULL;
    45124586
    45134587        ::ZeroMemory(&bi, sizeof(BITMAPV5HEADER));
     
    46094683            }
    46104684
     4685#ifndef VBOX_WITH_SDL2 /** @BUGBUG Implement alpha cursor support handling. */
    46114686            ICONINFO ii;
    46124687            ii.fIcon = FALSE;
     
    46164691            ii.hbmColor = hBitmap;
    46174692
    4618             hAlphaCursor = ::CreateIconIndirect(&ii);
     4693            HCURSOR hAlphaCursor = ::CreateIconIndirect(&ii);
    46194694            Assert(hAlphaCursor);
    46204695            if (hAlphaCursor)
     
    46244699
    46254700                WMcursor *pCustomTempWMCursor = gpCustomCursor->wm_cursor;
    4626 
    46274701                // see SDL12/src/video/wincommon/SDL_sysmouse.c
    46284702                void *wm_cursor = malloc(sizeof(HCURSOR) + sizeof(uint8_t *) * 2);
     
    46414715                ok = true;
    46424716            }
     4717#endif
    46434718        }
    46444719
     
    46964771                }
    46974772
    4698 #ifndef VBOX_WITH_SDL13
     4773#ifndef VBOX_WITH_SDL2
    46994774                Cursor cur = XcursorImageLoadCursor(gSdlInfo.info.x11.display, img);
    47004775                Assert(cur);
     
    50745149        int rc = SDL_PushEvent(event);
    50755150        RTSemEventSignal(g_EventSemSDLEvents);
    5076 #ifdef VBOX_WITH_SDL13
     5151#ifdef VBOX_WITH_SDL2
    50775152        if (rc == 1)
    50785153#else
     
    50965171{
    50975172    int rc = SDL_PushEvent(event);
    5098 #ifdef VBOX_WITH_SDL13
     5173#ifdef VBOX_WITH_SDL2
    50995174    bool fSuccess = (rc == 1);
    51005175#else
     
    51675242}
    51685243
    5169 #ifdef VBOX_WITH_SDL13
    5170 static VBoxSDLFB * getFbFromWinId(SDL_WindowID id)
     5244#ifdef VBOX_WITH_SDL2
     5245static VBoxSDLFB *getFbFromWinId(Uint32 id)
    51715246{
    51725247    for (unsigned i = 0; i < gcMonitors; i++)
  • trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.h

    r76582 r81537  
    3434# pragma warning(push)
    3535# pragma warning(disable: 4121) /* warning C4121: 'SDL_SysWMmsg' : alignment of a member was sensitive to packing*/
     36# pragma warning(disable: 4668) /* warning C4668: '__GNUC__' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' */
    3637#endif
    3738#include <SDL.h>
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette