Vitaliy Margolen : dxdiagn: Add reporting of some display related information.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 13 08:30:19 CDT 2007


Module: wine
Branch: master
Commit: 116b807b9c375dba3f2a551efda492571b3d29f1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=116b807b9c375dba3f2a551efda492571b3d29f1

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Thu Jul 12 07:18:01 2007 -0600

dxdiagn: Add reporting of some display related information.

---

 dlls/dxdiagn/Makefile.in |    2 +-
 dlls/dxdiagn/provider.c  |  114 ++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 100 insertions(+), 16 deletions(-)

diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in
index e2cf511..132d828 100644
--- a/dlls/dxdiagn/Makefile.in
+++ b/dlls/dxdiagn/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = dxdiagn.dll
-IMPORTS   = version ole32 oleaut32 user32 advapi32 kernel32
+IMPORTS   = ddraw version ole32 oleaut32 user32 advapi32 kernel32
 EXTRALIBS = -lstrmiids -ldxguid -luuid
 
 C_SRCS = \
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 260c3a7..fe0543c 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -31,6 +31,7 @@
 #include "strmif.h"
 #include "vfw.h"
 #include "mmddk.h"
+#include <ddraw.h>
 
 WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
 
@@ -138,6 +139,32 @@ HRESULT DXDiag_CreateDXDiagProvider(LPCLASSFACTORY iface, LPUNKNOWN punkOuter, R
   return IDxDiagProviderImpl_QueryInterface ((PDXDIAGPROVIDER)provider, riid, ppobj);
 } 
 
+static inline HRESULT add_prop_str( IDxDiagContainer* cont, LPCWSTR prop, LPCWSTR str )
+{
+    HRESULT hr;
+    VARIANT var;
+
+    V_VT( &var ) = VT_BSTR;
+    V_BSTR( &var ) = SysAllocString( str );
+    hr = IDxDiagContainerImpl_AddProp( cont, prop, &var );
+    VariantClear( &var );
+
+    return hr;
+}
+
+static inline HRESULT add_prop_ui4( IDxDiagContainer* cont, LPCWSTR prop, DWORD data )
+{
+    HRESULT hr;
+    VARIANT var;
+
+    V_VT( &var ) = VT_UI4;
+    V_UI4( &var ) = data;
+    hr = IDxDiagContainerImpl_AddProp( cont, prop, &var );
+    VariantClear( &var );
+
+    return hr;
+}
+
 /**
  * @param szFilePath: usually GetSystemDirectoryW
  * @param szFileName: name of the dll without path
@@ -389,21 +416,78 @@ static HRESULT DXDiag_InitDXDiagDirectXFilesContainer(IDxDiagContainer* pSubCont
   return hr;
 }
 
-static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont) {
-  HRESULT hr = S_OK;
-  /*
-  static const WCHAR szDescription[] = {'s','z','D','e','s','c','r','i','p','t','i','o','n',0};
-  static const WCHAR szDeviceName[] = {'s','z','D','e','v','i','c','e','N','a','m','e',0};
-  static const WCHAR szKeyDeviceID[] = {'s','z','K','e','y','D','e','v','i','c','e','I','D',0};
-  static const WCHAR szKeyDeviceKey[] = {'s','z','K','e','y','D','e','v','i','c','e','K','e','y',0};
-  WCHAR szAdapterName[512];
-  VARIANT v;
-  IDxDiagContainer* pDisplayAdapterSubCont = NULL;
-  hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pDisplayAdapterSubCont);
-  if (FAILED(hr)) { return hr; }
-  hr = IDxDiagContainerImpl_AddChildContainer(pSubCont, szAdapterName, pDisplayAdapterSubCont);  
-  */
-  return hr;
+static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont)
+{
+    static const WCHAR szDescription[] = {'s','z','D','e','s','c','r','i','p','t','i','o','n',0};
+    static const WCHAR szDeviceName[] = {'s','z','D','e','v','i','c','e','N','a','m','e',0};
+    static const WCHAR szKeyDeviceID[] = {'s','z','K','e','y','D','e','v','i','c','e','I','D',0};
+    static const WCHAR szKeyDeviceKey[] = {'s','z','K','e','y','D','e','v','i','c','e','K','e','y',0};
+    static const WCHAR szVendorId[] = {'s','z','V','e','n','d','o','r','I','d',0};
+    static const WCHAR szDeviceId[] = {'s','z','D','e','v','i','c','e','I','d',0};
+    static const WCHAR dwWidth[] = {'d','w','W','i','d','t','h',0};
+    static const WCHAR dwHeight[] = {'d','w','H','e','i','g','h','t',0};
+    static const WCHAR dwBpp[] = {'d','w','B','p','p',0};
+    static const WCHAR szDisplayMemoryLocalized[] = {'s','z','D','i','s','p','l','a','y','M','e','m','o','r','y','L','o','c','a','l','i','z','e','d',0};
+    static const WCHAR szDisplayMemoryEnglish[] = {'s','z','D','i','s','p','l','a','y','M','e','m','o','r','y','E','n','g','l','i','s','h',0};
+
+    static const WCHAR szAdapterID[] = {'0',0};
+    static const WCHAR szEmpty[] = {0};
+
+    HRESULT                 hr;
+    IDxDiagContainer       *pDisplayAdapterSubCont = NULL;
+
+    IDirectDraw7           *pDirectDraw;
+    DDSCAPS2                dd_caps;
+    DISPLAY_DEVICEW         disp_dev;
+    DDSURFACEDESC2          surface_descr;
+    DWORD                   tmp;
+    WCHAR                   buffer[256];
+
+    hr = DXDiag_CreateDXDiagContainer( &IID_IDxDiagContainer, (void**) &pDisplayAdapterSubCont );
+    if (FAILED( hr )) return hr;
+    hr = IDxDiagContainerImpl_AddChildContainer( pSubCont, szAdapterID, pDisplayAdapterSubCont );
+    if (FAILED( hr )) return hr;
+
+    if (EnumDisplayDevicesW( NULL, 0, &disp_dev, 0 ))
+    {
+        add_prop_str( pDisplayAdapterSubCont, szDeviceName, disp_dev.DeviceName );
+        add_prop_str( pDisplayAdapterSubCont, szDescription, disp_dev.DeviceString );
+    }
+
+    hr = DirectDrawCreateEx( NULL, (LPVOID *)&pDirectDraw, &IID_IDirectDraw7, NULL);
+    if (FAILED( hr )) return hr;
+
+    dd_caps.dwCaps = DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY;
+    dd_caps.dwCaps2 = dd_caps.dwCaps3 = dd_caps.dwCaps4 = 0;
+    hr = IDirectDraw7_GetAvailableVidMem( pDirectDraw, &dd_caps, &tmp, NULL );
+    if (SUCCEEDED(hr))
+    {
+        static const WCHAR mem_fmt[] = {'%','.','1','f',' ','M','B',0};
+
+        snprintfW( buffer, sizeof(buffer), mem_fmt, ((float)tmp) / 1000000.0 );
+        add_prop_str( pDisplayAdapterSubCont, szDisplayMemoryLocalized, buffer );
+        add_prop_str( pDisplayAdapterSubCont, szDisplayMemoryEnglish, buffer );
+    }
+
+    surface_descr.dwSize = sizeof(surface_descr);
+    hr = IDirectDraw7_GetDisplayMode( pDirectDraw, &surface_descr );
+    if (SUCCEEDED(hr))
+    {
+        if (surface_descr.dwFlags & DDSD_WIDTH)
+            add_prop_ui4( pDisplayAdapterSubCont, dwWidth, surface_descr.dwWidth );
+        if (surface_descr.dwFlags & DDSD_HEIGHT)
+            add_prop_ui4( pDisplayAdapterSubCont, dwHeight, surface_descr.dwHeight );
+        if (surface_descr.dwFlags & DDSD_PIXELFORMAT)
+            add_prop_ui4( pDisplayAdapterSubCont, dwBpp, surface_descr.ddpfPixelFormat.dwRGBBitCount );
+    }
+
+    add_prop_str( pDisplayAdapterSubCont, szVendorId, szEmpty );
+    add_prop_str( pDisplayAdapterSubCont, szDeviceId, szEmpty );
+    add_prop_str( pDisplayAdapterSubCont, szKeyDeviceKey, szEmpty );
+    add_prop_str( pDisplayAdapterSubCont, szKeyDeviceID, szEmpty );
+
+    IUnknown_Release( pDirectDraw );
+    return hr;
 }
 
 static HRESULT DXDiag_InitDXDiagDirectSoundContainer(IDxDiagContainer* pSubCont) {




More information about the wine-cvs mailing list