winemac.drv: Implement GetMonitorInfo.
[wine] / dlls / explorerframe / taskbarlist.c
1 /*
2  * Copyright 2009 Henri Verbeet for CodeWeavers
3  * Copyright 2011 AndrĂ© Hentschel
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  *
19  */
20
21 #include "explorerframe_main.h"
22
23 #include "wine/debug.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
26
27 struct taskbar_list
28 {
29     ITaskbarList4 ITaskbarList4_iface;
30     LONG refcount;
31 };
32
33 static inline struct taskbar_list *impl_from_ITaskbarList4(ITaskbarList4 *iface)
34 {
35     return CONTAINING_RECORD(iface, struct taskbar_list, ITaskbarList4_iface);
36 }
37
38 /* IUnknown methods */
39
40 static HRESULT STDMETHODCALLTYPE taskbar_list_QueryInterface(ITaskbarList4 *iface, REFIID riid, void **object)
41 {
42     TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
43
44     if (IsEqualGUID(riid, &IID_ITaskbarList) ||
45         IsEqualGUID(riid, &IID_ITaskbarList2) ||
46         IsEqualGUID(riid, &IID_ITaskbarList3) ||
47         IsEqualGUID(riid, &IID_ITaskbarList4) ||
48         IsEqualGUID(riid, &IID_IUnknown))
49     {
50         ITaskbarList4_AddRef(iface);
51         *object = iface;
52         return S_OK;
53     }
54
55     WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
56
57     *object = NULL;
58     return E_NOINTERFACE;
59 }
60
61 static ULONG STDMETHODCALLTYPE taskbar_list_AddRef(ITaskbarList4 *iface)
62 {
63     struct taskbar_list *This = impl_from_ITaskbarList4(iface);
64     ULONG refcount = InterlockedIncrement(&This->refcount);
65
66     TRACE("%p increasing refcount to %u\n", This, refcount);
67
68     return refcount;
69 }
70
71 static ULONG STDMETHODCALLTYPE taskbar_list_Release(ITaskbarList4 *iface)
72 {
73     struct taskbar_list *This = impl_from_ITaskbarList4(iface);
74     ULONG refcount = InterlockedDecrement(&This->refcount);
75
76     TRACE("%p decreasing refcount to %u\n", This, refcount);
77
78     if (!refcount)
79     {
80         heap_free(This);
81         EFRAME_UnlockModule();
82     }
83
84     return refcount;
85 }
86
87 /* ITaskbarList methods */
88
89 static HRESULT STDMETHODCALLTYPE taskbar_list_HrInit(ITaskbarList4 *iface)
90 {
91     TRACE("iface %p\n", iface);
92
93     return S_OK;
94 }
95
96 static HRESULT STDMETHODCALLTYPE taskbar_list_AddTab(ITaskbarList4 *iface, HWND hwnd)
97 {
98     FIXME("iface %p, hwnd %p stub!\n", iface, hwnd);
99
100     return E_NOTIMPL;
101 }
102
103 static HRESULT STDMETHODCALLTYPE taskbar_list_DeleteTab(ITaskbarList4 *iface, HWND hwnd)
104 {
105     FIXME("iface %p, hwnd %p stub!\n", iface, hwnd);
106
107     return E_NOTIMPL;
108 }
109
110 static HRESULT STDMETHODCALLTYPE taskbar_list_ActivateTab(ITaskbarList4 *iface, HWND hwnd)
111 {
112     FIXME("iface %p, hwnd %p stub!\n", iface, hwnd);
113
114     return E_NOTIMPL;
115 }
116
117 static HRESULT STDMETHODCALLTYPE taskbar_list_SetActiveAlt(ITaskbarList4 *iface, HWND hwnd)
118 {
119     FIXME("iface %p, hwnd %p stub!\n", iface, hwnd);
120
121     return E_NOTIMPL;
122 }
123
124 /* ITaskbarList2 method */
125
126 static HRESULT STDMETHODCALLTYPE taskbar_list_MarkFullscreenWindow(ITaskbarList4 *iface,
127                                                                    HWND hwnd,
128                                                                    BOOL fullscreen)
129 {
130     FIXME("iface %p, hwnd %p, fullscreen %s stub!\n", iface, hwnd, (fullscreen)?"true":"false");
131
132     return E_NOTIMPL;
133 }
134
135 /* ITaskbarList3 methods */
136
137 static HRESULT STDMETHODCALLTYPE taskbar_list_SetProgressValue(ITaskbarList4 *iface,
138                                                                HWND hwnd,
139                                                                ULONGLONG ullCompleted,
140                                                                ULONGLONG ullTotal)
141 {
142     static BOOL fixme_once;
143     if(!fixme_once++) FIXME("iface %p, hwnd %p, ullCompleted %s, ullTotal %s stub!\n", iface, hwnd,
144                             wine_dbgstr_longlong(ullCompleted), wine_dbgstr_longlong(ullTotal));
145
146     return S_OK;
147 }
148
149 static HRESULT STDMETHODCALLTYPE taskbar_list_SetProgressState(ITaskbarList4 *iface,
150                                                                HWND hwnd,
151                                                                TBPFLAG tbpFlags)
152 {
153     static BOOL fixme_once;
154     if(!fixme_once++) FIXME("iface %p, hwnd %p, flags %x stub!\n", iface, hwnd, tbpFlags);
155
156     return S_OK;
157 }
158
159 static HRESULT STDMETHODCALLTYPE taskbar_list_RegisterTab(ITaskbarList4 *iface, HWND hwndTab, HWND hwndMDI)
160 {
161     FIXME("iface %p, hwndTab %p, hwndMDI %p stub!\n", iface, hwndTab, hwndMDI);
162
163     return E_NOTIMPL;
164 }
165
166 static HRESULT STDMETHODCALLTYPE taskbar_list_UnregisterTab(ITaskbarList4 *iface, HWND hwndTab)
167 {
168     FIXME("iface %p, hwndTab %p stub!\n", iface, hwndTab);
169
170     return E_NOTIMPL;
171 }
172
173 static HRESULT STDMETHODCALLTYPE taskbar_list_SetTabOrder(ITaskbarList4 *iface,
174                                                           HWND hwndTab,
175                                                           HWND hwndInsertBefore)
176 {
177     FIXME("iface %p, hwndTab %p, hwndInsertBefore %p stub!\n", iface, hwndTab, hwndInsertBefore);
178
179     return E_NOTIMPL;
180 }
181
182 static HRESULT STDMETHODCALLTYPE taskbar_list_SetTabActive(ITaskbarList4 *iface,
183                                                           HWND hwndTab,
184                                                           HWND hwndMDI,
185                                                           DWORD dwReserved)
186 {
187     FIXME("iface %p, hwndTab %p, hwndMDI %p, dwReserved %x stub!\n", iface, hwndTab, hwndMDI, dwReserved);
188
189     return E_NOTIMPL;
190 }
191
192 static HRESULT STDMETHODCALLTYPE taskbar_list_ThumbBarAddButtons(ITaskbarList4 *iface,
193                                                                  HWND hwnd,
194                                                                  UINT cButtons,
195                                                                  LPTHUMBBUTTON pButton)
196 {
197     FIXME("iface %p, hwnd %p, cButtons %u, pButton %p stub!\n", iface, hwnd, cButtons, pButton);
198
199     return E_NOTIMPL;
200 }
201
202 static HRESULT STDMETHODCALLTYPE taskbar_list_ThumbBarUpdateButtons(ITaskbarList4 *iface,
203                                                                    HWND hwnd,
204                                                                    UINT cButtons,
205                                                                    LPTHUMBBUTTON pButton)
206 {
207     FIXME("iface %p, hwnd %p, cButtons %u, pButton %p stub!\n", iface, hwnd, cButtons, pButton);
208
209     return E_NOTIMPL;
210 }
211
212 static HRESULT STDMETHODCALLTYPE taskbar_list_ThumbBarSetImageList(ITaskbarList4 *iface,
213                                                                    HWND hwnd,
214                                                                    HIMAGELIST himl)
215 {
216     FIXME("iface %p, hwnd %p, himl %p stub!\n", iface, hwnd, himl);
217
218     return E_NOTIMPL;
219 }
220
221 static HRESULT STDMETHODCALLTYPE taskbar_list_SetOverlayIcon(ITaskbarList4 *iface,
222                                                              HWND hwnd,
223                                                              HICON hIcon,
224                                                              LPCWSTR pszDescription)
225 {
226     FIXME("iface %p, hwnd %p, hIcon %p, pszDescription %s stub!\n", iface, hwnd, hIcon,
227           debugstr_w(pszDescription));
228
229     return E_NOTIMPL;
230 }
231
232 static HRESULT STDMETHODCALLTYPE taskbar_list_SetThumbnailTooltip(ITaskbarList4 *iface,
233                                                                   HWND hwnd,
234                                                                   LPCWSTR pszTip)
235 {
236     FIXME("iface %p, hwnd %p, pszTip %s stub!\n", iface, hwnd, debugstr_w(pszTip));
237
238     return E_NOTIMPL;
239 }
240
241 static HRESULT STDMETHODCALLTYPE taskbar_list_SetThumbnailClip(ITaskbarList4 *iface,
242                                                                HWND hwnd,
243                                                                RECT *prcClip)
244 {
245     FIXME("iface %p, hwnd %p, prcClip %s stub!\n", iface, hwnd, wine_dbgstr_rect(prcClip));
246
247     return E_NOTIMPL;
248 }
249
250 /* ITaskbarList4 method */
251
252 static HRESULT STDMETHODCALLTYPE taskbar_list_SetTabProperties(ITaskbarList4 *iface,
253                                                                HWND hwndTab,
254                                                                STPFLAG stpFlags)
255 {
256     FIXME("iface %p, hwndTab %p, stpFlags %u stub!\n", iface, hwndTab, stpFlags);
257
258     return E_NOTIMPL;
259 }
260
261 static const struct ITaskbarList4Vtbl taskbar_list_vtbl =
262 {
263     /* IUnknown methods */
264     taskbar_list_QueryInterface,
265     taskbar_list_AddRef,
266     taskbar_list_Release,
267     /* ITaskbarList methods */
268     taskbar_list_HrInit,
269     taskbar_list_AddTab,
270     taskbar_list_DeleteTab,
271     taskbar_list_ActivateTab,
272     taskbar_list_SetActiveAlt,
273     /* ITaskbarList2 method */
274     taskbar_list_MarkFullscreenWindow,
275     /* ITaskbarList3 methods */
276     taskbar_list_SetProgressValue,
277     taskbar_list_SetProgressState,
278     taskbar_list_RegisterTab,
279     taskbar_list_UnregisterTab,
280     taskbar_list_SetTabOrder,
281     taskbar_list_SetTabActive,
282     taskbar_list_ThumbBarAddButtons,
283     taskbar_list_ThumbBarUpdateButtons,
284     taskbar_list_ThumbBarSetImageList,
285     taskbar_list_SetOverlayIcon,
286     taskbar_list_SetThumbnailTooltip,
287     taskbar_list_SetThumbnailClip,
288     /* ITaskbarList4 method */
289     taskbar_list_SetTabProperties,
290 };
291
292 HRESULT TaskbarList_Constructor(IUnknown *outer, REFIID riid, void **taskbar_list)
293 {
294     struct taskbar_list *object;
295     HRESULT hres;
296
297     TRACE("outer %p, riid %s, taskbar_list %p\n", outer, debugstr_guid(riid), taskbar_list);
298
299     if (outer)
300     {
301         WARN("Aggregation not supported\n");
302         *taskbar_list = NULL;
303         return CLASS_E_NOAGGREGATION;
304     }
305
306     object = heap_alloc(sizeof(*object));
307     if (!object)
308     {
309         ERR("Failed to allocate taskbar list object memory\n");
310         *taskbar_list = NULL;
311         return E_OUTOFMEMORY;
312     }
313
314     object->ITaskbarList4_iface.lpVtbl = &taskbar_list_vtbl;
315     object->refcount = 1;
316     EFRAME_LockModule();
317
318     TRACE("Created ITaskbarList4 %p\n", object);
319
320     hres = ITaskbarList4_QueryInterface(&object->ITaskbarList4_iface, riid, taskbar_list);
321     ITaskbarList4_Release(&object->ITaskbarList4_iface);
322     return hres;
323 }