1// Copyright 2010-2012 The W32 Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// +build windows 6 7package w32 8 9import ( 10 "fmt" 11 "syscall" 12 "unsafe" 13) 14 15// DEFINED IN THE DWM API BUT NOT IMPLEMENTED BY MS: 16// DwmAttachMilContent 17// DwmDetachMilContent 18// DwmEnableComposition 19// DwmGetGraphicsStreamClient 20// DwmGetGraphicsStreamTransformHint 21 22var ( 23 moddwmapi = syscall.NewLazyDLL("dwmapi.dll") 24 25 procDwmDefWindowProc = moddwmapi.NewProc("DwmDefWindowProc") 26 procDwmEnableBlurBehindWindow = moddwmapi.NewProc("DwmEnableBlurBehindWindow") 27 procDwmEnableMMCSS = moddwmapi.NewProc("DwmEnableMMCSS") 28 procDwmExtendFrameIntoClientArea = moddwmapi.NewProc("DwmExtendFrameIntoClientArea") 29 procDwmFlush = moddwmapi.NewProc("DwmFlush") 30 procDwmGetColorizationColor = moddwmapi.NewProc("DwmGetColorizationColor") 31 procDwmGetCompositionTimingInfo = moddwmapi.NewProc("DwmGetCompositionTimingInfo") 32 procDwmGetTransportAttributes = moddwmapi.NewProc("DwmGetTransportAttributes") 33 procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute") 34 procDwmInvalidateIconicBitmaps = moddwmapi.NewProc("DwmInvalidateIconicBitmaps") 35 procDwmIsCompositionEnabled = moddwmapi.NewProc("DwmIsCompositionEnabled") 36 procDwmModifyPreviousDxFrameDuration = moddwmapi.NewProc("DwmModifyPreviousDxFrameDuration") 37 procDwmQueryThumbnailSourceSize = moddwmapi.NewProc("DwmQueryThumbnailSourceSize") 38 procDwmRegisterThumbnail = moddwmapi.NewProc("DwmRegisterThumbnail") 39 procDwmRenderGesture = moddwmapi.NewProc("DwmRenderGesture") 40 procDwmSetDxFrameDuration = moddwmapi.NewProc("DwmSetDxFrameDuration") 41 procDwmSetIconicLivePreviewBitmap = moddwmapi.NewProc("DwmSetIconicLivePreviewBitmap") 42 procDwmSetIconicThumbnail = moddwmapi.NewProc("DwmSetIconicThumbnail") 43 procDwmSetPresentParameters = moddwmapi.NewProc("DwmSetPresentParameters") 44 procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute") 45 procDwmShowContact = moddwmapi.NewProc("DwmShowContact") 46 procDwmTetherContact = moddwmapi.NewProc("DwmTetherContact") 47 procDwmTransitionOwnedWindow = moddwmapi.NewProc("DwmTransitionOwnedWindow") 48 procDwmUnregisterThumbnail = moddwmapi.NewProc("DwmUnregisterThumbnail") 49 procDwmUpdateThumbnailProperties = moddwmapi.NewProc("DwmUpdateThumbnailProperties") 50) 51 52func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) { 53 var result uint 54 ret, _, _ := procDwmDefWindowProc.Call( 55 uintptr(hWnd), 56 uintptr(msg), 57 wParam, 58 lParam, 59 uintptr(unsafe.Pointer(&result))) 60 return ret != 0, result 61} 62 63func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT { 64 ret, _, _ := procDwmEnableBlurBehindWindow.Call( 65 uintptr(hWnd), 66 uintptr(unsafe.Pointer(pBlurBehind))) 67 return HRESULT(ret) 68} 69 70func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT { 71 ret, _, _ := procDwmEnableMMCSS.Call( 72 uintptr(BoolToBOOL(fEnableMMCSS))) 73 return HRESULT(ret) 74} 75 76func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT { 77 ret, _, _ := procDwmExtendFrameIntoClientArea.Call( 78 uintptr(hWnd), 79 uintptr(unsafe.Pointer(pMarInset))) 80 return HRESULT(ret) 81} 82 83func DwmFlush() HRESULT { 84 ret, _, _ := procDwmFlush.Call() 85 return HRESULT(ret) 86} 87 88func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT { 89 ret, _, _ := procDwmGetColorizationColor.Call( 90 uintptr(unsafe.Pointer(pcrColorization)), 91 uintptr(unsafe.Pointer(pfOpaqueBlend))) 92 return HRESULT(ret) 93} 94 95func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT { 96 ret, _, _ := procDwmGetCompositionTimingInfo.Call( 97 uintptr(hWnd), 98 uintptr(unsafe.Pointer(pTimingInfo))) 99 return HRESULT(ret) 100} 101 102func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT { 103 ret, _, _ := procDwmGetTransportAttributes.Call( 104 uintptr(unsafe.Pointer(pfIsRemoting)), 105 uintptr(unsafe.Pointer(pfIsConnected)), 106 uintptr(unsafe.Pointer(pDwGeneration))) 107 return HRESULT(ret) 108} 109 110// TODO: verify handling of variable arguments 111func DwmGetWindowAttribute(hWnd HWND, dwAttribute uint32) (pAttribute interface{}, result HRESULT) { 112 var pvAttribute, pvAttrSize uintptr 113 switch dwAttribute { 114 case DWMWA_NCRENDERING_ENABLED: 115 v := new(BOOL) 116 pAttribute = v 117 pvAttribute = uintptr(unsafe.Pointer(v)) 118 pvAttrSize = unsafe.Sizeof(*v) 119 case DWMWA_CAPTION_BUTTON_BOUNDS, DWMWA_EXTENDED_FRAME_BOUNDS: 120 v := new(RECT) 121 pAttribute = v 122 pvAttribute = uintptr(unsafe.Pointer(v)) 123 pvAttrSize = unsafe.Sizeof(*v) 124 case DWMWA_CLOAKED: 125 panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not currently supported.", dwAttribute)) 126 default: 127 panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not valid.", dwAttribute)) 128 } 129 130 ret, _, _ := procDwmGetWindowAttribute.Call( 131 uintptr(hWnd), 132 uintptr(dwAttribute), 133 pvAttribute, 134 pvAttrSize) 135 result = HRESULT(ret) 136 return 137} 138 139func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT { 140 ret, _, _ := procDwmInvalidateIconicBitmaps.Call( 141 uintptr(hWnd)) 142 return HRESULT(ret) 143} 144 145func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT { 146 ret, _, _ := procDwmIsCompositionEnabled.Call( 147 uintptr(unsafe.Pointer(pfEnabled))) 148 return HRESULT(ret) 149} 150 151func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT { 152 ret, _, _ := procDwmModifyPreviousDxFrameDuration.Call( 153 uintptr(hWnd), 154 uintptr(cRefreshes), 155 uintptr(BoolToBOOL(fRelative))) 156 return HRESULT(ret) 157} 158 159func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT { 160 ret, _, _ := procDwmQueryThumbnailSourceSize.Call( 161 uintptr(hThumbnail), 162 uintptr(unsafe.Pointer(pSize))) 163 return HRESULT(ret) 164} 165 166func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT { 167 ret, _, _ := procDwmRegisterThumbnail.Call( 168 uintptr(hWndDestination), 169 uintptr(hWndSource), 170 uintptr(unsafe.Pointer(phThumbnailId))) 171 return HRESULT(ret) 172} 173 174func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) { 175 procDwmRenderGesture.Call( 176 uintptr(gt), 177 uintptr(cContacts), 178 uintptr(unsafe.Pointer(pdwPointerID)), 179 uintptr(unsafe.Pointer(pPoints))) 180 return 181} 182 183func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT { 184 ret, _, _ := procDwmSetDxFrameDuration.Call( 185 uintptr(hWnd), 186 uintptr(cRefreshes)) 187 return HRESULT(ret) 188} 189 190func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT { 191 ret, _, _ := procDwmSetIconicLivePreviewBitmap.Call( 192 uintptr(hWnd), 193 uintptr(hbmp), 194 uintptr(unsafe.Pointer(pptClient)), 195 uintptr(dwSITFlags)) 196 return HRESULT(ret) 197} 198 199func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT { 200 ret, _, _ := procDwmSetIconicThumbnail.Call( 201 uintptr(hWnd), 202 uintptr(hbmp), 203 uintptr(dwSITFlags)) 204 return HRESULT(ret) 205} 206 207func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT { 208 ret, _, _ := procDwmSetPresentParameters.Call( 209 uintptr(hWnd), 210 uintptr(unsafe.Pointer(pPresentParams))) 211 return HRESULT(ret) 212} 213 214func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT { 215 ret, _, _ := procDwmSetWindowAttribute.Call( 216 uintptr(hWnd), 217 uintptr(dwAttribute), 218 uintptr(pvAttribute), 219 uintptr(cbAttribute)) 220 return HRESULT(ret) 221} 222 223func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) { 224 procDwmShowContact.Call( 225 uintptr(dwPointerID), 226 uintptr(eShowContact)) 227 return 228} 229 230func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) { 231 procDwmTetherContact.Call( 232 uintptr(dwPointerID), 233 uintptr(BoolToBOOL(fEnable)), 234 uintptr(unsafe.Pointer(&ptTether))) 235 return 236} 237 238func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) { 239 procDwmTransitionOwnedWindow.Call( 240 uintptr(hWnd), 241 uintptr(target)) 242 return 243} 244 245func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT { 246 ret, _, _ := procDwmUnregisterThumbnail.Call( 247 uintptr(hThumbnailId)) 248 return HRESULT(ret) 249} 250 251func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT { 252 ret, _, _ := procDwmUpdateThumbnailProperties.Call( 253 uintptr(hThumbnailId), 254 uintptr(unsafe.Pointer(ptnProperties))) 255 return HRESULT(ret) 256} 257