VirtualBox

Ignore:
Timestamp:
May 2, 2022 10:06:55 AM (3 years ago)
Author:
vboxsync
Message:

Additions: Solaris: make guest screen resize work in VMSVGA configuration, bugref:10220.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/x11/VBoxClient/display-svga-x11.cpp

    r94306 r94770  
    8484static bool g_fMonitorThreadShutdown = false;
    8585
     86#define X_VMwareCtrlSetRes  1
     87
     88typedef struct
     89{
     90   CARD8    reqType;
     91   CARD8    VMwareCtrlReqType;
     92   CARD16   length B16;
     93   CARD32   screen B32;
     94   CARD32   x B32;
     95   CARD32   y B32;
     96} xVMwareCtrlSetResReq;
     97#define sz_xVMwareCtrlSetResReq 16
     98
     99typedef struct
     100{
     101   BYTE     type;
     102   BYTE     pad1;
     103   CARD16   sequenceNumber B16;
     104   CARD32   length B32;
     105   CARD32   screen B32;
     106   CARD32   x B32;
     107   CARD32   y B32;
     108   CARD32   pad2 B32;
     109   CARD32   pad3 B32;
     110   CARD32   pad4 B32;
     111} xVMwareCtrlSetResReply;
     112#define sz_xVMwareCtrlSetResReply 32
    86113
    87114typedef struct {
     
    439466}
    440467
     468#ifdef RT_OS_SOLARIS
     469static bool VMwareCtrlSetRes(
     470    Display *dpy, int hExtensionMajorOpcode, int screen, int x, int y)
     471{
     472    xVMwareCtrlSetResReply rep;
     473    xVMwareCtrlSetResReq *pReq;
     474    bool fResult = false;
     475
     476    LockDisplay(dpy);
     477
     478    GetReq(VMwareCtrlSetRes, pReq);
     479    AssertPtrReturn(pReq, false);
     480
     481    pReq->reqType = hExtensionMajorOpcode;
     482    pReq->VMwareCtrlReqType = X_VMwareCtrlSetRes;
     483    pReq->screen = screen;
     484    pReq->x = x;
     485    pReq->y = y;
     486
     487    fResult = !!_XReply(dpy, (xReply *)&rep, (SIZEOF(xVMwareCtrlSetResReply) - SIZEOF(xReply)) >> 2, xFalse);
     488
     489    UnlockDisplay(dpy);
     490
     491    return fResult;
     492}
     493#endif /* RT_OS_SOLARIS */
     494
    441495/** Makes a call to vmwarectrl extension. This updates the
    442496 * connection information and possible resolutions (modes)
     
    482536    if (!sMonitorName)
    483537        return -1;
     538#ifdef RT_OS_SOLARIS
     539    if (!strcmp(sMonitorName, "default"))
     540        return 1;
     541#endif
    484542    int iLen = strlen(sMonitorName);
    485543    if (iLen <= 0)
     
    664722    int hHeight = 600;
    665723    int hWidth = 800;
     724    bool fResult = false;
     725    int idxDefaultScreen = DefaultScreen(x11Context.pDisplay);
     726
     727    AssertReturn(idxDefaultScreen >= 0, false);
     728    AssertReturn(idxDefaultScreen < x11Context.hOutputCount, false);
    666729
    667730    xXineramaScreenInfo *extents = (xXineramaScreenInfo *)malloc(x11Context.hOutputCount * sizeof(xXineramaScreenInfo));
     
    687750        hRunningOffset += hWidth;
    688751    }
    689     bool fResult = VMwareCtrlSetTopology(x11Context.pDisplay, x11Context.hVMWCtrlMajorOpCode,
    690                                          DefaultScreen(x11Context.pDisplay),
    691                                          extents, x11Context.hOutputCount);
     752#ifdef RT_OS_SOLARIS
     753    fResult = VMwareCtrlSetRes(x11Context.pDisplay, x11Context.hVMWCtrlMajorOpCode,
     754                               idxDefaultScreen, extents[idxDefaultScreen].width,
     755                               extents[idxDefaultScreen].height);
     756#else
     757    fResult = VMwareCtrlSetTopology(x11Context.pDisplay, x11Context.hVMWCtrlMajorOpCode,
     758                                    idxDefaultScreen, extents, x11Context.hOutputCount);
     759#endif
    692760    free(extents);
    693761    return fResult;
     
    11391207    XRRScreenSize newSize = currentSize();
    11401208
    1141     if (!event || newSize.width != (int)iXRes || newSize.height != (int)iYRes)
     1209    /* On Solaris guest, new screen size is not reported properly despite
     1210     * RRScreenChangeNotify event arrives. Hense, only check for event here.
     1211     * Linux guests do report new size correctly. */
     1212    if (   !event
     1213#ifndef RT_OS_SOLARIS
     1214        || newSize.width != (int)iXRes || newSize.height != (int)iYRes
     1215#endif
     1216       )
    11421217    {
    11431218        VBClLogError("Resizing frame buffer to %d %d has failed, current mode %d %d\n",
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