winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
July 2015
----- 2025 -----
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
567 discussions
Start a n
N
ew thread
Sebastian Lackner : ntdll: Add support for threadpool group cancel callback.
by Alexandre Julliard
02 Jul '15
02 Jul '15
Module: wine Branch: master Commit: 1839ce8697105a83a5f5a427c4b047422e3ec06c URL:
http://source.winehq.org/git/wine.git/?a=commit;h=1839ce8697105a83a5f5a427c…
Author: Sebastian Lackner <sebastian(a)fds-team.de> Date: Wed Jul 1 22:52:52 2015 +0200 ntdll: Add support for threadpool group cancel callback. --- dlls/ntdll/threadpool.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c index da41ba0..93d9b28 100644 --- a/dlls/ntdll/threadpool.c +++ b/dlls/ntdll/threadpool.c @@ -171,6 +171,7 @@ struct threadpool_object struct threadpool *pool; struct threadpool_group *group; PVOID userdata; + PTP_CLEANUP_GROUP_CANCEL_CALLBACK group_cancel_callback; /* information about the group, locked via .group->cs */ struct list group_entry; BOOL is_group_member; @@ -1370,6 +1371,7 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa object->pool = pool; object->group = NULL; object->userdata = userdata; + object->group_cancel_callback = NULL; memset( &object->group_entry, 0, sizeof(object->group_entry) ); object->is_group_member = FALSE; @@ -1385,6 +1387,7 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa FIXME( "unsupported environment version %u\n", environment->Version ); object->group = impl_from_TP_CLEANUP_GROUP( environment->CleanupGroup ); + object->group_cancel_callback = environment->CleanupGroupCancelCallback; WARN( "environment not fully implemented yet\n" ); } @@ -1467,7 +1470,7 @@ static void tp_object_submit( struct threadpool_object *object ) * * Cancels all currently pending callbacks for a specific object. */ -static void tp_object_cancel( struct threadpool_object *object ) +static void tp_object_cancel( struct threadpool_object *object, BOOL group_cancel, PVOID userdata ) { struct threadpool *pool = object->pool; LONG pending_callbacks = 0; @@ -1481,6 +1484,14 @@ static void tp_object_cancel( struct threadpool_object *object ) } RtlLeaveCriticalSection( &pool->cs ); + /* Execute group cancellation callback if defined, and if this was actually a group cancel. */ + if (pending_callbacks && group_cancel && object->group_cancel_callback) + { + TRACE( "executing group cancel callback %p(%p, %p)\n", object->group_cancel_callback, object, userdata ); + object->group_cancel_callback( object, userdata ); + TRACE( "callback %p returned\n", object->group_cancel_callback ); + } + while (pending_callbacks--) tp_object_release( object ); } @@ -1766,7 +1777,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p { LIST_FOR_EACH_ENTRY( object, &members, struct threadpool_object, group_entry ) { - tp_object_cancel( object ); + tp_object_cancel( object, TRUE, userdata ); } } @@ -1894,6 +1905,6 @@ VOID WINAPI TpWaitForWork( TP_WORK *work, BOOL cancel_pending ) TRACE( "%p %u\n", work, cancel_pending ); if (cancel_pending) - tp_object_cancel( this ); + tp_object_cancel( this, FALSE, NULL ); tp_object_wait( this ); }
1
0
0
0
Aaryaman Vasishta : d3drm: Fix function signature for IDirect3DRM3:: CreateDeviceFromSurface.
by Alexandre Julliard
02 Jul '15
02 Jul '15
Module: wine Branch: master Commit: 388da78edc3bc5afa41dae738def7dc18f4e6bfc URL:
http://source.winehq.org/git/wine.git/?a=commit;h=388da78edc3bc5afa41dae738…
Author: Aaryaman Vasishta <jem456.vasishta(a)gmail.com> Date: Wed Jul 1 04:51:38 2015 +0530 d3drm: Fix function signature for IDirect3DRM3::CreateDeviceFromSurface. --- dlls/d3drm/d3drm.c | 6 +++--- include/d3drm.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c index 9be9607..70c2678 100644 --- a/dlls/d3drm/d3drm.c +++ b/dlls/d3drm/d3drm.c @@ -963,10 +963,10 @@ static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface, } static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *guid, - IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice3 **device) + IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, DWORD flags, IDirect3DRMDevice3 **device) { - FIXME("iface %p, guid %s, ddraw %p, backbuffer %p, device %p partial stub.\n", - iface, debugstr_guid(guid), ddraw, backbuffer, device); + FIXME("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p partial stub.\n", + iface, debugstr_guid(guid), ddraw, backbuffer, flags, device); return Direct3DRMDevice_create(&IID_IDirect3DRMDevice3, (IUnknown **)device); } diff --git a/include/d3drm.h b/include/d3drm.h index 07e39c1..e1e0d23 100644 --- a/include/d3drm.h +++ b/include/d3drm.h @@ -353,7 +353,7 @@ DECLARE_INTERFACE_(IDirect3DRM3,IUnknown) STDMETHOD(CreateMaterial)(THIS_ D3DVALUE, IDirect3DRMMaterial2 **material) PURE; STDMETHOD(CreateDevice)(THIS_ DWORD width, DWORD height, IDirect3DRMDevice3 **device) PURE; STDMETHOD(CreateDeviceFromSurface)(THIS_ GUID *guid, IDirectDraw *ddraw, - IDirectDrawSurface *surface, IDirect3DRMDevice3 **device) PURE; + IDirectDrawSurface *surface, DWORD flags, IDirect3DRMDevice3 **device) PURE; STDMETHOD(CreateDeviceFromD3D)(THIS_ IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice3 **device) PURE; STDMETHOD(CreateDeviceFromClipper)(THIS_ IDirectDrawClipper *clipper, GUID *guid, @@ -411,7 +411,7 @@ DECLARE_INTERFACE_(IDirect3DRM3,IUnknown) #define IDirect3DRM3_CreateLightRGB(p,a,b,c,d,e) (p)->lpVtbl->CreateLightRGB(p,a,b,c,d,e) #define IDirect3DRM3_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b) #define IDirect3DRM3_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) -#define IDirect3DRM3_CreateDeviceFromSurface(p,a,b,c,d) (p)->lpVtbl->CreateDeviceFromSurface(p,a,b,c,d) +#define IDirect3DRM3_CreateDeviceFromSurface(p,a,b,c,d,e) (p)->lpVtbl->CreateDeviceFromSurface(p,a,b,c,d,e) #define IDirect3DRM3_CreateDeviceFromD3D(p,a,b,c) (p)->lpVtbl->CreateDeviceFromD3D(p,a,b,c) #define IDirect3DRM3_CreateDeviceFromClipper(p,a,b,c,d,e) (p)->lpVtbl->CreateDeviceFromClipper(p,a,b,c,d,e) #define IDirect3DRM3_CreateTextureFromSurface(p,a,b) (p)->lpVtbl->CreateTextureFromSurface(p,a,b) @@ -455,7 +455,7 @@ DECLARE_INTERFACE_(IDirect3DRM3,IUnknown) #define IDirect3DRM3_CreateLightRGB(p,a,b,c,d,e) (p)->CreateLightRGB(a,b,c,d,e) #define IDirect3DRM3_CreateMaterial(p,a,b) (p)->CreateMaterial(a,b) #define IDirect3DRM3_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) -#define IDirect3DRM3_CreateDeviceFromSurface(p,a,b,c,d) (p)->CreateDeviceFromSurface(a,b,c,d) +#define IDirect3DRM3_CreateDeviceFromSurface(p,a,b,c,d,e) (p)->CreateDeviceFromSurface(a,b,c,d,e) #define IDirect3DRM3_CreateDeviceFromD3D(p,a,b,c) (p)->CreateDeviceFromD3D(a,b,c) #define IDirect3DRM3_CreateDeviceFromClipper(p,a,b,c,d,e) (p)->CreateDeviceFromClipper(a,b,c,d,e) #define IDirect3DRM3_CreateTextureFromSurface(p,a,b) (p)->CreateTextureFromSurface(a,b)
1
0
0
0
Nikolay Sivov : uxtheme: Partial implementation of DrawThemeTextEx.
by Alexandre Julliard
02 Jul '15
02 Jul '15
Module: wine Branch: master Commit: 2bb581b9b7265a0ffea839c62d131cb043a3917b URL:
http://source.winehq.org/git/wine.git/?a=commit;h=2bb581b9b7265a0ffea839c62…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Thu Jul 2 00:14:21 2015 +0300 uxtheme: Partial implementation of DrawThemeTextEx. --- dlls/uxtheme/draw.c | 45 +++++++++++++++++++++++++++++++++++---------- dlls/uxtheme/uxtheme.spec | 1 + include/uxtheme.h | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/dlls/uxtheme/draw.c b/dlls/uxtheme/draw.c index a7f80fd..e3d3679 100644 --- a/dlls/uxtheme/draw.c +++ b/dlls/uxtheme/draw.c @@ -1633,8 +1633,29 @@ HRESULT WINAPI DrawThemeIcon(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, * DrawThemeText (UXTHEME.@) */ HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, - LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, - DWORD dwTextFlags2, const RECT *pRect) + LPCWSTR pszText, int iCharCount, DWORD flags, + DWORD flags2, const RECT *pRect) +{ + DTTOPTS opts; + RECT rt; + + TRACE("%d %d\n", iPartId, iStateId); + + CopyRect(&rt, pRect); + + opts.dwSize = sizeof(opts); + if (flags2 & DTT_GRAYED) { + opts.dwFlags = DTT_TEXTCOLOR; + opts.crText = GetSysColor(COLOR_GRAYTEXT); + } + return DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, flags, &rt, &opts); +} + +/*********************************************************************** + * DrawThemeTextEx (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeTextEx(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, + LPCWSTR pszText, int iCharCount, DWORD flags, RECT *rect, const DTTOPTS *options) { HRESULT hr; HFONT hFont = NULL; @@ -1643,11 +1664,15 @@ HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, COLORREF textColor; COLORREF oldTextColor; int oldBkMode; - RECT rt; - - TRACE("%d %d: stub\n", iPartId, iStateId); + + TRACE("%p %p %d %d %s:%d 0x%08x %p %p\n", hTheme, hdc, iPartId, iStateId, + debugstr_wn(pszText, iCharCount), iCharCount, flags, rect, options); + if(!hTheme) return E_HANDLE; + + if (options->dwFlags & ~DTT_TEXTCOLOR) + FIXME("unsupported flags 0x%08x\n", options->dwFlags); hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont); if(SUCCEEDED(hr)) { @@ -1655,19 +1680,19 @@ HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, if(!hFont) TRACE("Failed to create font\n"); } - CopyRect(&rt, pRect); + if(hFont) oldFont = SelectObject(hdc, hFont); - - if(dwTextFlags2 & DTT_GRAYED) - textColor = GetSysColor(COLOR_GRAYTEXT); + + if (options->dwFlags & DTT_TEXTCOLOR) + textColor = options->crText; else { if(FAILED(GetThemeColor(hTheme, iPartId, iStateId, TMT_TEXTCOLOR, &textColor))) textColor = GetTextColor(hdc); } oldTextColor = SetTextColor(hdc, textColor); oldBkMode = SetBkMode(hdc, TRANSPARENT); - DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags); + DrawTextW(hdc, pszText, iCharCount, rect, flags); SetBkMode(hdc, oldBkMode); SetTextColor(hdc, oldTextColor); diff --git a/dlls/uxtheme/uxtheme.spec b/dlls/uxtheme/uxtheme.spec index 7a0e7e4..d4ea07a 100644 --- a/dlls/uxtheme/uxtheme.spec +++ b/dlls/uxtheme/uxtheme.spec @@ -58,6 +58,7 @@ @ stdcall DrawThemeIcon(ptr ptr long long ptr ptr long) @ stdcall DrawThemeParentBackground(ptr ptr ptr) @ stdcall DrawThemeText(ptr ptr long long wstr long long long ptr) +@ stdcall DrawThemeTextEx(ptr ptr long long wstr long long ptr ptr) @ stdcall EnableThemeDialogTexture(ptr long) @ stdcall EnableTheming(long) @ stdcall EndBufferedAnimation(ptr long) diff --git a/include/uxtheme.h b/include/uxtheme.h index e167d80..7606306 100644 --- a/include/uxtheme.h +++ b/include/uxtheme.h @@ -53,6 +53,46 @@ HRESULT WINAPI DrawThemeParentBackground(HWND,HDC,RECT*); HRESULT WINAPI DrawThemeText(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,DWORD, const RECT*); +/* DTTOPTS.dwFlags bits */ +#define DTT_TEXTCOLOR 0x00000001 +#define DTT_BORDERCOLOR 0x00000002 +#define DTT_SHADOWCOLOR 0x00000004 +#define DTT_SHADOWTYPE 0x00000008 +#define DTT_SHADOWOFFSET 0x00000010 +#define DTT_BORDERSIZE 0x00000020 +#define DTT_FONTPROP 0x00000040 +#define DTT_COLORPROP 0x00000080 +#define DTT_STATEID 0x00000100 +#define DTT_CALCRECT 0x00000200 +#define DTT_APPLYOVERLAY 0x00000400 +#define DTT_GLOWSIZE 0x00000800 +#define DTT_CALLBACK 0x00001000 +#define DTT_COMPOSITED 0x00002000 +#define DTT_VALIDBITS 0x00003fff + +typedef int (WINAPI *DTT_CALLBACK_PROC)(HDC,LPWSTR,int,RECT*,UINT,LPARAM); + +typedef struct _DTTOPTS { + DWORD dwSize; + DWORD dwFlags; + COLORREF crText; + COLORREF crBorder; + COLORREF crShadow; + int iTextShadowType; + POINT ptShadowOffset; + int iBorderSize; + int iFontPropId; + int iColorPropId; + int iStateId; + BOOL fApplyOverlay; + int iGlowSize; + DTT_CALLBACK_PROC pfnDrawTextCallback; + LPARAM lParam; +} DTTOPTS, *PDTTOPTS; + +HRESULT WINAPI DrawThemeTextEx(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,RECT*, + const DTTOPTS*); + #define ETDT_DISABLE 0x00000001 #define ETDT_ENABLE 0x00000002 #define ETDT_USETABTEXTURE 0x00000004
1
0
0
0
Nikolay Sivov : dwrite: Add last cluster width to line width.
by Alexandre Julliard
02 Jul '15
02 Jul '15
Module: wine Branch: master Commit: d86f2af3b6f7c3e514c357deaae8fa410305cbda URL:
http://source.winehq.org/git/wine.git/?a=commit;h=d86f2af3b6f7c3e514c357dea…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Wed Jul 1 20:44:03 2015 +0300 dwrite: Add last cluster width to line width. --- dlls/dwrite/layout.c | 1 + dlls/dwrite/tests/layout.c | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index a718538..4dbb53f 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -1130,6 +1130,7 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout) FLOAT descent, trailingspacewidth; if (!overflow) { + width += layout->clustermetrics[i].width; metrics.length += layout->clustermetrics[i].length; last_cluster = i; } diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 84e1a2b..eee86a9 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -2468,10 +2468,14 @@ static void test_GetMetrics(void) { static const WCHAR str2W[] = {0x2066,')',')',0x661,'(',0x627,')',0}; static const WCHAR strW[] = {'a','b','c','d',0}; + static const WCHAR str3W[] = {'a',0}; + DWRITE_CLUSTER_METRICS clusters[4]; DWRITE_TEXT_METRICS metrics; IDWriteTextFormat *format; IDWriteTextLayout *layout; IDWriteFactory *factory; + UINT32 count, i; + FLOAT width; HRESULT hr; factory = create_factory(); @@ -2483,13 +2487,21 @@ static void test_GetMetrics(void) hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 500.0, 1000.0, &layout); ok(hr == S_OK, "got 0x%08x\n", hr); + count = 0; + hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(count == 4, "got %u\n", count); + for (i = 0, width = 0.0; i < count; i++) + width += clusters[i].width; + memset(&metrics, 0xcc, sizeof(metrics)); hr = IDWriteTextLayout_GetMetrics(layout, &metrics); ok(hr == S_OK, "got 0x%08x\n", hr); ok(metrics.left == 0.0, "got %.2f\n", metrics.left); ok(metrics.top == 0.0, "got %.2f\n", metrics.top); - ok(metrics.width > 0.0, "got %.2f\n", metrics.width); - ok(metrics.widthIncludingTrailingWhitespace > 0.0, "got %.2f\n", metrics.widthIncludingTrailingWhitespace); + ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width); + ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n", + metrics.widthIncludingTrailingWhitespace, width); ok(metrics.height > 0.0, "got %.2f\n", metrics.height); ok(metrics.layoutWidth == 500.0, "got %.2f\n", metrics.layoutWidth); ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight); @@ -2519,6 +2531,29 @@ todo_wine IDWriteTextLayout_Release(layout); + /* single cluster layout */ + hr = IDWriteFactory_CreateTextLayout(factory, str3W, 1, format, 500.0, 1000.0, &layout); + ok(hr == S_OK, "got 0x%08x\n", hr); + + count = 0; + hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 1, &count); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(count == 1, "got %u\n", count); + + memset(&metrics, 0xcc, sizeof(metrics)); + hr = IDWriteTextLayout_GetMetrics(layout, &metrics); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(metrics.left == 0.0, "got %.2f\n", metrics.left); + ok(metrics.top == 0.0, "got %.2f\n", metrics.top); + ok(metrics.width == clusters[0].width, "got %.2f, expected %.2f\n", metrics.width, clusters[0].width); + ok(metrics.widthIncludingTrailingWhitespace == clusters[0].width, "got %.2f\n", metrics.widthIncludingTrailingWhitespace); + ok(metrics.height > 0.0, "got %.2f\n", metrics.height); + ok(metrics.layoutWidth == 500.0, "got %.2f\n", metrics.layoutWidth); + ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight); + ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth); + ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount); + IDWriteTextLayout_Release(layout); + IDWriteTextFormat_Release(format); IDWriteFactory_Release(factory); }
1
0
0
0
Nikolay Sivov : dwrite: Initial layout GetMetrics() implementation.
by Alexandre Julliard
02 Jul '15
02 Jul '15
Module: wine Branch: master Commit: a940c9b970b1769771145bfe4a67ebb48b339274 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=a940c9b970b1769771145bfe4…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Wed Jul 1 20:43:30 2015 +0300 dwrite: Initial layout GetMetrics() implementation. --- dlls/dwrite/layout.c | 37 +++++++++++++++++++++++++++++++++---- dlls/dwrite/tests/layout.c | 7 +++---- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 752bd50..a718538 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -248,6 +248,8 @@ struct dwrite_textlayout { UINT32 line_count; UINT32 line_alloc; + DWRITE_TEXT_METRICS1 metrics; + /* gdi-compatible layout specifics */ BOOL gdicompatible; FLOAT pixels_per_dip; @@ -1125,7 +1127,7 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout) i == layout->cluster_count - 1) /* end of the text */ { UINT32 strlength, last_cluster = i, index; - FLOAT descent; + FLOAT descent, trailingspacewidth; if (!overflow) { metrics.length += layout->clustermetrics[i].length; @@ -1145,6 +1147,7 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout) trailing properties for current line */ strlength = metrics.length; index = last_cluster; + trailingspacewidth = 0.0; while (strlength) { DWRITE_CLUSTER_METRICS *cluster = &layout->clustermetrics[index]; @@ -1156,8 +1159,10 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout) metrics.newlineLength += cluster->length; } - if (cluster->isWhitespace) + if (cluster->isWhitespace) { metrics.trailingWhitespaceLength += cluster->length; + trailingspacewidth += cluster->width; + } strlength -= cluster->length; index--; @@ -1184,6 +1189,11 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout) } metrics.height = descent + metrics.baseline; + if (width > layout->metrics.widthIncludingTrailingWhitespace) + layout->metrics.widthIncludingTrailingWhitespace = width; + if (width - trailingspacewidth > layout->metrics.width) + layout->metrics.width = width - trailingspacewidth; + metrics.isTrimmed = width > layout->maxwidth; hr = layout_set_line_metrics(layout, &metrics, &line); if (FAILED(hr)) @@ -1203,6 +1213,12 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout) textpos += layout->clustermetrics[i].length; } + layout->metrics.left = layout->metrics.top = 0.0; + layout->metrics.layoutWidth = layout->maxwidth; + layout->metrics.layoutHeight = layout->maxheight; + layout->metrics.maxBidiReorderingDepth = 1; /* FIXME */ + layout->metrics.lineCount = layout->line_count; + /* Now all line info is here, update effective runs positions in flow direction */ erun = layout_get_next_erun(layout, NULL); inrun = layout_get_next_inline_run(layout, NULL); @@ -1227,8 +1243,12 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout) if (!inrun) break; } + + layout->metrics.height += layout->lines[line].height; } + layout->metrics.heightIncludingTrailingWhitespace = layout->metrics.height; /* FIXME: not true for vertical text */ + layout->recompute &= ~RECOMPUTE_EFFECTIVE_RUNS; return hr; } @@ -2775,8 +2795,16 @@ static HRESULT WINAPI dwritetextlayout1_GetCharacterSpacing(IDWriteTextLayout2 * static HRESULT WINAPI dwritetextlayout2_GetMetrics(IDWriteTextLayout2 *iface, DWRITE_TEXT_METRICS1 *metrics) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface); - FIXME("(%p)->(%p): stub\n", This, metrics); - return E_NOTIMPL; + HRESULT hr; + + TRACE("(%p)->(%p)\n", This, metrics); + + hr = layout_compute_effective_runs(This); + if (FAILED(hr)) + return hr; + + *metrics = This->metrics; + return S_OK; } static HRESULT WINAPI dwritetextlayout2_SetVerticalGlyphOrientation(IDWriteTextLayout2 *iface, DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) @@ -3542,6 +3570,7 @@ static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat * list_init(&layout->effects); list_init(&layout->spacing); memset(&layout->format, 0, sizeof(layout->format)); + memset(&layout->metrics, 0, sizeof(layout->metrics)); layout->gdicompatible = FALSE; layout->pixels_per_dip = 0.0; diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 43233f4..84e1a2b 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -2485,7 +2485,6 @@ static void test_GetMetrics(void) memset(&metrics, 0xcc, sizeof(metrics)); hr = IDWriteTextLayout_GetMetrics(layout, &metrics); -todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(metrics.left == 0.0, "got %.2f\n", metrics.left); ok(metrics.top == 0.0, "got %.2f\n", metrics.top); @@ -2496,7 +2495,7 @@ todo_wine { ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight); ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth); ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount); -} + IDWriteTextLayout_Release(layout); /* a string with more complex bidi sequence */ @@ -2506,7 +2505,6 @@ todo_wine { memset(&metrics, 0xcc, sizeof(metrics)); metrics.maxBidiReorderingDepth = 0; hr = IDWriteTextLayout_GetMetrics(layout, &metrics); -todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(metrics.left == 0.0, "got %.2f\n", metrics.left); ok(metrics.top == 0.0, "got %.2f\n", metrics.top); @@ -2515,9 +2513,10 @@ todo_wine { ok(metrics.height > 0.0, "got %.2f\n", metrics.height); ok(metrics.layoutWidth == 500.0, "got %.2f\n", metrics.layoutWidth); ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight); +todo_wine ok(metrics.maxBidiReorderingDepth > 1, "got %u\n", metrics.maxBidiReorderingDepth); ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount); -} + IDWriteTextLayout_Release(layout); IDWriteTextFormat_Release(format);
1
0
0
0
Jacek Caban : mshtml: Added support for binding XHR events.
by Alexandre Julliard
02 Jul '15
02 Jul '15
Module: wine Branch: master Commit: 8d85da757a7f1ab36d11078cb08ea84511190fd2 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=8d85da757a7f1ab36d11078cb…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Jul 1 17:38:17 2015 +0200 mshtml: Added support for binding XHR events. --- dlls/mshtml/htmlevent.c | 6 +- dlls/mshtml/htmlevent.h | 3 + dlls/mshtml/tests/xmlhttprequest.c | 2 +- dlls/mshtml/xmlhttprequest.c | 135 ++++++++++++++++++++++++++++++++++++- 4 files changed, 140 insertions(+), 6 deletions(-) diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 254b864..ad016b9 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -256,7 +256,7 @@ static eventid_t attr_to_eid(LPCWSTR str) return EVENTID_LAST; } -typedef struct { +struct HTMLEventObj { DispatchEx dispex; IHTMLEventObj IHTMLEventObj_iface; @@ -268,7 +268,7 @@ typedef struct { VARIANT return_value; BOOL prevent_default; BOOL cancel_bubble; -} HTMLEventObj; +}; static inline HTMLEventObj *impl_from_IHTMLEventObj(IHTMLEventObj *iface) { @@ -966,7 +966,7 @@ static BOOL is_cp_event(cp_static_data_t *data, DISPID dispid) return FALSE; } -static void call_event_handlers(HTMLDocumentNode *doc, HTMLEventObj *event_obj, EventTarget *event_target, +void call_event_handlers(HTMLDocumentNode *doc, HTMLEventObj *event_obj, EventTarget *event_target, ConnectionPointContainer *cp_container, eventid_t eid, IDispatch *this_obj) { event_target_t *data = get_event_target_data(event_target, FALSE); diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 4579617f..fefc749 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -67,6 +67,9 @@ HRESULT create_event_obj(IHTMLEventObj**) DECLSPEC_HIDDEN; void bind_target_event(HTMLDocumentNode*,EventTarget*,const WCHAR*,IDispatch*) DECLSPEC_HIDDEN; HRESULT ensure_doc_nsevent_handler(HTMLDocumentNode*,eventid_t) DECLSPEC_HIDDEN; +typedef struct HTMLEventObj HTMLEventObj; +void call_event_handlers(HTMLDocumentNode*,HTMLEventObj*,EventTarget*,ConnectionPointContainer*,eventid_t,IDispatch*); + void init_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN; void release_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN; void add_nsevent_listener(HTMLDocumentNode*,nsIDOMNode*,LPCWSTR) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/tests/xmlhttprequest.c b/dlls/mshtml/tests/xmlhttprequest.c index cf5f674..d3f682c 100644 --- a/dlls/mshtml/tests/xmlhttprequest.c +++ b/dlls/mshtml/tests/xmlhttprequest.c @@ -504,7 +504,7 @@ static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url) SET_EXPECT(xmlhttprequest_onreadystatechange_opened); hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty); ok(hres == S_OK, "open failed: %08x\n", hres); - todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); + CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); SysFreeString(method); SysFreeString(url); diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index 6f417a5..1432b2c 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -60,14 +60,117 @@ static HRESULT variant_to_nsastr(VARIANT var, nsAString *ret) } } -/* IHTMLXMLHttpRequest */ +typedef struct XMLHttpReqEventListener XMLHttpReqEventListener; + typedef struct { EventTarget event_target; IHTMLXMLHttpRequest IHTMLXMLHttpRequest_iface; LONG ref; nsIXMLHttpRequest *nsxhr; + XMLHttpReqEventListener *event_listener; } HTMLXMLHttpRequest; +struct XMLHttpReqEventListener { + nsIDOMEventListener nsIDOMEventListener_iface; + LONG ref; + HTMLXMLHttpRequest *xhr; +}; + +static void detach_xhr_event_listener(XMLHttpReqEventListener *event_listener) +{ + nsIDOMEventTarget *event_target; + nsAString str; + nsresult nsres; + + static const WCHAR readystatechangeW[] = + {'o','n','r','e','a','d','y','s','t','a','t','e','c','h','a','n','g','e',0}; + + nsres = nsIXMLHttpRequest_QueryInterface(event_listener->xhr->nsxhr, &IID_nsIDOMEventTarget, (void**)&event_target); + assert(nsres == NS_OK); + + nsAString_InitDepend(&str, readystatechangeW); + nsres = nsIDOMEventTarget_RemoveEventListener(event_target, &str, &event_listener->nsIDOMEventListener_iface, FALSE); + nsAString_Finish(&str); + nsIDOMEventTarget_Release(event_target); + + event_listener->xhr->event_listener = NULL; + event_listener->xhr = NULL; + nsIDOMEventListener_Release(&event_listener->nsIDOMEventListener_iface); +} + + +static inline XMLHttpReqEventListener *impl_from_nsIDOMEventListener(nsIDOMEventListener *iface) +{ + return CONTAINING_RECORD(iface, XMLHttpReqEventListener, nsIDOMEventListener_iface); +} + +static nsresult NSAPI XMLHttpReqEventListener_QueryInterface(nsIDOMEventListener *iface, + nsIIDRef riid, void **result) +{ + XMLHttpReqEventListener *This = impl_from_nsIDOMEventListener(iface); + + if(IsEqualGUID(&IID_nsISupports, riid)) { + TRACE("(%p)->(IID_nsISupports, %p)\n", This, result); + *result = &This->nsIDOMEventListener_iface; + }else if(IsEqualGUID(&IID_nsIDOMEventListener, riid)) { + TRACE("(%p)->(IID_nsIDOMEventListener %p)\n", This, result); + *result = &This->nsIDOMEventListener_iface; + }else { + *result = NULL; + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), result); + return NS_NOINTERFACE; + } + + nsIDOMEventListener_AddRef(&This->nsIDOMEventListener_iface); + return NS_OK; +} + +static nsrefcnt NSAPI XMLHttpReqEventListener_AddRef(nsIDOMEventListener *iface) +{ + XMLHttpReqEventListener *This = impl_from_nsIDOMEventListener(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static nsrefcnt NSAPI XMLHttpReqEventListener_Release(nsIDOMEventListener *iface) +{ + XMLHttpReqEventListener *This = impl_from_nsIDOMEventListener(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + assert(!This->xhr); + heap_free(This); + } + + return ref; +} + +static nsresult NSAPI XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener *iface, nsIDOMEvent *event) +{ + XMLHttpReqEventListener *This = impl_from_nsIDOMEventListener(iface); + + TRACE("(%p)\n", This); + + if(!This->xhr) + return NS_OK; + + call_event_handlers(NULL, NULL, &This->xhr->event_target, NULL, EVENTID_READYSTATECHANGE, + (IDispatch*)&This->xhr->IHTMLXMLHttpRequest_iface); + return NS_OK; +} + +static const nsIDOMEventListenerVtbl XMLHttpReqEventListenerVtbl = { + XMLHttpReqEventListener_QueryInterface, + XMLHttpReqEventListener_AddRef, + XMLHttpReqEventListener_Release, + XMLHttpReqEventListener_HandleEvent +}; + static inline HTMLXMLHttpRequest *impl_from_IHTMLXMLHttpRequest(IHTMLXMLHttpRequest *iface) { return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, IHTMLXMLHttpRequest_iface); @@ -115,6 +218,8 @@ static ULONG WINAPI HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) { + if(This->event_listener) + detach_xhr_event_listener(This->event_listener); release_dispex(&This->event_target.dispex); nsIXMLHttpRequest_Release(This->nsxhr); heap_free(This); @@ -357,10 +462,36 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface) static void HTMLXMLHttpRequest_bind_event(DispatchEx *dispex, int eid) { HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); + nsIDOMEventTarget *nstarget; + nsAString type_str; + nsresult nsres; + + static const WCHAR readystatechangeW[] = {'r','e','a','d','y','s','t','a','t','e','c','h','a','n','g','e',0}; - FIXME("(%p)\n", This); + TRACE("(%p)\n", This); assert(eid == EVENTID_READYSTATECHANGE); + + if(This->event_listener) + return; + + This->event_listener = heap_alloc(sizeof(*This->event_listener)); + if(!This->event_listener) + return; + + This->event_listener->nsIDOMEventListener_iface.lpVtbl = &XMLHttpReqEventListenerVtbl; + This->event_listener->ref = 1; + This->event_listener->xhr = This; + + nsres = nsIXMLHttpRequest_QueryInterface(This->nsxhr, &IID_nsIDOMEventTarget, (void**)&nstarget); + assert(nsres == NS_OK); + + nsAString_InitDepend(&type_str, readystatechangeW); + nsres = nsIDOMEventTarget_AddEventListener(nstarget, &type_str, &This->event_listener->nsIDOMEventListener_iface, FALSE, TRUE, 2); + nsAString_Finish(&type_str); + nsIDOMEventTarget_Release(nstarget); + if(NS_FAILED(nsres)) + ERR("AddEventListener failed: %08x\n", nsres); } static dispex_static_data_vtbl_t HTMLXMLHttpRequest_dispex_vtbl = {
1
0
0
0
Huw Davies : riched20: Free the script cache when updating the default style.
by Alexandre Julliard
01 Jul '15
01 Jul '15
Module: wine Branch: master Commit: 7a3c9889e38ede659230a66a167b82c024f0dc85 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=7a3c9889e38ede659230a66a1…
Author: Huw Davies <huw(a)codeweavers.com> Date: Wed Jul 1 10:48:56 2015 +0100 riched20: Free the script cache when updating the default style. --- dlls/riched20/run.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c index 38d0270..d76737a 100644 --- a/dlls/riched20/run.c +++ b/dlls/riched20/run.c @@ -776,6 +776,7 @@ void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod) style = ME_ApplyStyle(editor->pBuffer->pDefaultStyle, mod); editor->pBuffer->pDefaultStyle->fmt = style->fmt; editor->pBuffer->pDefaultStyle->tm = style->tm; + ScriptFreeCache( &editor->pBuffer->pDefaultStyle->script_cache ); ME_ReleaseStyle(style); ME_MarkAllForWrapping(editor); /* pcf = editor->pBuffer->pDefaultStyle->fmt; */
1
0
0
0
Dmitry Timoshkov : winex11: Don' t call ExcludeUpdateRgn for a window with WS_CLIPCHILDREN style.
by Alexandre Julliard
01 Jul '15
01 Jul '15
Module: wine Branch: master Commit: bd24842eba26573a4587d751adfbb8344eeac9b6 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=bd24842eba26573a4587d751a…
Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Mon Jun 29 17:54:07 2015 +0800 winex11: Don't call ExcludeUpdateRgn for a window with WS_CLIPCHILDREN style. --- dlls/winex11.drv/window.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 14dc44c..69f6446 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1335,7 +1335,13 @@ static void move_window_bits( HWND hwnd, Window window, const RECT *old_rect, co rgn = CreateRectRgnIndirect( &dst_rect ); SelectClipRgn( hdc_dst, rgn ); DeleteObject( rgn ); - ExcludeUpdateRgn( hdc_dst, hwnd ); + /* WS_CLIPCHILDREN doesn't exclude children from the window update + * region, and ExcludeUpdateRgn call may inappropriately clip valid + * child window contents from the copied parent window bits, but we + * still want to avoid copying invalid window bits when possible. + */ + if (!(GetWindowLongW( hwnd, GWL_STYLE ) & WS_CLIPCHILDREN )) + ExcludeUpdateRgn( hdc_dst, hwnd ); code = X11DRV_START_EXPOSURES; ExtEscape( hdc_dst, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
1
0
0
0
Dmitry Timoshkov : user32/tests: Add some tests to show that WS_CLIPCHILDREN doesn' t exclude children from update region.
by Alexandre Julliard
01 Jul '15
01 Jul '15
Module: wine Branch: master Commit: 55a78fd19be332eb920a240ed242b416346cd613 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=55a78fd19be332eb920a240ed…
Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Mon Jun 29 17:53:52 2015 +0800 user32/tests: Add some tests to show that WS_CLIPCHILDREN doesn't exclude children from update region. --- dlls/user32/tests/msg.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 831a56b..03f6b5c 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -6646,6 +6646,20 @@ static void test_paint_messages(void) RedrawWindow( hparent, NULL, 0, RDW_ERASENOW ); ok_sequence( WmEmptySeq, "WmChildPaintNc3", FALSE ); + /* WS_CLIPCHILDREN doesn't exclude children from update region */ + flush_sequence(); + RedrawWindow( hparent, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_NOCHILDREN ); + GetClientRect( hparent, &rect ); + SetRectRgn( hrgn, rect.left, rect.top, rect.right, rect.bottom ); + check_update_rgn( hparent, hrgn ); + flush_events(); + + RedrawWindow( hparent, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN ); + GetClientRect( hparent, &rect ); + SetRectRgn( hrgn, rect.left, rect.top, rect.right, rect.bottom ); + check_update_rgn( hparent, hrgn ); + flush_events(); + /* test RDW_INTERNALPAINT behavior */ flush_sequence();
1
0
0
0
Huw Davies : comctl32: Reset the string and lparam fields between notifications.
by Alexandre Julliard
01 Jul '15
01 Jul '15
Module: wine Branch: master Commit: eddfefa54fefc6464f4a5653b7b33b25905d7165 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=eddfefa54fefc6464f4a5653b…
Author: Huw Davies <huw(a)codeweavers.com> Date: Wed Jul 1 09:14:57 2015 +0100 comctl32: Reset the string and lparam fields between notifications. --- dlls/comctl32/tests/toolbar.c | 46 +++++++++++++++++++++++++++++++++++++++---- dlls/comctl32/toolbar.c | 5 +++-- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c index 022d727..bb2aed8 100644 --- a/dlls/comctl32/tests/toolbar.c +++ b/dlls/comctl32/tests/toolbar.c @@ -222,7 +222,17 @@ static LRESULT parent_wnd_notify(LPARAM lParam) restore->tbButton.iBitmap = 0; restore->tbButton.fsState = TBSTATE_ENABLED; restore->tbButton.fsStyle = 0; - restore->tbButton.iString = -1; + restore->tbButton.dwData = restore->iItem; + + if (restore->iItem == 0) + { + restore->tbButton.iString = (INT_PTR)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 8 ); + strcpy( (char *)restore->tbButton.iString, "foo" ); + } + else if (restore->iItem == 1) + restore->tbButton.iString = 2; + else + restore->tbButton.iString = -1; restore->pCurrent++; /* Altering cButtons after the 1st call makes no difference. */ @@ -2201,7 +2211,8 @@ static void test_save(void) LONG res; HKEY key; BYTE data[100]; - DWORD size = sizeof(data), type; + DWORD size = sizeof(data), type, i, count; + TBBUTTON tb; static const TBBUTTON more_btns[2] = { {0, 11, TBSTATE_HIDDEN, BTNS_BUTTON, {0}, 0, -1}, @@ -2211,6 +2222,20 @@ static void test_save(void) 9, 0xcafe0004, 11, 0xcafe0005, 13, 0xcafe0006, 0xffffffff, 0xcafe0007, 0xfffffffe, 0xcafe0008, 0x80000000, 0xcafe0009, 0x7fffffff, 0xcafe000a, 0x100, 0xcafe000b}; + static const TBBUTTON expect_btns[] = + { + {0, 1, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {0, 3, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 1, 2}, + {0, 5, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 2, 0}, + {0, 7, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 3, 0}, + {0, 9, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 4, 0}, + {0, 11, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 5, 0}, + {0, 13, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 6, 0}, + {0, 0, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 7, 0}, + {0, 0, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 8, 0}, + {0, 0, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 9, 0}, + {0, 0x7fffffff, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0xa, 0}, + }; params.hkr = HKEY_CURRENT_USER; params.pszSubKey = subkey; @@ -2239,8 +2264,21 @@ static void test_save(void) rebuild_toolbar( &wnd ); res = SendMessageW( wnd, TB_SAVERESTOREW, FALSE, (LPARAM)¶ms ); ok( res, "restoring failed\n" ); - res = SendMessageW( wnd, TB_BUTTONCOUNT, 0, 0 ); - ok( res == 11, "got %d\n", res ); + count = SendMessageW( wnd, TB_BUTTONCOUNT, 0, 0 ); + ok( count == sizeof(expect_btns) / sizeof(expect_btns[0]), "got %d\n", count ); + + for (i = 0; i < count; i++) + { + res = SendMessageW( wnd, TB_GETBUTTON, i, (LPARAM)&tb ); + ok( res, "got %d\n", res ); + + ok( tb.iBitmap == expect_btns[i].iBitmap, "%d: got %d\n", i, tb.iBitmap ); + ok( tb.idCommand == expect_btns[i].idCommand, "%d: got %d\n", i, tb.idCommand ); + ok( tb.fsState == expect_btns[i].fsState, "%d: got %02x\n", i, tb.fsState ); + ok( tb.fsStyle == expect_btns[i].fsStyle, "%d: got %02x\n", i, tb.fsStyle ); + ok( tb.dwData == expect_btns[i].dwData, "%d: got %lx\n", i, tb.dwData ); + ok( tb.iString == expect_btns[i].iString, "%d: got %lx\n", i, tb.iString ); + } DestroyWindow( wnd ); RegOpenKeyW( HKEY_CURRENT_USER, subkey, &key ); diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c index e1d2cdb..e816d49 100644 --- a/dlls/comctl32/toolbar.c +++ b/dlls/comctl32/toolbar.c @@ -4195,6 +4195,8 @@ TOOLBAR_Restore(TOOLBAR_INFO *infoPtr, const TBSAVEPARAMSW *lpSave) nmtbr.tbButton.iBitmap = -1; nmtbr.tbButton.fsState = 0; nmtbr.tbButton.fsStyle = 0; + nmtbr.tbButton.dwData = 0; + nmtbr.tbButton.iString = 0; if (*nmtbr.pCurrent & 0x80000000) { @@ -4211,8 +4213,7 @@ TOOLBAR_Restore(TOOLBAR_INFO *infoPtr, const TBSAVEPARAMSW *lpSave) TOOLBAR_SendNotify(&nmtbr.hdr, infoPtr, TBN_RESTORE); - /* can't contain real string as we don't know whether - * the client put an ANSI or Unicode string in there */ + /* All returned ptrs and -1 are ignored */ if (!IS_INTRESOURCE(nmtbr.tbButton.iString)) nmtbr.tbButton.iString = 0;
1
0
0
0
← Newer
1
...
49
50
51
52
53
54
55
56
57
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Results per page:
10
25
50
100
200