xref: /reactos/dll/win32/mshtml/htmlscreen.c (revision 40462c92)
1 /*
2  * Copyright 2009 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #include "mshtml_private.h"
20 
21 typedef struct {
22     DispatchEx dispex;
23     IHTMLScreen IHTMLScreen_iface;
24 
25     LONG ref;
26 } HTMLScreen;
27 
28 static inline HTMLScreen *impl_from_IHTMLScreen(IHTMLScreen *iface)
29 {
30     return CONTAINING_RECORD(iface, HTMLScreen, IHTMLScreen_iface);
31 }
32 
33 static HRESULT WINAPI HTMLScreen_QueryInterface(IHTMLScreen *iface, REFIID riid, void **ppv)
34 {
35     HTMLScreen *This = impl_from_IHTMLScreen(iface);
36 
37     TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
38 
39     if(IsEqualGUID(&IID_IUnknown, riid)) {
40         *ppv = &This->IHTMLScreen_iface;
41     }else if(IsEqualGUID(&IID_IHTMLScreen, riid)) {
42         *ppv = &This->IHTMLScreen_iface;
43     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
44         return *ppv ? S_OK : E_NOINTERFACE;
45     }else {
46         *ppv = NULL;
47         WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
48         return E_NOINTERFACE;
49     }
50 
51     IUnknown_AddRef((IUnknown*)*ppv);
52     return S_OK;
53 }
54 
55 static ULONG WINAPI HTMLScreen_AddRef(IHTMLScreen *iface)
56 {
57     HTMLScreen *This = impl_from_IHTMLScreen(iface);
58     LONG ref = InterlockedIncrement(&This->ref);
59 
60     TRACE("(%p) ref=%d\n", This, ref);
61 
62     return ref;
63 }
64 
65 static ULONG WINAPI HTMLScreen_Release(IHTMLScreen *iface)
66 {
67     HTMLScreen *This = impl_from_IHTMLScreen(iface);
68     LONG ref = InterlockedDecrement(&This->ref);
69 
70     TRACE("(%p) ref=%d\n", This, ref);
71 
72     if(!ref) {
73         release_dispex(&This->dispex);
74         heap_free(This);
75     }
76 
77     return ref;
78 }
79 
80 static HRESULT WINAPI HTMLScreen_GetTypeInfoCount(IHTMLScreen *iface, UINT *pctinfo)
81 {
82     HTMLScreen *This = impl_from_IHTMLScreen(iface);
83     return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
84 }
85 
86 static HRESULT WINAPI HTMLScreen_GetTypeInfo(IHTMLScreen *iface, UINT iTInfo,
87         LCID lcid, ITypeInfo **ppTInfo)
88 {
89     HTMLScreen *This = impl_from_IHTMLScreen(iface);
90     return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
91 }
92 
93 static HRESULT WINAPI HTMLScreen_GetIDsOfNames(IHTMLScreen *iface, REFIID riid,
94         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
95 {
96     HTMLScreen *This = impl_from_IHTMLScreen(iface);
97     return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
98             lcid, rgDispId);
99 }
100 
101 static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember,
102         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
103         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
104 {
105     HTMLScreen *This = impl_from_IHTMLScreen(iface);
106     return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
107             pDispParams, pVarResult, pExcepInfo, puArgErr);
108 }
109 
110 static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p)
111 {
112     HTMLScreen *This = impl_from_IHTMLScreen(iface);
113 
114     TRACE("(%p)->(%p)\n", This, p);
115 
116     *p = GetDeviceCaps(get_display_dc(), BITSPIXEL);
117     return S_OK;
118 }
119 
120 static HRESULT WINAPI HTMLScreen_put_bufferDepth(IHTMLScreen *iface, LONG v)
121 {
122     HTMLScreen *This = impl_from_IHTMLScreen(iface);
123     FIXME("(%p)->(%d)\n", This, v);
124     return E_NOTIMPL;
125 }
126 
127 static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p)
128 {
129     HTMLScreen *This = impl_from_IHTMLScreen(iface);
130     FIXME("(%p)->(%p)\n", This, p);
131     return E_NOTIMPL;
132 }
133 
134 static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p)
135 {
136     HTMLScreen *This = impl_from_IHTMLScreen(iface);
137 
138     TRACE("(%p)->(%p)\n", This, p);
139 
140     *p = GetDeviceCaps(get_display_dc(), HORZRES);
141     return S_OK;
142 }
143 
144 static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p)
145 {
146     HTMLScreen *This = impl_from_IHTMLScreen(iface);
147 
148     TRACE("(%p)->(%p)\n", This, p);
149 
150     *p = GetDeviceCaps(get_display_dc(), VERTRES);
151     return S_OK;
152 }
153 
154 static HRESULT WINAPI HTMLScreen_put_updateInterval(IHTMLScreen *iface, LONG v)
155 {
156     HTMLScreen *This = impl_from_IHTMLScreen(iface);
157     FIXME("(%p)->(%d)\n", This, v);
158     return E_NOTIMPL;
159 }
160 
161 static HRESULT WINAPI HTMLScreen_get_updateInterval(IHTMLScreen *iface, LONG *p)
162 {
163     HTMLScreen *This = impl_from_IHTMLScreen(iface);
164     FIXME("(%p)->(%p)\n", This, p);
165     return E_NOTIMPL;
166 }
167 
168 static HRESULT WINAPI HTMLScreen_get_availHeight(IHTMLScreen *iface, LONG *p)
169 {
170     HTMLScreen *This = impl_from_IHTMLScreen(iface);
171     RECT work_area;
172 
173     TRACE("(%p)->(%p)\n", This, p);
174 
175     if(!SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0))
176         return E_FAIL;
177 
178     *p = work_area.bottom-work_area.top;
179     return S_OK;
180 }
181 
182 static HRESULT WINAPI HTMLScreen_get_availWidth(IHTMLScreen *iface, LONG *p)
183 {
184     HTMLScreen *This = impl_from_IHTMLScreen(iface);
185     RECT work_area;
186 
187     TRACE("(%p)->(%p)\n", This, p);
188 
189     if(!SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0))
190         return E_FAIL;
191 
192     *p = work_area.right-work_area.left;
193     return S_OK;
194 }
195 
196 static HRESULT WINAPI HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen *iface, VARIANT_BOOL *p)
197 {
198     HTMLScreen *This = impl_from_IHTMLScreen(iface);
199     FIXME("(%p)->(%p)\n", This, p);
200     return E_NOTIMPL;
201 }
202 
203 static const IHTMLScreenVtbl HTMLSreenVtbl = {
204     HTMLScreen_QueryInterface,
205     HTMLScreen_AddRef,
206     HTMLScreen_Release,
207     HTMLScreen_GetTypeInfoCount,
208     HTMLScreen_GetTypeInfo,
209     HTMLScreen_GetIDsOfNames,
210     HTMLScreen_Invoke,
211     HTMLScreen_get_colorDepth,
212     HTMLScreen_put_bufferDepth,
213     HTMLScreen_get_bufferDepth,
214     HTMLScreen_get_width,
215     HTMLScreen_get_height,
216     HTMLScreen_put_updateInterval,
217     HTMLScreen_get_updateInterval,
218     HTMLScreen_get_availHeight,
219     HTMLScreen_get_availWidth,
220     HTMLScreen_get_fontSmoothingEnabled
221 };
222 
223 static const tid_t HTMLScreen_iface_tids[] = {
224     IHTMLScreen_tid,
225     0
226 };
227 static dispex_static_data_t HTMLScreen_dispex = {
228     NULL,
229     DispHTMLScreen_tid,
230     NULL,
231     HTMLScreen_iface_tids
232 };
233 
234 HRESULT HTMLScreen_Create(IHTMLScreen **ret)
235 {
236     HTMLScreen *screen;
237 
238     screen = heap_alloc_zero(sizeof(HTMLScreen));
239     if(!screen)
240         return E_OUTOFMEMORY;
241 
242     screen->IHTMLScreen_iface.lpVtbl = &HTMLSreenVtbl;
243     screen->ref = 1;
244 
245     init_dispex(&screen->dispex, (IUnknown*)&screen->IHTMLScreen_iface, &HTMLScreen_dispex);
246 
247     *ret = &screen->IHTMLScreen_iface;
248     return S_OK;
249 }
250