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