VirtualBox

Changeset 105749 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Aug 21, 2024 9:31:01 AM (9 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164461
Message:

GA/Windows: Use two separate bitmasks for displays to enable and disable. bugref:10714

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceDisplayConfig.cpp

    r105677 r105749  
    121121    D3DKMT_ENUMADAPTERS EnumAdapters = {0};
    122122    NTSTATUS rcNt;
    123     uint32_t u32Mask = 0;
     123    uint32_t u32ConnectMask = 0, u32DisconnectMask = 0;
    124124
    125125    for(uint32_t i = 0; i < cDisplays; i++)
    126126    {
    127         u32Mask |= (paDisplays[i].fDisplayFlags & VMMDEV_DISPLAY_DISABLED) ? 0 : RT_BIT(i);
    128     }
    129 
    130     VGSvcVerbose(3, "ReconnectDisplays u32Mask 0x%x\n", u32Mask);
     127        uint32_t u32Mask = RT_BIT(paDisplays[i].idDisplay);
     128
     129        if (paDisplays[i].fDisplayFlags & VMMDEV_DISPLAY_DISABLED)
     130            u32DisconnectMask |= u32Mask;
     131        else
     132            u32ConnectMask |= u32Mask;
     133    }
     134
     135    VGSvcVerbose(3, "ReconnectDisplays u32ConnectMask 0x%RX32, u32DisconnectMask 0x%RX32\n", u32ConnectMask, u32DisconnectMask);
    131136
    132137    EnumAdapters.NumAdapters = RT_ELEMENTS(EnumAdapters.Adapters);
     
    152157    if (hAdapter)
    153158    {
    154         VBOXDISPIFESCAPE EscapeHdr = {0};
    155         EscapeHdr.escapeCode = VBOXESC_RECONNECT_TARGETS;
    156         EscapeHdr.u32CmdSpecific = u32Mask;
     159        VBOXDISPIFESCAPE_RECONNECT_TARGETS VBoxEscapeReconnectTargets = {{0}};
     160
     161        VBoxEscapeReconnectTargets.EscapeHdr.escapeCode = VBOXESC_RECONNECT_TARGETS;
     162        VBoxEscapeReconnectTargets.EscapeHdr.u32CmdSpecific = 0;
     163        VBoxEscapeReconnectTargets.u32ConnectMask = u32ConnectMask;
     164        VBoxEscapeReconnectTargets.u32DisconnectMask = u32DisconnectMask;
    157165
    158166        D3DKMT_ESCAPE EscapeData = {0};
     
    160168        EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
    161169        EscapeData.Flags.HardwareAccess = 1;
    162         EscapeData.pPrivateDriverData = &EscapeHdr;
    163         EscapeData.PrivateDriverDataSize = sizeof (EscapeHdr);
     170        EscapeData.pPrivateDriverData = &VBoxEscapeReconnectTargets;
     171        EscapeData.PrivateDriverDataSize = sizeof (VBoxEscapeReconnectTargets);
    164172
    165173        rcNt = g_pfnD3DKMTEscape(&EscapeData);
     
    272280                    for(uint32_t i = 0; i < cDisplays; i++)
    273281                    {
    274                         VGSvcVerbose(2, "Display[%i] flags=%#x (%dx%d)\n", i,
     282                        VGSvcVerbose(2, "%u) Display[%u] flags=%#x (%dx%d)\n", i, aDisplays[i].idDisplay,
    275283                            aDisplays[i].fDisplayFlags,
    276284                            aDisplays[i].cx, aDisplays[i].cy);
Note: See TracChangeset for help on using the changeset viewer.

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