| // Copyright 2010-2012 The W32 Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package w32 |
| |
| import ( |
| "fmt" |
| "syscall" |
| "unsafe" |
| ) |
| |
| // DEFINED IN THE DWM API BUT NOT IMPLEMENTED BY MS: |
| // DwmAttachMilContent |
| // DwmDetachMilContent |
| // DwmEnableComposition |
| // DwmGetGraphicsStreamClient |
| // DwmGetGraphicsStreamTransformHint |
| |
| var ( |
| moddwmapi = syscall.NewLazyDLL("dwmapi.dll") |
| |
| procDwmDefWindowProc = moddwmapi.NewProc("DwmDefWindowProc") |
| procDwmEnableBlurBehindWindow = moddwmapi.NewProc("DwmEnableBlurBehindWindow") |
| procDwmEnableMMCSS = moddwmapi.NewProc("DwmEnableMMCSS") |
| procDwmExtendFrameIntoClientArea = moddwmapi.NewProc("DwmExtendFrameIntoClientArea") |
| procDwmFlush = moddwmapi.NewProc("DwmFlush") |
| procDwmGetColorizationColor = moddwmapi.NewProc("DwmGetColorizationColor") |
| procDwmGetCompositionTimingInfo = moddwmapi.NewProc("DwmGetCompositionTimingInfo") |
| procDwmGetTransportAttributes = moddwmapi.NewProc("DwmGetTransportAttributes") |
| procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute") |
| procDwmInvalidateIconicBitmaps = moddwmapi.NewProc("DwmInvalidateIconicBitmaps") |
| procDwmIsCompositionEnabled = moddwmapi.NewProc("DwmIsCompositionEnabled") |
| procDwmModifyPreviousDxFrameDuration = moddwmapi.NewProc("DwmModifyPreviousDxFrameDuration") |
| procDwmQueryThumbnailSourceSize = moddwmapi.NewProc("DwmQueryThumbnailSourceSize") |
| procDwmRegisterThumbnail = moddwmapi.NewProc("DwmRegisterThumbnail") |
| procDwmRenderGesture = moddwmapi.NewProc("DwmRenderGesture") |
| procDwmSetDxFrameDuration = moddwmapi.NewProc("DwmSetDxFrameDuration") |
| procDwmSetIconicLivePreviewBitmap = moddwmapi.NewProc("DwmSetIconicLivePreviewBitmap") |
| procDwmSetIconicThumbnail = moddwmapi.NewProc("DwmSetIconicThumbnail") |
| procDwmSetPresentParameters = moddwmapi.NewProc("DwmSetPresentParameters") |
| procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute") |
| procDwmShowContact = moddwmapi.NewProc("DwmShowContact") |
| procDwmTetherContact = moddwmapi.NewProc("DwmTetherContact") |
| procDwmTransitionOwnedWindow = moddwmapi.NewProc("DwmTransitionOwnedWindow") |
| procDwmUnregisterThumbnail = moddwmapi.NewProc("DwmUnregisterThumbnail") |
| procDwmUpdateThumbnailProperties = moddwmapi.NewProc("DwmUpdateThumbnailProperties") |
| ) |
| |
| func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) { |
| var result uint |
| ret, _, _ := procDwmDefWindowProc.Call( |
| uintptr(hWnd), |
| uintptr(msg), |
| wParam, |
| lParam, |
| uintptr(unsafe.Pointer(&result))) |
| return ret != 0, result |
| } |
| |
| func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT { |
| ret, _, _ := procDwmEnableBlurBehindWindow.Call( |
| uintptr(hWnd), |
| uintptr(unsafe.Pointer(pBlurBehind))) |
| return HRESULT(ret) |
| } |
| |
| func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT { |
| ret, _, _ := procDwmEnableMMCSS.Call( |
| uintptr(BoolToBOOL(fEnableMMCSS))) |
| return HRESULT(ret) |
| } |
| |
| func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT { |
| ret, _, _ := procDwmExtendFrameIntoClientArea.Call( |
| uintptr(hWnd), |
| uintptr(unsafe.Pointer(pMarInset))) |
| return HRESULT(ret) |
| } |
| |
| func DwmFlush() HRESULT { |
| ret, _, _ := procDwmFlush.Call() |
| return HRESULT(ret) |
| } |
| |
| func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT { |
| ret, _, _ := procDwmGetColorizationColor.Call( |
| uintptr(unsafe.Pointer(pcrColorization)), |
| uintptr(unsafe.Pointer(pfOpaqueBlend))) |
| return HRESULT(ret) |
| } |
| |
| func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT { |
| ret, _, _ := procDwmGetCompositionTimingInfo.Call( |
| uintptr(hWnd), |
| uintptr(unsafe.Pointer(pTimingInfo))) |
| return HRESULT(ret) |
| } |
| |
| func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT { |
| ret, _, _ := procDwmGetTransportAttributes.Call( |
| uintptr(unsafe.Pointer(pfIsRemoting)), |
| uintptr(unsafe.Pointer(pfIsConnected)), |
| uintptr(unsafe.Pointer(pDwGeneration))) |
| return HRESULT(ret) |
| } |
| |
| // TODO: verify handling of variable arguments |
| func DwmGetWindowAttribute(hWnd HWND, dwAttribute uint32) (pAttribute interface{}, result HRESULT) { |
| var pvAttribute, pvAttrSize uintptr |
| switch dwAttribute { |
| case DWMWA_NCRENDERING_ENABLED: |
| v := new(BOOL) |
| pAttribute = v |
| pvAttribute = uintptr(unsafe.Pointer(v)) |
| pvAttrSize = unsafe.Sizeof(*v) |
| case DWMWA_CAPTION_BUTTON_BOUNDS, DWMWA_EXTENDED_FRAME_BOUNDS: |
| v := new(RECT) |
| pAttribute = v |
| pvAttribute = uintptr(unsafe.Pointer(v)) |
| pvAttrSize = unsafe.Sizeof(*v) |
| case DWMWA_CLOAKED: |
| panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not currently supported.", dwAttribute)) |
| default: |
| panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not valid.", dwAttribute)) |
| } |
| |
| ret, _, _ := procDwmGetWindowAttribute.Call( |
| uintptr(hWnd), |
| uintptr(dwAttribute), |
| pvAttribute, |
| pvAttrSize) |
| result = HRESULT(ret) |
| return |
| } |
| |
| func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT { |
| ret, _, _ := procDwmInvalidateIconicBitmaps.Call( |
| uintptr(hWnd)) |
| return HRESULT(ret) |
| } |
| |
| func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT { |
| ret, _, _ := procDwmIsCompositionEnabled.Call( |
| uintptr(unsafe.Pointer(pfEnabled))) |
| return HRESULT(ret) |
| } |
| |
| func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT { |
| ret, _, _ := procDwmModifyPreviousDxFrameDuration.Call( |
| uintptr(hWnd), |
| uintptr(cRefreshes), |
| uintptr(BoolToBOOL(fRelative))) |
| return HRESULT(ret) |
| } |
| |
| func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT { |
| ret, _, _ := procDwmQueryThumbnailSourceSize.Call( |
| uintptr(hThumbnail), |
| uintptr(unsafe.Pointer(pSize))) |
| return HRESULT(ret) |
| } |
| |
| func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT { |
| ret, _, _ := procDwmRegisterThumbnail.Call( |
| uintptr(hWndDestination), |
| uintptr(hWndSource), |
| uintptr(unsafe.Pointer(phThumbnailId))) |
| return HRESULT(ret) |
| } |
| |
| func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) { |
| procDwmRenderGesture.Call( |
| uintptr(gt), |
| uintptr(cContacts), |
| uintptr(unsafe.Pointer(pdwPointerID)), |
| uintptr(unsafe.Pointer(pPoints))) |
| return |
| } |
| |
| func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT { |
| ret, _, _ := procDwmSetDxFrameDuration.Call( |
| uintptr(hWnd), |
| uintptr(cRefreshes)) |
| return HRESULT(ret) |
| } |
| |
| func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT { |
| ret, _, _ := procDwmSetIconicLivePreviewBitmap.Call( |
| uintptr(hWnd), |
| uintptr(hbmp), |
| uintptr(unsafe.Pointer(pptClient)), |
| uintptr(dwSITFlags)) |
| return HRESULT(ret) |
| } |
| |
| func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT { |
| ret, _, _ := procDwmSetIconicThumbnail.Call( |
| uintptr(hWnd), |
| uintptr(hbmp), |
| uintptr(dwSITFlags)) |
| return HRESULT(ret) |
| } |
| |
| func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT { |
| ret, _, _ := procDwmSetPresentParameters.Call( |
| uintptr(hWnd), |
| uintptr(unsafe.Pointer(pPresentParams))) |
| return HRESULT(ret) |
| } |
| |
| func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT { |
| ret, _, _ := procDwmSetWindowAttribute.Call( |
| uintptr(hWnd), |
| uintptr(dwAttribute), |
| uintptr(pvAttribute), |
| uintptr(cbAttribute)) |
| return HRESULT(ret) |
| } |
| |
| func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) { |
| procDwmShowContact.Call( |
| uintptr(dwPointerID), |
| uintptr(eShowContact)) |
| return |
| } |
| |
| func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) { |
| procDwmTetherContact.Call( |
| uintptr(dwPointerID), |
| uintptr(BoolToBOOL(fEnable)), |
| uintptr(unsafe.Pointer(&ptTether))) |
| return |
| } |
| |
| func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) { |
| procDwmTransitionOwnedWindow.Call( |
| uintptr(hWnd), |
| uintptr(target)) |
| return |
| } |
| |
| func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT { |
| ret, _, _ := procDwmUnregisterThumbnail.Call( |
| uintptr(hThumbnailId)) |
| return HRESULT(ret) |
| } |
| |
| func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT { |
| ret, _, _ := procDwmUpdateThumbnailProperties.Call( |
| uintptr(hThumbnailId), |
| uintptr(unsafe.Pointer(ptnProperties))) |
| return HRESULT(ret) |
| } |