VirtualBox

儲存庫 vbox 的更動 34911


忽略:
時間撮記:
2010-12-9 下午05:14:56 (14 年 以前)
作者:
vboxsync
訊息:

Additions/x11/vboxvideo: fix an off-by-one and let the driver receive mode hints as output properties

位置:
trunk/src/VBox/Additions/x11/vboxvideo
檔案:
修改 3 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Additions/x11/vboxvideo/undefined_13

    r34747 r34911  
    1212GlxSetVisualConfigs
    1313LoaderRefSymLists
     14MakeAtom
    1415PixmapWidthPaddingInfo
     16RRConfigureOutputProperty
    1517ShadowFBInit2
    1618VBEExtendedInit
     
    120122strcmp
    121123strcpy
     124strncpy
    122125strlen
    123126strncmp
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c

    r34872 r34911  
    8181# include "xf86Crtc.h"
    8282# include "xf86Modes.h"
     83# include <X11/Xatom.h>
    8384#endif
    8485
     
    427428vbox_output_get_modes (xf86OutputPtr output)
    428429{
    429     bool rc;
    430430    unsigned i;
    431431    DisplayModePtr pModes = NULL;
     
    436436    if (vbox_device_available(pVBox))
    437437    {
     438        Bool rc = FALSE;
    438439        uint32_t x, y, bpp, iScreen;
    439         rc = vboxGetDisplayChangeRequest(pScrn, &x, &y, &bpp, &iScreen);
    440         /* @todo - check the display number once we support multiple displays. */
     440        iScreen = (uintptr_t)output->driver_private;
     441        if (   pVBox->aPreferredSize[iScreen].cx
     442            && pVBox->aPreferredSize[iScreen].cy)
     443        {
     444            x = pVBox->aPreferredSize[iScreen].cx;
     445            y = pVBox->aPreferredSize[iScreen].cy;
     446            rc = TRUE;
     447        }
     448        else
     449            rc = vboxGetDisplayChangeRequest(pScrn, &x, &y, &bpp, &iScreen);
    441450        /* If we don't find a display request, see if we have a saved hint
    442451         * from a previous session. */
     
    460469
    461470#ifdef RANDR_12_INTERFACE
    462 /* We don't yet have mutable properties, whatever they are. */
     471static Atom
     472vboxAtomVBoxMode(void)
     473{
     474    static Atom rc = 0;
     475    if (!rc)
     476        rc = MakeAtom("VBOX_MODE", sizeof("VBOX_MODE") - 1, TRUE);
     477    return rc;
     478}
     479
     480/** We use this for receiving information from clients for the purpose of
     481 * dynamic resizing, and later possibly other things too.
     482 */
    463483static Bool
    464484vbox_output_set_property(xf86OutputPtr output, Atom property,
    465485                         RRPropertyValuePtr value)
    466 { (void) output; (void) property; (void) value; return FALSE; }
     486{
     487    ScrnInfoPtr pScrn = output->scrn;
     488    VBOXPtr pVBox = VBOXGetRec(pScrn);
     489    TRACE_LOG("property=%d, value->type=%d, value->format=%d, value->size=%ld\n",
     490              (int)property, (int)value->type, value->format, value->size);
     491    if (property == vboxAtomVBoxMode())
     492    {
     493        uint32_t cDisplay = (uintptr_t)output->driver_private;
     494        char sz[256] = { 0 };
     495        int w, h;
     496
     497        if (   value->type != XA_STRING
     498            || (unsigned) value->size > (sizeof(sz) - 1))
     499            return FALSE;
     500        strncpy(sz, value->data, value->size);
     501        if (sscanf(sz, "%dx%d", &w, &h) != 2)
     502            return FALSE;
     503        pVBox->aPreferredSize[cDisplay].cx = w;
     504        pVBox->aPreferredSize[cDisplay].cy = h;
     505        return TRUE;
     506    }
     507    return FALSE;
     508}
    467509#endif
    468510
     
    10341076            pVBox->paOutputs[i]->possible_crtcs = 1 << i;
    10351077            pVBox->paOutputs[i]->possible_clones = 0;
     1078            pVBox->paOutputs[i]->driver_private = (void *)(uintptr_t)i;
    10361079            TRACE_LOG("Created crtc (%p) and output %s (%p)\n",
    10371080                      (void *)pVBox->paCrtcs[i], szOutput,
     
    10541097    if (!xf86CrtcScreenInit(pScreen)) {
    10551098        return FALSE;
     1099    }
     1100
     1101    /* Create our VBOX_MODE display properties. */
     1102    {
     1103        uint32_t i;
     1104
     1105        for (i = 0; i < pVBox->cScreens; ++i)
     1106        {
     1107            char csz[] = "0x0";
     1108            RRChangeOutputProperty(pVBox->paOutputs[i]->randr_output,
     1109                                   vboxAtomVBoxMode(), XA_STRING, 8,
     1110                                   PropModeReplace, sizeof(csz), csz, TRUE,
     1111                                   FALSE);
     1112           
     1113        }
    10561114    }
    10571115
     
    12341292    unsigned i;
    12351293    for (i = 0; i < pVBox->cScreens; ++i)
    1236         if (     pVBox->aScreenLocation[i].x + pVBox->aScreenLocation[i].cx
    1237                < pScrn->virtualX
    1238             &&   pVBox->aScreenLocation[i].y + pVBox->aScreenLocation[i].cy
    1239                < pScrn->virtualY)
     1294        if (      pVBox->aScreenLocation[i].x + pVBox->aScreenLocation[i].cx
     1295               <= pScrn->virtualX
     1296            &&    pVBox->aScreenLocation[i].y + pVBox->aScreenLocation[i].cy
     1297               <= pScrn->virtualY)
    12401298            return i;
    12411299    return 0;  /* This will probably look bad if it can happen. */
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.h

    r34763 r34911  
    223223    /** Context information about the VBVA buffers for each screen */
    224224    struct VBVABUFFERCONTEXT aVbvaCtx[VBOX_VIDEO_MAX_SCREENS];
     225    /** The current preferred resolution for the screen */
     226    RTRECTSIZE aPreferredSize[VBOX_VIDEO_MAX_SCREENS];
    225227    /** HGSMI guest heap context */
    226228    HGSMIGUESTCOMMANDCONTEXT guestCtx;
    227     Bool fAnyX;   /* Unrestricted horizontal resolution flag. */
     229    /** Unrestricted horizontal resolution flag. */
     230    Bool fAnyX;
    228231#ifdef VBOX_DRI
    229232    Bool useDRI;
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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