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
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
April 2006
----- 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
4 participants
512 discussions
Start a n
N
ew thread
Jacek Caban : mshtml.idl: Added HTMLDocumentEvents and HTMLDocumentEvents2 dispifaces.
by Alexandre Julliard
20 Apr '06
20 Apr '06
Module: wine Branch: refs/heads/master Commit: c355574d4f3a62ad8c678067ed7daa3d427310e5 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=c355574d4f3a62ad8c67806…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 19 21:13:20 2006 +0200 mshtml.idl: Added HTMLDocumentEvents and HTMLDocumentEvents2 dispifaces. --- include/mshtmdid.h | 208 +++++++++++++++++++++++++++++++++++++++++++ include/mshtml.idl | 253 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 460 insertions(+), 1 deletions(-) Diff:
http://source.winehq.org/git/?p=wine.git;a=commitdiff;h=c355574d4f3a62ad8c6…
1
0
0
0
Jeff Latimer : gdi: Added implementation of GetCharABCWidthsI.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: 07767bfd28ba6fc3a2e6a8af2e9fd76a4e9f3864 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=07767bfd28ba6fc3a2e6a8a…
Author: Jeff Latimer <lats(a)yless4u.com.au> Date: Wed Apr 19 19:20:50 2006 +1000 gdi: Added implementation of GetCharABCWidthsI. --- dlls/gdi/font.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ dlls/gdi/freetype.c | 38 +++++++++++++++++++++++++++++++++++++ dlls/gdi/gdi32.spec | 2 +- dlls/gdi/gdi_private.h | 2 ++ include/wingdi.h | 1 + 5 files changed, 91 insertions(+), 1 deletions(-) diff --git a/dlls/gdi/font.c b/dlls/gdi/font.c index adc7e97..7d8782a 100644 --- a/dlls/gdi/font.c +++ b/dlls/gdi/font.c @@ -2358,6 +2358,55 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, } +/****************************************************************************** + * GetCharABCWidthsI [GDI32.@] + * + * Retrieves widths of characters in range. + * + * PARAMS + * hdc [I] Handle of device context + * firstChar [I] First glyphs in range to query + * count [I] Last glyphs in range to query + * pgi [i] Array of glyphs to query + * abc [O] Address of character-width structure + * + * NOTES + * Only works with TrueType fonts + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI GetCharABCWidthsI( HDC hdc, UINT firstChar, UINT count, + LPWORD pgi, LPABC abc) +{ + DC *dc = DC_GetDCPtr(hdc); + unsigned int i; + BOOL ret = FALSE; + + if (!dc) return FALSE; + + if(dc->gdiFont) + ret = WineEngGetCharABCWidthsI( dc->gdiFont, firstChar, count, pgi, abc ); + else + FIXME(": stub\n"); + + if (ret) + { + /* convert device units to logical */ + for( i = firstChar; i <= count; i++, abc++ ) { + abc->abcA = INTERNAL_XDSTOWS(dc, abc->abcA); + abc->abcB = INTERNAL_XDSTOWS(dc, abc->abcB); + abc->abcC = INTERNAL_XDSTOWS(dc, abc->abcC); + } + ret = TRUE; + } + + GDI_ReleaseObj(hdc); + return ret; +} + + /*********************************************************************** * GetGlyphOutlineA (GDI32.@) */ diff --git a/dlls/gdi/freetype.c b/dlls/gdi/freetype.c index c0da05f..9546986 100644 --- a/dlls/gdi/freetype.c +++ b/dlls/gdi/freetype.c @@ -3809,6 +3809,44 @@ BOOL WineEngGetCharABCWidths(GdiFont fon } /************************************************************* + * WineEngGetCharABCWidthsI + * + */ +BOOL WineEngGetCharABCWidthsI(GdiFont font, UINT firstChar, UINT count, LPWORD pgi, + LPABC buffer) +{ + UINT c; + GLYPHMETRICS gm; + FT_UInt glyph_index; + GdiFont linked_font; + + if(!FT_IS_SCALABLE(font->ft_face)) + return FALSE; + + get_glyph_index_linked(font, 'a', &linked_font, &glyph_index); + if (!pgi) + for(c = firstChar; c < firstChar+count; c++) { + WineEngGetGlyphOutline(linked_font, c, GGO_METRICS | GGO_GLYPH_INDEX, + &gm, 0, NULL, NULL); + buffer[c - firstChar].abcA = linked_font->gm[c].lsb; + buffer[c - firstChar].abcB = linked_font->gm[c].bbx; + buffer[c - firstChar].abcC = linked_font->gm[c].adv - linked_font->gm[c].lsb + - linked_font->gm[c].bbx; + } + else + for(c = 0; c < count; c++) { + WineEngGetGlyphOutline(linked_font, pgi[c], GGO_METRICS | GGO_GLYPH_INDEX, + &gm, 0, NULL, NULL); + buffer[c].abcA = linked_font->gm[pgi[c]].lsb; + buffer[c].abcB = linked_font->gm[pgi[c]].bbx; + buffer[c].abcC = linked_font->gm[pgi[c]].adv + - linked_font->gm[pgi[c]].lsb - linked_font->gm[pgi[c]].bbx; + } + + return TRUE; +} + +/************************************************************* * WineEngGetTextExtentPoint * */ diff --git a/dlls/gdi/gdi32.spec b/dlls/gdi/gdi32.spec index c71adc6..59c748d 100644 --- a/dlls/gdi/gdi32.spec +++ b/dlls/gdi/gdi32.spec @@ -237,7 +237,7 @@ # @ stub GetBrushAttributes @ stdcall GetCharABCWidthsA(long long long ptr) @ stdcall GetCharABCWidthsFloatA(long long long ptr) @ stdcall GetCharABCWidthsFloatW(long long long ptr) -# @ stub GetCharABCWidthsI +@ stdcall GetCharABCWidthsI(long long long ptr ptr) @ stdcall GetCharABCWidthsW(long long long ptr) @ stdcall GetCharWidth32A(long long long long) @ stdcall GetCharWidth32W(long long long long) diff --git a/dlls/gdi/gdi_private.h b/dlls/gdi/gdi_private.h index dc85d35..dfdb008 100644 --- a/dlls/gdi/gdi_private.h +++ b/dlls/gdi/gdi_private.h @@ -367,6 +367,8 @@ extern BOOL WineEngDestroyFontInstance(H extern DWORD WineEngEnumFonts(LPLOGFONTW, FONTENUMPROCW, LPARAM); extern BOOL WineEngGetCharABCWidths(GdiFont font, UINT firstChar, UINT lastChar, LPABC buffer); +extern BOOL WineEngGetCharABCWidthsI(GdiFont font, UINT firstChar, + UINT count, LPWORD pgi, LPABC buffer); extern BOOL WineEngGetCharWidth(GdiFont, UINT, UINT, LPINT); extern DWORD WineEngGetFontData(GdiFont, DWORD, DWORD, LPVOID, DWORD); extern DWORD WineEngGetGlyphIndices(GdiFont font, LPCWSTR lpstr, INT count, diff --git a/include/wingdi.h b/include/wingdi.h index b4ea1b5..9375ff9 100644 --- a/include/wingdi.h +++ b/include/wingdi.h @@ -3394,6 +3394,7 @@ #define GetCharABCWidths WINELIB_NAM BOOL WINAPI GetCharABCWidthsFloatA(HDC,UINT,UINT,LPABCFLOAT); BOOL WINAPI GetCharABCWidthsFloatW(HDC,UINT,UINT,LPABCFLOAT); #define GetCharABCWidthsFloat WINELIB_NAME_AW(GetCharABCWidthsFloat) +BOOL WINAPI GetCharABCWidthsI(HDC,UINT,UINT,LPWORD,LPABC); DWORD WINAPI GetCharacterPlacementA(HDC,LPCSTR,INT,INT,GCP_RESULTSA*,DWORD); DWORD WINAPI GetCharacterPlacementW(HDC,LPCWSTR,INT,INT,GCP_RESULTSW*,DWORD); #define GetCharacterPlacement WINELIB_NAME_AW(GetCharacterPlacement)
1
0
0
0
Alexandre Julliard : server: Use the standard suspend mechanism to simulate a breakpoint
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: 17de8290966899eb664ecebd1113c8910dde71bc URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=17de8290966899eb664eceb…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Apr 19 19:45:39 2006 +0200 server: Use the standard suspend mechanism to simulate a breakpoint in an active process, instead of sending a SIGTRAP. --- server/context_alpha.c | 13 +++---------- server/context_i386.c | 13 +++---------- server/context_powerpc.c | 13 +++---------- server/context_sparc.c | 13 +++---------- server/context_x86_64.c | 13 +++---------- server/debugger.c | 30 +++++------------------------- server/process.c | 22 ++++++++++++++++++++++ server/process.h | 1 + server/thread.c | 19 +++++++++++++++++++ server/thread.h | 4 +++- 10 files changed, 65 insertions(+), 76 deletions(-) Diff:
http://source.winehq.org/git/?p=wine.git;a=commitdiff;h=17de8290966899eb664…
1
0
0
0
Alexandre Julliard : loader: Attempt to detect broken vmsplit setups.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: 6f38489f917f9f1385f3c4244d28d7ee23148eba URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=6f38489f917f9f1385f3c42…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Apr 19 19:28:33 2006 +0200 loader: Attempt to detect broken vmsplit setups. --- loader/glibc.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) diff --git a/loader/glibc.c b/loader/glibc.c index 4d15d5c..9aae1c1 100644 --- a/loader/glibc.c +++ b/loader/glibc.c @@ -21,8 +21,12 @@ #include "config.h" #include "wine/port.h" +#include <errno.h> #include <stdio.h> #include <stdlib.h> +#ifdef HAVE_SYS_MMAN_H +# include <sys/mman.h> +#endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif @@ -81,6 +85,18 @@ static const char *build_new_path( const return ret; } +static void check_vmsplit( void *stack ) +{ + if (stack < (void *)0x80000000) + { + /* if the stack is below 0x80000000, assume we can safely try a munmap there */ + if (munmap( (void *)0x80000000, 1 ) == -1 && errno == EINVAL) + fprintf( stderr, + "Warning: memory above 0x80000000 doesn't seem to be accessible.\n" + "Wine requires a 3G/1G user/kernel memory split to work properly.\n" ); + } +} + /********************************************************************** * main */ @@ -103,6 +119,7 @@ int main( int argc, char *argv[] ) loader = new_name; } + check_vmsplit( &argc ); wine_exec_wine_binary( NULL, argv, loader ); fprintf( stderr, "wine: could not exec %s\n", threads ); exit(1);
1
0
0
0
Mike Frysinger : joystick: Search for /dev/input/js as well as /dev/js.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: dd174c54e13e5d3cf27c396128d179dcbf1e5560 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=dd174c54e13e5d3cf27c396…
Author: Mike Frysinger <vapier(a)gentoo.org> Date: Tue Apr 18 18:58:44 2006 -0400 joystick: Search for /dev/input/js as well as /dev/js. --- dlls/dinput/joystick_linux.c | 26 ++++++++++++++++++-------- dlls/winmm/joystick/joystick.c | 8 ++++++-- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c index 13b8c77..6404da6 100644 --- a/dlls/dinput/joystick_linux.c +++ b/dlls/dinput/joystick_linux.c @@ -69,7 +69,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput); #ifdef HAVE_LINUX_22_JOYSTICK_API -#define JOYDEV "/dev/js" +#define JOYDEV_NEW "/dev/input/js" +#define JOYDEV_OLD "/dev/js" typedef struct { LONG lMin; @@ -148,6 +149,19 @@ static void _dump_DIDEVCAPS(LPDIDEVCAPS } } +static int joydev_get_device(char *dev, int id) +{ + int ret; + sprintf(dev, "%s%d", JOYDEV_NEW, id); + if ((ret = open(dev, O_RDONLY)) < 0) { + sprintf(dev, "%s%d", JOYDEV_OLD, id); + if ((ret = open(dev, O_RDONLY)) < 0) { + return -1; + } + } + return ret; +} + static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id) { int fd = -1; @@ -162,8 +176,7 @@ static BOOL joydev_enum_deviceA(DWORD dw ((dwDevType == DIDEVTYPE_JOYSTICK) && (version > 0x0300 && version < 0x0800)) || (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 0x0800))) { /* check whether we have a joystick */ - sprintf(dev, "%s%d", JOYDEV, id); - if ((fd = open(dev,O_RDONLY)) < 0) { + if ((fd = joydev_get_device(dev, id)) < 0) { WARN("open(%s,O_RDONLY) failed: %s\n", dev, strerror(errno)); return FALSE; } @@ -212,8 +225,7 @@ static BOOL joydev_enum_deviceW(DWORD dw ((dwDevType == DIDEVTYPE_JOYSTICK) && (version > 0x0300 && version < 0x0800)) || (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 0x0800))) { /* check whether we have a joystick */ - sprintf(dev, "%s%d", JOYDEV, id); - if ((fd = open(dev,O_RDONLY)) < 0) { + if ((fd = joydev_get_device(dev, id)) < 0) { WARN("open(%s,O_RDONLY) failed: %s\n", dev, strerror(errno)); return FALSE; } @@ -450,9 +462,7 @@ static HRESULT alloc_device(REFGUID rgui return DIERR_OUTOFMEMORY; } - sprintf(newDevice->dev, "%s%d", JOYDEV, rguid->Data3); - - if ((newDevice->joyfd = open(newDevice->dev,O_RDONLY)) < 0) { + if ((newDevice->joyfd = joydev_get_device(newDevice->dev, rguid->Data3)) < 0) { WARN("open(%s,O_RDONLY) failed: %s\n", newDevice->dev, strerror(errno)); HeapFree(GetProcessHeap(), 0, newDevice); return DIERR_DEVICENOTREG; diff --git a/dlls/winmm/joystick/joystick.c b/dlls/winmm/joystick/joystick.c index a5914e9..2e04e31 100644 --- a/dlls/winmm/joystick/joystick.c +++ b/dlls/winmm/joystick/joystick.c @@ -54,7 +54,8 @@ #include <linux/ioctl.h> #endif #ifdef HAVE_LINUX_JOYSTICK_H #include <linux/joystick.h> -#define JOYDEV "/dev/js%d" +#define JOYDEV_NEW "/dev/input/js%d" +#define JOYDEV_OLD "/dev/js%d" #endif #ifdef HAVE_SYS_ERRNO_H #include <sys/errno.h> @@ -166,12 +167,15 @@ static int JSTCK_OpenDevice(WINE_JSTCK* if (jstick->dev > 0) return jstick->dev; - sprintf(buf, JOYDEV, jstick->joyIntf); + sprintf(buf, JOYDEV_NEW, jstick->joyIntf); #ifdef HAVE_LINUX_22_JOYSTICK_API flags = O_RDONLY | O_NONBLOCK; #else flags = O_RDONLY; #endif + if ((jstick->dev = open(buf, flags)) < 0) { + sprintf(buf, JOYDEV_OLD, jstick->joyIntf); + } return (jstick->dev = open(buf, flags)); }
1
0
0
0
Ivan Gyurdiev : wined3d: Support for shift modifiers.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: 162d9cb6f429d3d1143b8057de95767106463d90 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=162d9cb6f429d3d1143b805…
Author: Ivan Gyurdiev <ivg2(a)cornell.edu> Date: Wed Apr 19 10:20:03 2006 -0400 wined3d: Support for shift modifiers. --- dlls/wined3d/pixelshader.c | 99 ++++++++++++++++++++------------------------ 1 files changed, 46 insertions(+), 53 deletions(-) diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index c2b37e2..b121f7b 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -1205,8 +1205,10 @@ #endif } else { - /* Common processing: [inst] [dst] [src]* */ - + /* Common processing: [inst] [dst]* [src]* */ + DWORD shift; + char output_rname[256]; + char output_wmask[20]; TRACE("Found opcode D3D:%s GL:%s, PARAMS:%d, \n", curOpcode->name, curOpcode->glname, curOpcode->num_params); @@ -1461,6 +1463,7 @@ #endif continue; } + /* Process modifiers */ if (0 != (*pToken & D3DSP_DSTMOD_MASK)) { DWORD mask = *pToken & D3DSP_DSTMOD_MASK; switch (mask) { @@ -1468,24 +1471,18 @@ #endif #if 0 /* as yet unhandled modifiers */ case D3DSPDM_CENTROID: centroid = TRUE; break; case D3DSPDM_PP: partialpresision = TRUE; break; - case D3DSPDM_X2: X2 = TRUE; break; - case D3DSPDM_X4: X4 = TRUE; break; - case D3DSPDM_X8: X8 = TRUE; break; - case D3DSPDM_D2: D2 = TRUE; break; - case D3DSPDM_D4: D4 = TRUE; break; - case D3DSPDM_D8: D8 = TRUE; break; #endif default: TRACE("_unhandled_modifier(0x%08lx)\n", mask); } } + shift = (*pToken & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT; /* Generate input and output registers */ if (curOpcode->num_params > 0) { char regs[5][50]; char operands[4][100]; char swzstring[20]; - int saturate = 0; char tmpOp[256]; /* Generate lines that handle input modifier computation */ @@ -1496,15 +1493,11 @@ #endif } } - /* Handle saturation only when no shift is present in the output modifier */ - if ((*pToken & D3DSPDM_SATURATE) && (0 == (*pToken & D3DSP_DSTSHIFT_MASK))) - saturate = 1; - /* Handle output register */ - get_register_name(*pToken, tmpOp, This->constants); - strcpy(operands[0], tmpOp); - get_write_mask(*pToken, tmpOp); - strcat(operands[0], tmpOp); + get_register_name(*pToken, output_rname, This->constants); + strcpy(operands[0], output_rname); + get_write_mask(*pToken, output_wmask); + strcat(operands[0], output_wmask); /* This function works because of side effects from gen_input_modifier_line */ /* Handle input registers */ @@ -1525,7 +1518,7 @@ #endif sprintf(tmpLine, "CMP%s %s, TMP, %s, %s;\n", (saturate ? "_SAT" : ""), operands[0], operands[2], operands[3]); break; default: - if (saturate) + if (saturate && (shift == 0)) strcat(tmpLine, "_SAT"); strcat(tmpLine, " "); strcat(tmpLine, operands[0]); @@ -1536,24 +1529,14 @@ #endif strcat(tmpLine,";\n"); } addline(&lineNum, pgmStr, &pgmLength, tmpLine); - pToken += curOpcode->num_params; - } -#if 0 /* I Think this isn't needed because the code above generates the input / output registers. */ - if (curOpcode->num_params > 0) { - DWORD param = *(pInstr + 1); - if (0 != (param & D3DSP_DSTSHIFT_MASK)) { - - /* Generate a line that handle the output modifier computation */ - char regstr[100]; - char write_mask[20]; - DWORD shift = (param & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT; - get_register_name(param, regstr, This->constants); - get_write_mask(param, write_mask); - gen_output_modifier_line(saturate, write_mask, shift, regstr, tmpLine); + + /* A shift requires another line. */ + if (shift != 0) { + gen_output_modifier_line(saturate, output_wmask, shift, output_rname, tmpLine); addline(&lineNum, pgmStr, &pgmLength, tmpLine); } + pToken += curOpcode->num_params; } -#endif } } /* TODO: What about result.depth? */ @@ -1597,6 +1580,31 @@ #if 1 /* if were using the data buffer o #endif } +inline static void pshader_program_dump_ins_modifiers(const DWORD output) { + + DWORD shift = (output & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT; + DWORD mmask = output & D3DSP_DSTMOD_MASK; + + switch (shift) { + case 0: break; + case 13: TRACE("_d8"); break; + case 14: TRACE("_d4"); break; + case 15: TRACE("_d2"); break; + case 1: TRACE("_x2"); break; + case 3: TRACE("_x4"); break; + case 7: TRACE("_x8"); break; + default: TRACE("_unhandled_shift(%ld)", shift); break; + } + + switch(mmask) { + case D3DSPDM_NONE: break; + case D3DSPDM_SATURATE: TRACE("_sat"); break; + case D3DSPDM_PARTIALPRECISION: TRACE("_pp"); break; + case D3DSPDM_MSAMPCENTROID: TRACE("_centroid"); break; + default: TRACE("_unhandled_modifier(%#lx)", mmask); break; + } +} + inline static void pshader_program_dump_ps_param(const DWORD param, int input) { static const char* rastout_reg_names[] = { "oC0", "oC1", "oC2", "oC3", "oDepth" }; static const char swizzle_reg_chars[] = "rgba"; @@ -1660,25 +1668,8 @@ #define EXTENDED_REG 0x1800 } if (!input) { - /** operand output */ - /** - * for better debugging traces it's done into opcode dump code - * @see pshader_program_dump_opcode - if (0 != (param & D3DSP_DSTMOD_MASK)) { - DWORD mask = param & D3DSP_DSTMOD_MASK; - switch (mask) { - case D3DSPDM_SATURATE: TRACE("_sat"); break; - default: - TRACE("_unhandled_modifier(0x%08lx)", mask); - } - } - if (0 != (param & D3DSP_DSTSHIFT_MASK)) { - DWORD shift = (param & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT; - if (shift > 0) { - TRACE("_x%u", 1 << shift); - } - } - */ + /* operand output (for modifiers and shift, see dump_ins_modifiers) */ + if ((param & D3DSP_WRITEMASK_ALL) != D3DSP_WRITEMASK_ALL) { TRACE("."); if (param & D3DSP_WRITEMASK_0) TRACE(".r"); @@ -1857,8 +1848,10 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_S ++pToken; ++len; } else { - TRACE("%s ", curOpcode->name); + TRACE("%s", curOpcode->name); if (curOpcode->num_params > 0) { + pshader_program_dump_ins_modifiers(*pToken); + TRACE(" "); pshader_program_dump_ps_param(*pToken, 0); ++pToken; ++len;
1
0
0
0
Ivan Gyurdiev : wined3d: Support more than 4/6 tex/temp registers.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: 70fc78b64e6f06cbdd8e271517a6693c641fa51e URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=70fc78b64e6f06cbdd8e271…
Author: Ivan Gyurdiev <ivg2(a)cornell.edu> Date: Wed Apr 19 10:17:24 2006 -0400 wined3d: Support more than 4/6 tex/temp registers. --- dlls/wined3d/pixelshader.c | 104 +++++++++++++++++++++++++++++++++++++++----- 1 files changed, 92 insertions(+), 12 deletions(-) diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index c7c9884..c2b37e2 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -955,6 +955,64 @@ inline static int gen_input_modifier_lin return insert_line; } + +inline static void pshader_program_get_registers_used( + IWineD3DPixelShaderImpl *This, + CONST DWORD* pToken, DWORD* tempsUsed, DWORD* texUsed) { + + if (pToken == NULL) + return; + + *tempsUsed = 0; + *texUsed = 0; + + while (D3DVS_END() != *pToken) { + CONST SHADER_OPCODE* curOpcode; + + /* Skip version */ + if (pshader_is_version_token(*pToken)) { + ++pToken; + continue; + + /* Skip comments */ + } else if (pshader_is_comment_token(*pToken)) { + DWORD comment_len = (*pToken & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT; + ++pToken; + pToken += comment_len; + continue; + } + + /* Fetch opcode */ + curOpcode = pshader_program_get_opcode(This, *pToken); + ++pToken; + + /* Skip declarations (for now) */ + if (D3DSIO_DCL == curOpcode->opcode) { + pToken += curOpcode->num_params; + continue; + + /* Skip definitions (for now) */ + } else if (D3DSIO_DEF == curOpcode->opcode) { + pToken += curOpcode->num_params; + continue; + + /* Set texture registers, and temporary registers */ + } else { + int i; + + for (i = 0; i < curOpcode->num_params; ++i) { + DWORD regtype = (((*pToken) & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT); + DWORD reg = (*pToken) & D3DSP_REGNUM_MASK; + if (D3DSPR_TEXTURE == regtype) + *texUsed |= (1 << reg); + if (D3DSPR_TEMP == regtype) + *tempsUsed |= (1 << reg); + ++pToken; + } + } + } +} + /* NOTE: A description of how to parse tokens can be found at
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/graphics/h…
*/ inline static VOID IWineD3DPixelShaderImpl_GenerateProgramArbHW(IWineD3DPixelShader *iface, CONST DWORD *pFunction) { IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; @@ -977,6 +1035,9 @@ #endif /* Keep a running length for pgmStr so that we don't have to caculate strlen every time we concatanate */ unsigned int pgmLength = 0; + /* Keep bitmaps of used temporary and texture registers */ + DWORD tempsUsed, texUsed; + #if 0 /* FIXME: Use the buffer that is held by the device, this is ok since fixups will be skipped for software shaders it also requires entering a critical section but cuts down the runtime footprint of wined3d and any memory fragmentation that may occur... */ if (This->device->fixupVertexBufferSize < PGMSIZE) { @@ -990,11 +1051,17 @@ #else pgmStr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, PGMSIZE); /* 64kb should be enough */ #endif - /* TODO: Think about using a first pass to work out what's required for the second pass. */ for(i = 0; i < WINED3D_PSHADER_MAX_CONSTANTS; i++) This->constants[i] = 0; + /* First pass: figure out which temporary and texture registers are used */ + pshader_program_get_registers_used(This, pToken, &tempsUsed, &texUsed); + TRACE("Texture registers used: %#lx, Temp registers used %#lx\n", texUsed, tempsUsed); + + /* TODO: check register usage against GL/Directx limits, and fail if they're exceeded */ + + /* Second pass, process opcodes */ if (NULL != pToken) { while (D3DPS_END() != *pToken) { #if 0 /* For pixel and vertex shader versions 2_0 and later, bits 24 through 27 specify the size in DWORDs of the instruction */ @@ -1005,6 +1072,7 @@ #endif if (pshader_is_version_token(*pToken)) { /** version */ int numTemps; int numConstants; + int numTex; /* Extract version *10 into integer value (ie. 1.0 == 10, 1.1==11 etc */ version = (((*pToken >> 8) & 0x0F) * 10) + (*pToken & 0x0F); @@ -1016,21 +1084,28 @@ #endif case 10: case 11: case 12: - case 13: + case 13:numTemps=12; + numConstants=8; + numTex=4; + break; case 14: numTemps=12; numConstants=8; + numTex=6; break; case 20: numTemps=12; numConstants=8; + numTex=8; FIXME("No work done yet to support ps2.0 in hw\n"); break; case 30: numTemps=32; numConstants=8; + numTex=0; FIXME("No work done yet to support ps3.0 in hw\n"); break; default: numTemps=12; numConstants=8; + numTex=8; FIXME("Unrecognized pixel shader version!\n"); } @@ -1038,15 +1113,18 @@ #endif strcpy(tmpLine, "!!ARBfp1.0\n"); addline(&lineNum, pgmStr, &pgmLength, tmpLine); - /* TODO: find out how many registers are really needed */ - for(i = 0; i < 6; i++) { - sprintf(tmpLine, "TEMP T%lu;\n", i); - addline(&lineNum, pgmStr, &pgmLength, tmpLine); + for(i = 0; i < numTex; i++) { + if (texUsed & (1 << i)) { + sprintf(tmpLine, "TEMP T%lu;\n", i); + addline(&lineNum, pgmStr, &pgmLength, tmpLine); + } } - for(i = 0; i < 6; i++) { - sprintf(tmpLine, "TEMP R%lu;\n", i); - addline(&lineNum, pgmStr, &pgmLength, tmpLine); + for(i = 0; i < numTemps; i++) { + if (tempsUsed & (1 << i)) { + sprintf(tmpLine, "TEMP R%lu;\n", i); + addline(&lineNum, pgmStr, &pgmLength, tmpLine); + } } sprintf(tmpLine, "TEMP TMP;\n"); @@ -1067,9 +1145,11 @@ #endif strcpy(tmpLine, "PARAM one = { 1.0, 1.0, 1.0, 1.0 };\n"); addline(&lineNum, pgmStr, &pgmLength, tmpLine); - for(i = 0; i < 4; i++) { - sprintf(tmpLine, "MOV T%lu, fragment.texcoord[%lu];\n", i, i); - addline(&lineNum, pgmStr, &pgmLength, tmpLine); + for(i = 0; i < numTex; i++) { + if (texUsed & (1 << i)) { + sprintf(tmpLine, "MOV T%lu, fragment.texcoord[%lu];\n", i, i); + addline(&lineNum, pgmStr, &pgmLength, tmpLine); + } } ++pToken;
1
0
0
0
Mikołaj Zalewski : comctl32: Test the HDM_SETITEM notifications.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: d848dda8bc2aeecc8c8f44b6f6cda6648ea8d156 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=d848dda8bc2aeecc8c8f44b…
Author: Mikołaj Zalewski <mikolaj(a)zalewski.pl> Date: Wed Apr 19 14:38:40 2006 +0200 comctl32: Test the HDM_SETITEM notifications. --- dlls/comctl32/tests/header.c | 163 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 153 insertions(+), 10 deletions(-) diff --git a/dlls/comctl32/tests/header.c b/dlls/comctl32/tests/header.c index 868258f..87dec21 100644 --- a/dlls/comctl32/tests/header.c +++ b/dlls/comctl32/tests/header.c @@ -24,9 +24,37 @@ #include <assert.h> #include "wine/test.h" +typedef struct tagEXPECTEDNOTIFY +{ + INT iCode; + BOOL fUnicode; + HDITEMA hdItem; +} EXPECTEDNOTIFY; + +EXPECTEDNOTIFY expectedNotify[10]; +INT nExpectedNotify = 0; +INT nReceivedNotify = 0; + static HWND hHeaderParentWnd; +static HWND hWndHeader; #define MAX_CHARS 100 +static void expect_notify(INT iCode, BOOL fUnicode, HDITEMA *lpItem) +{ + assert(nExpectedNotify < 10); + expectedNotify[nExpectedNotify].iCode = iCode; + expectedNotify[nExpectedNotify].fUnicode = fUnicode; + expectedNotify[nExpectedNotify].hdItem = *lpItem; + nExpectedNotify++; +} + +static BOOL notifies_received() +{ + BOOL fRet = (nExpectedNotify == nReceivedNotify); + nExpectedNotify = nReceivedNotify = 0; + return fRet; +} + static LONG addItem(HWND hdex, int idx, LPCSTR text) { HDITEMA hdItem; @@ -37,13 +65,41 @@ static LONG addItem(HWND hdex, int idx, return (LONG)SendMessage(hdex, HDM_INSERTITEMA, (WPARAM)idx, (LPARAM)&hdItem); } -static LONG setItem(HWND hdex, int idx, LPCSTR text) +static LONG setItem(HWND hdex, int idx, LPCSTR text, BOOL fCheckNotifies) { + LONG ret; HDITEMA hdexItem; hdexItem.mask = HDI_TEXT; hdexItem.pszText = (LPSTR)text; hdexItem.cchTextMax = 0; - return (LONG)SendMessage(hdex, HDM_SETITEMA, (WPARAM)idx, (LPARAM)&hdexItem); + if (fCheckNotifies) + { + expect_notify(HDN_ITEMCHANGINGA, FALSE, &hdexItem); + expect_notify(HDN_ITEMCHANGEDA, FALSE, &hdexItem); + } + ret = (LONG)SendMessage(hdex, HDM_SETITEMA, (WPARAM)idx, (LPARAM)&hdexItem); + if (fCheckNotifies) + ok(notifies_received(), "setItem(): not all expected notifies were received\n"); + return ret; +} + +static LONG setItemUnicodeNotify(HWND hdex, int idx, LPCSTR text, LPCWSTR wText) +{ + LONG ret; + HDITEMA hdexItem; + HDITEMW hdexNotify; + hdexItem.mask = HDI_TEXT; + hdexItem.pszText = (LPSTR)text; + hdexItem.cchTextMax = 0; + + hdexNotify.mask = HDI_TEXT; + hdexNotify.pszText = (LPWSTR)wText; + + expect_notify(HDN_ITEMCHANGINGW, TRUE, (HDITEMA*)&hdexNotify); + expect_notify(HDN_ITEMCHANGEDW, TRUE, (HDITEMA*)&hdexNotify); + ret = (LONG)SendMessage(hdex, HDM_SETITEMA, (WPARAM)idx, (LPARAM)&hdexItem); + ok(notifies_received(), "setItemUnicodeNotify(): not all expected notifies were received\n"); + return ret; } static LONG delItem(HWND hdex, int idx) @@ -91,8 +147,40 @@ static HWND create_header_control (void) return handle; } +static void compare_items(INT iCode, HDITEMA *hdi1, HDITEMA *hdi2, BOOL fUnicode) +{ + ok(hdi1->mask == hdi2->mask, "Notify %d mask mismatch (%08x != %08x)\n", iCode, hdi1->mask, hdi2->mask); + if (hdi1->mask & HDI_WIDTH) + { + ok(hdi1->cxy == hdi2->cxy, "Notify %d cxy mismatch (%08x != %08x)\n", iCode, hdi1->cxy, hdi2->cxy); + } + if (hdi1->mask & HDI_TEXT) + { + if (fUnicode) + { + char buf1[260]; + char buf2[260]; + WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)hdi1->pszText, -1, buf1, 260, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)hdi2->pszText, -1, buf2, 260, NULL, NULL); + ok(lstrcmpW((LPWSTR)hdi1->pszText, (LPWSTR)hdi2->pszText)==0, + "Notify %d text mismatch (L\"%s\" vs L\"%s\")\n", + iCode, buf1, buf2); + } + else + { + ok(strcmp(hdi1->pszText, hdi2->pszText)==0, + "Notify %d text mismatch (\"%s\" vs \"%s\")\n", + iCode, hdi1->pszText, hdi2->pszText); + } + } +} + static const char *str_items[] = {"First Item", "Second Item", "Third Item", "Fourth Item", "Replace Item", "Out Of Range Item"}; + +static const char pszUniTestA[] = "TST"; +static const WCHAR pszUniTestW[] = {'T','S','T',0}; + #define TEST_GET_ITEM(i,c)\ { res = getItem(hWndHeader, i, buffer);\ @@ -107,7 +195,6 @@ #define TEST_GET_ITEMCOUNT(i)\ static void test_header_control (void) { - HWND hWndHeader; LONG res; static char buffer[MAX_CHARS]; int i; @@ -145,21 +232,26 @@ static void test_header_control (void) } TEST_GET_ITEMCOUNT(6); - res=setItem(hWndHeader, 99, str_items[5]); + res=setItem(hWndHeader, 99, str_items[5], FALSE); ok(res == 0, "Setting Out of Range item should fail with 0 (%ld)\n", res); - res=setItem(hWndHeader, 5, str_items[5]); + res=setItem(hWndHeader, 5, str_items[5], TRUE); ok(res == 1, "Setting Out of Range item should fail with 1 (%ld)\n", res); - res=setItem(hWndHeader, -2, str_items[5]); + res=setItem(hWndHeader, -2, str_items[5], FALSE); ok(res == 0, "Setting Out of Range item should fail with 0 (%ld)\n", res); TEST_GET_ITEMCOUNT(6); for (i = 0; i < 4; i++) { - res = setItem(hWndHeader, i, str_items[4]); + res = setItem(hWndHeader, i, str_items[4], TRUE); ok(res != 0, "Setting %d item failed (%ld)\n", i+1, res); TEST_GET_ITEM(i, 4); TEST_GET_ITEMCOUNT(6); } + + SendMessageA(hWndHeader, HDM_SETUNICODEFORMAT, (WPARAM)TRUE, 0); + setItemUnicodeNotify(hWndHeader, 3, pszUniTestA, pszUniTestW); + SendMessageA(hWndHeader, WM_NOTIFYFORMAT, (WPARAM)hHeaderParentWnd, (LPARAM)NF_REQUERY); + setItem(hWndHeader, 3, str_items[4], TRUE); res = delItem(hWndHeader, 5); ok(res == 1, "Deleting Out of Range item should fail with 1 (%ld)\n", res); @@ -183,16 +275,67 @@ static void test_header_control (void) DestroyWindow(hWndHeader); } -START_TEST(header) + +LRESULT CALLBACK HeaderTestWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { + switch(msg) { + + case WM_NOTIFY: + { + NMHEADERA *hdr = (NMHEADER *)lParam; + EXPECTEDNOTIFY *expected; + + if (nReceivedNotify >= nExpectedNotify || hdr->hdr.hwndFrom != hWndHeader ) + break; + + expected = &expectedNotify[nReceivedNotify]; + if (hdr->hdr.code != expected->iCode) + break; + + nReceivedNotify++; + compare_items(hdr->hdr.code, &expected->hdItem, hdr->pitem, expected->fUnicode); + break; + } + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProcA(hWnd, msg, wParam, lParam); + } + + return 0L; +} + +static void init(void) { + WNDCLASSA wc; INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_USEREX_CLASSES; InitCommonControlsEx(&icex); - hHeaderParentWnd = CreateWindowExA(0, "static", "Header test", WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, 480, 100, NULL, NULL, NULL, 0); + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = GetModuleHandleA(NULL); + wc.hIcon = NULL; + wc.hCursor = LoadCursorA(NULL, MAKEINTRESOURCEA(IDC_ARROW)); + wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); + wc.lpszMenuName = NULL; + wc.lpszClassName = "HeaderTestClass"; + wc.lpfnWndProc = HeaderTestWndProc; + RegisterClassA(&wc); + + hHeaderParentWnd = CreateWindowExA(0, "HeaderTestClass", "Header test", WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, 680, 260, NULL, NULL, GetModuleHandleA(NULL), 0); assert(hHeaderParentWnd != NULL); +} + +START_TEST(header) +{ + init(); test_header_control();
1
0
0
0
Mikołaj Zalewski : comctl32: header: Send correct notify after HDM_SETITEM.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: 50d8c80fda3a8b9b28bc229a694ed499d4a55b40 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=50d8c80fda3a8b9b28bc229…
Author: Mikołaj Zalewski <mikolaj(a)zalewski.pl> Date: Wed Apr 19 14:36:57 2006 +0200 comctl32: header: Send correct notify after HDM_SETITEM. The HDN_ITEMCHANGING notify should have the new data instead of the old one. Both HDN_ITEMCHANGING and HDN_ITEMCHANGED now have the text field if it changed. --- dlls/comctl32/header.c | 107 ++++++++++++++++++++++++++++++++++++------------ 1 files changed, 81 insertions(+), 26 deletions(-) diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c index 9f856cf..5cfb811 100644 --- a/dlls/comctl32/header.c +++ b/dlls/comctl32/header.c @@ -568,6 +568,44 @@ HEADER_DrawTrackLine (HWND hwnd, HDC hdc SelectObject (hdc, hOldPen); } +/*** + * DESCRIPTION: + * Convert a HDITEM into the correct format (ANSI/Unicode) to send it in a notify + * + * PARAMETER(S): + * [I] infoPtr : the header that wants to send the notify + * [O] dest : The buffer to store the HDITEM for notify. It may be set to a HDITEMA of HDITEMW + * [I] src : The source HDITEM. It may be a HDITEMA or HDITEMW + * [I] fSourceUnicode : is src a HDITEMW or HDITEMA + * [O] ppvScratch : a pointer to a scratch buffer that needs to be freed after + * the HDITEM is no longer in use or NULL if none was needed + * + * NOTE: We depend on HDITEMA and HDITEMW having the same structure + */ +static void HEADER_CopyHDItemForNotify(HEADER_INFO *infoPtr, HDITEMW *dest, + HDITEMW *src, BOOL fSourceUnicode, LPVOID *ppvScratch) +{ + *ppvScratch = NULL; + *dest = *src; + + if (src->mask & HDI_TEXT && src->pszText != LPSTR_TEXTCALLBACKW) /* covers TEXTCALLBACKA as well */ + { + if (fSourceUnicode && infoPtr->nNotifyFormat != NFR_UNICODE) + { + dest->pszText = NULL; + Str_SetPtrWtoA((LPSTR *)&dest->pszText, src->pszText); + *ppvScratch = dest->pszText; + } + + if (!fSourceUnicode && infoPtr->nNotifyFormat == NFR_UNICODE) + { + dest->pszText = NULL; + Str_SetPtrAtoW(&dest->pszText, (LPSTR)src->pszText); + *ppvScratch = dest->pszText; + } + } +} + static UINT HEADER_NotifyCodeWtoA(UINT code) { /* we use the fact that all the unicode messages are in HDN_FIRST_UNICODE..HDN_LAST*/ @@ -592,29 +630,38 @@ HEADER_SendSimpleNotify (HWND hwnd, UINT } static BOOL -HEADER_SendHeaderNotifyT (HWND hwnd, UINT code, INT iItem, INT mask) +HEADER_SendHeaderNotifyT (HWND hwnd, UINT code, INT iItem, INT mask, HDITEMW *lpItem) { HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd); - NMHEADERA nmhdr; - HDITEMA nmitem; + NMHEADERW nmhdr; + HDITEMW nmitem; + + if (lpItem == NULL) + { + /* lpItem == NULL means that we should take the actual data from the item */ + if (mask & HDI_TEXT) + { + FIXME("(): invalid parameters - lpItem == NULL and (mask & HDI_TEXT)\n"); + mask &= ~HDI_TEXT; + } + nmitem.mask = mask; + nmitem.cxy = infoPtr->items[iItem].cxy; + nmitem.hbm = infoPtr->items[iItem].hbm; + nmitem.pszText = NULL; + nmitem.cchTextMax = 0; + nmitem.fmt = infoPtr->items[iItem].fmt; + nmitem.lParam = infoPtr->items[iItem].lParam; + nmitem.iOrder = infoPtr->items[iItem].iOrder; + nmitem.iImage = infoPtr->items[iItem].iImage; + lpItem = &nmitem; + } nmhdr.hdr.hwndFrom = hwnd; nmhdr.hdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID); nmhdr.hdr.code = (infoPtr->nNotifyFormat == NFR_UNICODE ? code : HEADER_NotifyCodeWtoA(code)); nmhdr.iItem = iItem; nmhdr.iButton = 0; - nmhdr.pitem = &nmitem; - nmitem.mask = mask; - nmitem.cxy = infoPtr->items[iItem].cxy; - nmitem.hbm = infoPtr->items[iItem].hbm; - nmitem.pszText = NULL; - nmitem.cchTextMax = 0; -/* nmitem.pszText = infoPtr->items[iItem].pszText; */ -/* nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax; */ - nmitem.fmt = infoPtr->items[iItem].fmt; - nmitem.lParam = infoPtr->items[iItem].lParam; - nmitem.iOrder = infoPtr->items[iItem].iOrder; - nmitem.iImage = infoPtr->items[iItem].iImage; + nmhdr.pitem = lpItem; return (BOOL)SendMessageW (infoPtr->hwndNotify, WM_NOTIFY, (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr); @@ -1159,6 +1206,8 @@ HEADER_SetItemT (HWND hwnd, INT nItem, L { HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd); HEADER_ITEM *lpItem; + HDITEMW hdNotify; + void *pvScratch; if (phdi == NULL) return FALSE; @@ -1167,8 +1216,12 @@ HEADER_SetItemT (HWND hwnd, INT nItem, L TRACE("[nItem=%d]\n", nItem); - if (HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMCHANGINGW, nItem, phdi->mask)) + HEADER_CopyHDItemForNotify(infoPtr, &hdNotify, phdi, bUnicode, &pvScratch); + if (HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMCHANGINGW, nItem, phdi->mask, &hdNotify)) + { + if (pvScratch) Free(pvScratch); return FALSE; + } lpItem = &infoPtr->items[nItem]; if (phdi->mask & HDI_BITMAP) @@ -1245,12 +1298,14 @@ HEADER_SetItemT (HWND hwnd, INT nItem, L } } - HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMCHANGEDW, nItem, phdi->mask); + HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMCHANGEDW, nItem, phdi->mask, &hdNotify); HEADER_SetItemBounds (hwnd); InvalidateRect(hwnd, NULL, FALSE); + if (pvScratch != NULL) + Free(pvScratch); return TRUE; } @@ -1361,9 +1416,9 @@ HEADER_LButtonDblClk (HWND hwnd, WPARAM HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); if ((GetWindowLongW (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER)) - HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMDBLCLICKW, nItem,0); + HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMDBLCLICKW, nItem, 0, NULL); else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) - HEADER_SendHeaderNotifyT (hwnd, HDN_DIVIDERDBLCLICKW, nItem,0); + HEADER_SendHeaderNotifyT (hwnd, HDN_DIVIDERDBLCLICKW, nItem, 0, NULL); return 0; } @@ -1399,7 +1454,7 @@ HEADER_LButtonDown (HWND hwnd, WPARAM wP TRACE("Pressed item %d!\n", nItem); } else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) { - if (!(HEADER_SendHeaderNotifyT (hwnd, HDN_BEGINTRACKW, nItem,0))) { + if (!(HEADER_SendHeaderNotifyT (hwnd, HDN_BEGINTRACKW, nItem, 0, NULL))) { SetCapture (hwnd); infoPtr->bCaptured = TRUE; infoPtr->bTracking = TRUE; @@ -1474,7 +1529,7 @@ HEADER_LButtonUp (HWND hwnd, WPARAM wPar TRACE("End tracking item %d!\n", infoPtr->iMoveItem); infoPtr->bTracking = FALSE; - HEADER_SendHeaderNotifyT (hwnd, HDN_ENDTRACKW, infoPtr->iMoveItem,HDI_WIDTH); + HEADER_SendHeaderNotifyT (hwnd, HDN_ENDTRACKW, infoPtr->iMoveItem, HDI_WIDTH, NULL); if (!(dwStyle & HDS_FULLDRAG)) { hdc = GetDC (hwnd); @@ -1482,7 +1537,7 @@ HEADER_LButtonUp (HWND hwnd, WPARAM wPar ReleaseDC (hwnd, hdc); } - if (HEADER_SendHeaderNotifyT(hwnd, HDN_ITEMCHANGINGW, infoPtr->iMoveItem, HDI_WIDTH)) + if (HEADER_SendHeaderNotifyT(hwnd, HDN_ITEMCHANGINGW, infoPtr->iMoveItem, HDI_WIDTH, NULL)) { infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; } @@ -1495,7 +1550,7 @@ HEADER_LButtonUp (HWND hwnd, WPARAM wPar HEADER_SetItemBounds (hwnd); InvalidateRect(hwnd, NULL, TRUE); - HEADER_SendHeaderNotifyT(hwnd, HDN_ITEMCHANGEDW, infoPtr->iMoveItem, HDI_WIDTH); + HEADER_SendHeaderNotifyT(hwnd, HDN_ITEMCHANGEDW, infoPtr->iMoveItem, HDI_WIDTH, NULL); } if (infoPtr->bCaptured) { @@ -1588,13 +1643,13 @@ HEADER_MouseMove (HWND hwnd, WPARAM wPar } else if (infoPtr->bTracking) { if (dwStyle & HDS_FULLDRAG) { - if (!HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMCHANGINGW, infoPtr->iMoveItem, HDI_WIDTH)) + if (!HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMCHANGINGW, infoPtr->iMoveItem, HDI_WIDTH, NULL)) { nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset; if (nWidth < 0) nWidth = 0; infoPtr->items[infoPtr->iMoveItem].cxy = nWidth; - HEADER_SendHeaderNotifyT(hwnd, HDN_ITEMCHANGEDW, infoPtr->iMoveItem, HDI_WIDTH); + HEADER_SendHeaderNotifyT(hwnd, HDN_ITEMCHANGEDW, infoPtr->iMoveItem, HDI_WIDTH, NULL); } HEADER_SetItemBounds (hwnd); InvalidateRect(hwnd, NULL, FALSE); @@ -1609,7 +1664,7 @@ HEADER_MouseMove (HWND hwnd, WPARAM wPar infoPtr->xOldTrack - infoPtr->items[infoPtr->iMoveItem].rect.left; HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); ReleaseDC (hwnd, hdc); - HEADER_SendHeaderNotifyT (hwnd, HDN_TRACKW, infoPtr->iMoveItem, HDI_WIDTH); + HEADER_SendHeaderNotifyT (hwnd, HDN_TRACKW, infoPtr->iMoveItem, HDI_WIDTH, NULL); } TRACE("Tracking item %d!\n", infoPtr->iMoveItem);
1
0
0
0
Mikołaj Zalewski : comctl32: Add Str_SetPtrWtoA analogue to Str_SetPtrAtoW.
by Alexandre Julliard
19 Apr '06
19 Apr '06
Module: wine Branch: refs/heads/master Commit: c5b27fa97b4e9412f8a0483ff3b16e25b606f437 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=c5b27fa97b4e9412f8a0483…
Author: Mikołaj Zalewski <mikolaj(a)zalewski.pl> Date: Wed Apr 19 14:34:14 2006 +0200 comctl32: Add Str_SetPtrWtoA analogue to Str_SetPtrAtoW. --- dlls/comctl32/comctl32.h | 1 + dlls/comctl32/comctl32undoc.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 0 deletions(-) diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h index 8053acc..005089d 100644 --- a/dlls/comctl32/comctl32.h +++ b/dlls/comctl32/comctl32.h @@ -145,6 +145,7 @@ VOID COMCTL32_RefreshSysColors(void); void COMCTL32_DrawInsertMark(HDC hDC, const RECT *lpRect, COLORREF clrInsertMark, BOOL bHorizontal); INT Str_GetPtrWtoA (LPCWSTR lpSrc, LPSTR lpDest, INT nMaxLen); BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc); +BOOL Str_SetPtrWtoA (LPSTR *lppDest, LPCWSTR lpSrc); #define COMCTL32_VERSION_MINOR 80 #define WINE_FILEVERSION 5, COMCTL32_VERSION_MINOR, 0, 0 diff --git a/dlls/comctl32/comctl32undoc.c b/dlls/comctl32/comctl32undoc.c index 2812e34..e678cad 100644 --- a/dlls/comctl32/comctl32undoc.c +++ b/dlls/comctl32/comctl32undoc.c @@ -1107,6 +1107,46 @@ BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LP return TRUE; } +/************************************************************************** + * Str_SetPtrWtoA [internal] + * + * Converts a unicode string to a multi byte string. + * If the pointer to the destination buffer is NULL a buffer is allocated. + * If the destination buffer is too small to keep the converted wide + * string the destination buffer is reallocated. If the source pointer is + * NULL, the destination buffer is freed. + * + * PARAMS + * lppDest [I/O] pointer to a pointer to the destination buffer + * lpSrc [I] pointer to a wide string + * + * RETURNS + * TRUE: conversion successful + * FALSE: error + */ +BOOL Str_SetPtrWtoA (LPSTR *lppDest, LPCWSTR lpSrc) +{ + TRACE("(%p %s)\n", lppDest, debugstr_w(lpSrc)); + + if (lpSrc) { + INT len = WideCharToMultiByte(CP_ACP,0,lpSrc,-1,NULL,0,NULL,FALSE); + LPSTR ptr = ReAlloc (*lppDest, len*sizeof(CHAR)); + + if (!ptr) + return FALSE; + WideCharToMultiByte(CP_ACP,0,lpSrc,-1,ptr,len,NULL,FALSE); + *lppDest = ptr; + } + else { + if (*lppDest) { + Free (*lppDest); + *lppDest = NULL; + } + } + + return TRUE; +} + /************************************************************************** * Notification functions
1
0
0
0
← Newer
1
...
6
7
8
9
10
11
12
...
52
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
Results per page:
10
25
50
100
200