mshtml: Added IHTMLWindow2::get_screen implementation.
diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in
index bc992a4..53c995e 100644
--- a/dlls/mshtml/Makefile.in
+++ b/dlls/mshtml/Makefile.in
@@ -33,6 +33,7 @@
 	htmllocation.c \
 	htmlnode.c \
 	htmloption.c \
+	htmlscreen.c \
 	htmlscript.c \
 	htmlselect.c \
 	htmlstyle.c \
diff --git a/dlls/mshtml/htmlscreen.c b/dlls/mshtml/htmlscreen.c
new file mode 100644
index 0000000..0ac9801
--- /dev/null
+++ b/dlls/mshtml/htmlscreen.c
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2009 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+
+#include "wine/debug.h"
+
+#include "mshtml_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+
+typedef struct {
+    const IHTMLScreenVtbl *lpIHTMLScreenVtbl;
+
+    LONG ref;
+} HTMLScreen;
+
+#define HTMLSCREEN(x)  ((IHTMLScreen*)  &(x)->lpIHTMLScreenVtbl)
+
+#define HTMLSCREEN_THIS(iface) DEFINE_THIS(HTMLScreen, IHTMLScreen, iface)
+
+static HRESULT WINAPI HTMLScreen_QueryInterface(IHTMLScreen *iface, REFIID riid, void **ppv)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+
+    *ppv = NULL;
+
+    if(IsEqualGUID(&IID_IUnknown, riid)) {
+        TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+        *ppv = HTMLSCREEN(This);
+    }else if(IsEqualGUID(&IID_IDispatch, riid)) {
+        TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
+        *ppv = HTMLSCREEN(This);
+    }else if(IsEqualGUID(&IID_IHTMLScreen, riid)) {
+        TRACE("(%p)->(IID_IHTMLScreen %p)\n", This, ppv);
+        *ppv = HTMLSCREEN(This);
+    }
+
+    if(*ppv) {
+        IUnknown_AddRef((IUnknown*)*ppv);
+        return S_OK;
+    }
+
+    WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI HTMLScreen_AddRef(IHTMLScreen *iface)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI HTMLScreen_Release(IHTMLScreen *iface)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if(!ref)
+        heap_free(This);
+
+    return ref;
+}
+
+static HRESULT WINAPI HTMLScreen_GetTypeInfoCount(IHTMLScreen *iface, UINT *pctinfo)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_GetTypeInfo(IHTMLScreen *iface, UINT iTInfo,
+        LCID lcid, ITypeInfo **ppTInfo)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_GetIDsOfNames(IHTMLScreen *iface, REFIID riid,
+        LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember,
+        REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+        VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_put_bufferDepth(IHTMLScreen *iface, LONG v)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%d)\n", This, v);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_put_updateInterval(IHTMLScreen *iface, LONG v)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%d)\n", This, v);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_updateInterval(IHTMLScreen *iface, LONG *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_availHeight(IHTMLScreen *iface, LONG *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_availWidth(IHTMLScreen *iface, LONG *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen *iface, VARIANT_BOOL *p)
+{
+    HTMLScreen *This = HTMLSCREEN_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+#undef HTMLSCREEN_THIS
+
+static const IHTMLScreenVtbl HTMLSreenVtbl = {
+    HTMLScreen_QueryInterface,
+    HTMLScreen_AddRef,
+    HTMLScreen_Release,
+    HTMLScreen_GetTypeInfoCount,
+    HTMLScreen_GetTypeInfo,
+    HTMLScreen_GetIDsOfNames,
+    HTMLScreen_Invoke,
+    HTMLScreen_get_colorDepth,
+    HTMLScreen_put_bufferDepth,
+    HTMLScreen_get_bufferDepth,
+    HTMLScreen_get_width,
+    HTMLScreen_get_height,
+    HTMLScreen_put_updateInterval,
+    HTMLScreen_get_updateInterval,
+    HTMLScreen_get_availHeight,
+    HTMLScreen_get_availWidth,
+    HTMLScreen_get_fontSmoothingEnabled
+};
+
+HRESULT HTMLScreen_Create(IHTMLScreen **ret)
+{
+    HTMLScreen *screen;
+
+    screen = heap_alloc_zero(sizeof(HTMLScreen));
+    if(!screen)
+        return E_OUTOFMEMORY;
+
+    screen->lpIHTMLScreenVtbl = &HTMLSreenVtbl;
+    screen->ref = 1;
+
+    *ret = HTMLSCREEN(screen);
+    return S_OK;
+}
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 17d2bfe..f8a6938 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -950,8 +950,20 @@
 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p)
 {
     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    if(!This->screen) {
+        HRESULT hres;
+
+        hres = HTMLScreen_Create(&This->screen);
+        if(FAILED(hres))
+            return hres;
+    }
+
+    *p = This->screen;
+    IHTMLScreen_AddRef(This->screen);
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index ef4642b..8ccc402 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -247,6 +247,7 @@
     HTMLOptionElementFactory *option_factory;
     HTMLImageElementFactory *image_factory;
     HTMLLocation *location;
+    IHTMLScreen *screen;
 
     global_prop_t *global_props;
     DWORD global_prop_cnt;
@@ -594,8 +595,8 @@
 #define HTMLFRAMEBASE2(x) ((IHTMLFrameBase2*)             &(x)->lpIHTMLFrameBase2Vtbl)
 
 #define HTMLOPTFACTORY(x)  ((IHTMLOptionElementFactory*)  &(x)->lpHTMLOptionElementFactoryVtbl)
-#define HTMLIMGFACTORY(x)  ((IHTMLImageElementFactory*)  &(x)->lpHTMLImageElementFactoryVtbl)
-#define HTMLLOCATION(x)  ((IHTMLLocation*) &(x)->lpHTMLLocationVtbl)
+#define HTMLIMGFACTORY(x)  ((IHTMLImageElementFactory*)   &(x)->lpHTMLImageElementFactoryVtbl)
+#define HTMLLOCATION(x)    ((IHTMLLocation*)              &(x)->lpHTMLLocationVtbl)
 
 #define DISPATCHEX(x)    ((IDispatchEx*) &(x)->lpIDispatchExVtbl)
 
@@ -618,6 +619,7 @@
 HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow*);
 HRESULT HTMLLocation_Create(HTMLWindow*,HTMLLocation**);
 IOmNavigator *OmNavigator_Create(void);
+HRESULT HTMLScreen_Create(IHTMLScreen**);
 
 void HTMLDocument_HTMLDocument3_Init(HTMLDocument*);
 void HTMLDocument_HTMLDocument5_Init(HTMLDocument*);
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 0376ac2..86e74c3 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -3032,6 +3032,26 @@
     ok(!ref, "navigator should be destroyed here\n");
 }
 
+static void test_screen(IHTMLWindow2 *window)
+{
+    IHTMLScreen *screen, *screen2;
+    HRESULT hres;
+
+    screen = NULL;
+    hres = IHTMLWindow2_get_screen(window, &screen);
+    ok(hres == S_OK, "get_screen failed: %08x\n", hres);
+    ok(screen != NULL, "screen == NULL\n");
+
+    screen2 = NULL;
+    hres = IHTMLWindow2_get_screen(window, &screen2);
+    ok(hres == S_OK, "get_screen failed: %08x\n", hres);
+    ok(screen2 != NULL, "screen == NULL\n");
+    ok(iface_cmp((IUnknown*)screen2, (IUnknown*)screen), "screen2 != screen\n");
+    IHTMLScreen_Release(screen2);
+
+    IHTMLScreen_Release(screen);
+}
+
 static void test_current_style(IHTMLCurrentStyle *current_style)
 {
     BSTR str;
@@ -4654,6 +4674,7 @@
     test_window_name(window, NULL);
     set_window_name(window, "test");
     test_window_length(window, 0);
+    test_screen(window);
 
     IHTMLWindow2_Release(window);
 }