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