Jacek Caban : mshtml: Added IHTMLScreen::get_width implementation.

Alexandre Julliard julliard at winehq.org
Tue Dec 1 09:19:39 CST 2009


Module: wine
Branch: master
Commit: ca54be2cc64fab230d2d199a8cb827928d28c2de
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ca54be2cc64fab230d2d199a8cb827928d28c2de

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov 30 17:57:39 2009 +0100

mshtml: Added IHTMLScreen::get_width implementation.

---

 dlls/mshtml/htmlscreen.c      |    7 +++++--
 dlls/mshtml/main.c            |   18 ++++++++++++++++++
 dlls/mshtml/mshtml_private.h  |    1 +
 dlls/mshtml/tests/Makefile.in |    2 +-
 dlls/mshtml/tests/dom.c       |   15 +++++++++++++++
 5 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/htmlscreen.c b/dlls/mshtml/htmlscreen.c
index b504b20..3ed403f 100644
--- a/dlls/mshtml/htmlscreen.c
+++ b/dlls/mshtml/htmlscreen.c
@@ -148,8 +148,11 @@ static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p)
 static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p)
 {
     HTMLScreen *This = HTMLSCREEN_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    *p = GetDeviceCaps(get_display_dc(), HORZRES);
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p)
diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c
index 6a358e5..1e30066 100644
--- a/dlls/mshtml/main.c
+++ b/dlls/mshtml/main.c
@@ -47,6 +47,7 @@ HINSTANCE hInst;
 DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
 
 static HINSTANCE shdoclc = NULL;
+static HDC display_dc;
 
 static void thread_detach(void)
 {
@@ -71,6 +72,8 @@ static void process_detach(void)
         FreeLibrary(shdoclc);
     if(mshtml_tls != TLS_OUT_OF_INDEXES)
         TlsFree(mshtml_tls);
+    if(display_dc)
+        DeleteObject(display_dc);
 }
 
 HINSTANCE get_shdoclc(void)
@@ -84,6 +87,21 @@ HINSTANCE get_shdoclc(void)
     return shdoclc = LoadLibraryExW(wszShdoclc, NULL, LOAD_LIBRARY_AS_DATAFILE);
 }
 
+HDC get_display_dc(void)
+{
+    static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0};
+
+    if(!display_dc) {
+        HDC hdc;
+
+        hdc = CreateICW(displayW, NULL, NULL, NULL);
+        if(InterlockedCompareExchangePointer((void**)&display_dc, hdc, NULL))
+            DeleteObject(hdc);
+    }
+
+    return display_dc;
+}
+
 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
 {
     switch(fdwReason) {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 33f9c96..d99fb54 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -940,6 +940,7 @@ static inline void windowref_release(windowref_t *ref)
         heap_free(ref);
 }
 
+HDC get_display_dc(void);
 HINSTANCE get_shdoclc(void);
 
 extern HINSTANCE hInst;
diff --git a/dlls/mshtml/tests/Makefile.in b/dlls/mshtml/tests/Makefile.in
index dc86c18..d2815ae 100644
--- a/dlls/mshtml/tests/Makefile.in
+++ b/dlls/mshtml/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = mshtml.dll
-IMPORTS   = ole32 oleaut32 user32 urlmon advapi32 kernel32
+IMPORTS   = ole32 oleaut32 user32 urlmon gdi32 advapi32 kernel32
 
 CTESTS = \
 	dom.c \
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index bc012f5..ff58013 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -3035,8 +3035,12 @@ static void test_navigator(IHTMLDocument2 *doc)
 static void test_screen(IHTMLWindow2 *window)
 {
     IHTMLScreen *screen, *screen2;
+    LONG l, exl;
+    HDC hdc;
     HRESULT hres;
 
+    static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0};
+
     screen = NULL;
     hres = IHTMLWindow2_get_screen(window, &screen);
     ok(hres == S_OK, "get_screen failed: %08x\n", hres);
@@ -3051,6 +3055,17 @@ static void test_screen(IHTMLWindow2 *window)
 
     test_disp((IUnknown*)screen, &DIID_DispHTMLScreen, "[object]");
 
+    hdc = CreateICW(displayW, NULL, NULL, NULL);
+
+    exl = GetDeviceCaps(hdc, HORZRES);
+
+    l = 0xdeadbeef;
+    hres = IHTMLScreen_get_width(screen, &l);
+    ok(hres == S_OK, "get_width failed: %08x\n", hres);
+    ok(l == exl, "width = %d, expected %d\n", l, exl);
+
+    DeleteObject(hdc);
+
     IHTMLScreen_Release(screen);
 }
 




More information about the wine-cvs mailing list