Author: fireball
Date: Mon Oct 12 16:56:37 2009
New Revision: 43403
URL:
http://svn.reactos.org/svn/reactos?rev=43403&view=rev
Log:
[arwinss]
- Sync up to Wine-1.1.31.
Modified:
branches/arwinss/reactos/dll/win32/user32/ (props changed)
branches/arwinss/reactos/dll/win32/user32/clipboard.c
branches/arwinss/reactos/dll/win32/user32/cursoricon.c
branches/arwinss/reactos/dll/win32/user32/message.c
branches/arwinss/reactos/dll/win32/user32/sysparams.c
branches/arwinss/reactos/dll/win32/user32/text.c
branches/arwinss/reactos/dll/win32/user32/uitools.c
Propchange: branches/arwinss/reactos/dll/win32/user32/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 12 16:56:37 2009
@@ -1,3 +1,3 @@
/branches/ros-amd64-bringup/reactos/dll/win32/user32:35746,35789,36614,36930,38148,38151,38265,38268,39333,39345,40991,41000,41027-41028,41050,41052,41082-41086,41549,43080
/trunk/reactos/dll/win32/user32:42000-43126
-/vendor/wine/dlls/user32/current:43136,43149
+/vendor/wine/dlls/user32/current:43136,43149,43398
Modified: branches/arwinss/reactos/dll/win32/user32/clipboard.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/clipboard.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/clipboard.c [iso-8859-1] Mon Oct 12 16:56:37
2009
@@ -188,6 +188,9 @@
return bRet;
}
+/**************************************************************************
+ * CLIPBOARD_SetClipboardViewer
+ */
static HWND CLIPBOARD_SetClipboardViewer( HWND hWnd )
{
HWND hwndPrev = 0;
Modified: branches/arwinss/reactos/dll/win32/user32/cursoricon.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/cursoricon.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/cursoricon.c [iso-8859-1] Mon Oct 12
16:56:37 2009
@@ -660,6 +660,37 @@
return &dir->idEntries[n];
}
+/***********************************************************************
+ * stretch_blt_icon
+ *
+ * A helper function that stretches a bitmap buffer into an HBITMAP.
+ *
+ * PARAMS
+ * hDest [I] The handle of the destination bitmap.
+ * pDestInfo [I] The BITMAPINFO of the destination bitmap.
+ * pSrcInfo [I] The BITMAPINFO of the source bitmap.
+ * pSrcBits [I] A pointer to the source bitmap buffer.
+ **/
+static BOOL stretch_blt_icon(HBITMAP hDest, BITMAPINFO *pDestInfo, BITMAPINFO *pSrcInfo,
char *pSrcBits)
+{
+ HBITMAP hOld;
+ BOOL res = FALSE;
+ HDC hdcMem = CreateCompatibleDC(screen_dc);
+
+ if (hdcMem)
+ {
+ hOld = SelectObject(hdcMem, hDest);
+ res = StretchDIBits(hdcMem,
+ 0, 0, pDestInfo->bmiHeader.biWidth,
pDestInfo->bmiHeader.biHeight,
+ 0, 0, pSrcInfo->bmiHeader.biWidth,
pSrcInfo->bmiHeader.biHeight,
+ pSrcBits, pSrcInfo, DIB_RGB_COLORS, SRCCOPY);
+ SelectObject(hdcMem, hOld);
+ DeleteDC( hdcMem );
+ }
+
+ return res;
+}
+
static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
POINT16 hotspot, BOOL bIcon,
DWORD dwVersion,
@@ -667,12 +698,11 @@
UINT cFlag )
{
HGLOBAL hObj;
- static HDC hdcMem;
int sizeAnd, sizeXor;
HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */
BITMAP bmpXor, bmpAnd;
- BOOL DoStretch;
INT size;
+ BITMAPINFO *pSrcInfo, *pDestInfo;
if (dwVersion == 0x00020000)
{
@@ -694,11 +724,10 @@
if (!width) width = bmi->bmiHeader.biWidth;
if (!height) height = bmi->bmiHeader.biHeight/2;
- DoStretch = (bmi->bmiHeader.biHeight/2 != height) ||
- (bmi->bmiHeader.biWidth != width);
/* Scale the hotspot */
- if (DoStretch && hotspot.x != ICON_HOTSPOT && hotspot.y !=
ICON_HOTSPOT)
+ if (((bmi->bmiHeader.biHeight/2 != height) || (bmi->bmiHeader.biWidth !=
width)) &&
+ hotspot.x != ICON_HOTSPOT && hotspot.y != ICON_HOTSPOT)
{
hotspot.x = (hotspot.x * width) / bmi->bmiHeader.biWidth;
hotspot.y = (hotspot.y * height) / (bmi->bmiHeader.biHeight / 2);
@@ -707,8 +736,6 @@
if (!screen_dc) screen_dc = CreateDCW( DISPLAYW, NULL, NULL, NULL );
if (screen_dc)
{
- BITMAPINFO* pInfo;
-
/* Make sure we have room for the monochrome bitmap later on.
* Note that BITMAPINFOINFO and BITMAPCOREHEADER are the same
* up to and including the biBitCount. In-memory icon resource
@@ -720,40 +747,47 @@
* BYTE icAND[] // DIB bits for AND mask
*/
- if ((pInfo = HeapAlloc( GetProcessHeap(), 0,
- max(size, sizeof(BITMAPINFOHEADER) +
2*sizeof(RGBQUAD)))))
- {
- memcpy( pInfo, bmi, size );
- pInfo->bmiHeader.biHeight /= 2;
+ pSrcInfo = HeapAlloc( GetProcessHeap(), 0,
+ max(size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD)));
+ pDestInfo = HeapAlloc( GetProcessHeap(), 0,
+ max(size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD)));
+ if (pSrcInfo && pDestInfo)
+ {
+ memcpy( pSrcInfo, bmi, size );
+ pSrcInfo->bmiHeader.biHeight /= 2;
+
+ memcpy( pDestInfo, bmi, size );
+ pDestInfo->bmiHeader.biWidth = width;
+ pDestInfo->bmiHeader.biHeight = height;
+ pDestInfo->bmiHeader.biSizeImage = 0;
/* Create the XOR bitmap */
-
- if (DoStretch) {
- hXorBits = CreateCompatibleBitmap(screen_dc, width, height);
+ if(pSrcInfo->bmiHeader.biBitCount == 32)
+ {
+ void *pDIBBuffer = NULL;
+ hXorBits = CreateDIBSection(screen_dc, pDestInfo, DIB_RGB_COLORS,
&pDIBBuffer, NULL, 0);
+
if(hXorBits)
{
- HBITMAP hOld;
- BOOL res = FALSE;
-
- if (!hdcMem) hdcMem = CreateCompatibleDC(screen_dc);
- if (hdcMem) {
- hOld = SelectObject(hdcMem, hXorBits);
- res = StretchDIBits(hdcMem, 0, 0, width, height, 0, 0,
- bmi->bmiHeader.biWidth,
bmi->bmiHeader.biHeight/2,
- (char*)bmi + size, pInfo, DIB_RGB_COLORS,
SRCCOPY);
- SelectObject(hdcMem, hOld);
+ if (!stretch_blt_icon(hXorBits, pDestInfo, pSrcInfo, (char*)bmi +
size))
+ {
+ DeleteObject(hXorBits);
+ hXorBits = 0;
+ }
}
- if (!res) { DeleteObject(hXorBits); hXorBits = 0; }
- }
- } else {
- if (is_dib_monochrome(bmi)) {
- hXorBits = CreateBitmap(width, height, 1, 1, NULL);
- SetDIBits(screen_dc, hXorBits, 0, height,
- (char*)bmi + size, pInfo, DIB_RGB_COLORS);
- }
- else
- hXorBits = CreateDIBitmap(screen_dc, &pInfo->bmiHeader,
- CBM_INIT, (char*)bmi + size, pInfo, DIB_RGB_COLORS);
+ }
+ else
+ {
+ hXorBits = CreateCompatibleBitmap(screen_dc, width, height);
+
+ if(hXorBits)
+ {
+ if(!stretch_blt_icon(hXorBits, pDestInfo, pSrcInfo, (char*)bmi +
size))
+ {
+ DeleteObject(hXorBits);
+ hXorBits = 0;
+ }
+ }
}
if( hXorBits )
@@ -762,52 +796,43 @@
get_dib_width_bytes( bmi->bmiHeader.biWidth,
bmi->bmiHeader.biBitCount ) * abs(
bmi->bmiHeader.biHeight ) / 2;
- pInfo->bmiHeader.biBitCount = 1;
- if (pInfo->bmiHeader.biSize != sizeof(BITMAPCOREHEADER))
+ pSrcInfo->bmiHeader.biBitCount = 1;
+ if (pSrcInfo->bmiHeader.biSize != sizeof(BITMAPCOREHEADER))
{
- RGBQUAD *rgb = pInfo->bmiColors;
-
- pInfo->bmiHeader.biClrUsed = pInfo->bmiHeader.biClrImportant =
2;
+ RGBQUAD *rgb = pSrcInfo->bmiColors;
+
+ pSrcInfo->bmiHeader.biClrUsed =
pSrcInfo->bmiHeader.biClrImportant = 2;
rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00;
rgb[1].rgbBlue = rgb[1].rgbGreen = rgb[1].rgbRed = 0xff;
rgb[0].rgbReserved = rgb[1].rgbReserved = 0;
}
else
{
- RGBTRIPLE *rgb = (RGBTRIPLE *)(((BITMAPCOREHEADER *)pInfo) + 1);
+ RGBTRIPLE *rgb = (RGBTRIPLE *)(((BITMAPCOREHEADER *)pSrcInfo) + 1);
rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00;
rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff;
}
/* Create the AND bitmap */
-
- if (DoStretch) {
- if ((hAndBits = CreateBitmap(width, height, 1, 1, NULL))) {
- HBITMAP hOld;
- BOOL res = FALSE;
-
- if (!hdcMem) hdcMem = CreateCompatibleDC(screen_dc);
- if (hdcMem) {
- hOld = SelectObject(hdcMem, hAndBits);
- res = StretchDIBits(hdcMem, 0, 0, width, height, 0, 0,
- pInfo->bmiHeader.biWidth,
pInfo->bmiHeader.biHeight,
- xbits, pInfo, DIB_RGB_COLORS, SRCCOPY);
- SelectObject(hdcMem, hOld);
+ hAndBits = CreateBitmap(width, height, 1, 1, NULL);
+
+ if(!stretch_blt_icon(hAndBits, pDestInfo, pSrcInfo, xbits))
+ {
+ DeleteObject(hAndBits);
+ hAndBits = 0;
}
- if (!res) { DeleteObject(hAndBits); hAndBits = 0; }
- }
- } else {
- hAndBits = CreateBitmap(width, height, 1, 1, NULL);
-
- if (hAndBits) SetDIBits(screen_dc, hAndBits, 0, height,
- xbits, pInfo, DIB_RGB_COLORS);
-
+
+ if( !hAndBits )
+ {
+ DeleteObject( hXorBits );
+ hXorBits = 0;
+ }
}
- if( !hAndBits ) DeleteObject( hXorBits );
- }
- HeapFree( GetProcessHeap(), 0, pInfo );
- }
+ }
+
+ HeapFree( GetProcessHeap(), 0, pSrcInfo );
+ HeapFree( GetProcessHeap(), 0, pDestInfo );
}
if( !hXorBits || !hAndBits )
Modified: branches/arwinss/reactos/dll/win32/user32/message.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/message.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/message.c [iso-8859-1] Mon Oct 12 16:56:37
2009
@@ -44,6 +44,7 @@
#include "win.h"
#include "controls.h"
#include "wine/debug.h"
+#include "wine/exception.h"
WINE_DEFAULT_DEBUG_CHANNEL(msg);
WINE_DECLARE_DEBUG_CHANNEL(relay);
@@ -3067,8 +3068,20 @@
/* Process timer messages */
if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER))
{
- if (msg->lParam) return CallWindowProcA( (WNDPROC)msg->lParam,
msg->hwnd,
- msg->message, msg->wParam,
GetTickCount() );
+ if (msg->lParam)
+ {
+ __TRY
+ {
+ retval = CallWindowProcA( (WNDPROC)msg->lParam, msg->hwnd,
+ msg->message, msg->wParam, GetTickCount()
);
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ retval = 0;
+ }
+ __ENDTRY
+ return retval;
+ }
}
if (!msg->hwnd) return 0;
@@ -3105,7 +3118,8 @@
* If the lpMsg parameter points to a WM_TIMER message and the
* parameter of the WM_TIMER message is not NULL, the lParam parameter
* points to the function that is called instead of the window
- * procedure.
+ * procedure. The function stored in lParam (timer callback) is protected
+ * from causing page-faults.
*
* The message must be valid.
*
@@ -3125,8 +3139,20 @@
/* Process timer messages */
if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER))
{
- if (msg->lParam) return CallWindowProcW( (WNDPROC)msg->lParam,
msg->hwnd,
- msg->message, msg->wParam,
GetTickCount() );
+ if (msg->lParam)
+ {
+ __TRY
+ {
+ retval = CallWindowProcW( (WNDPROC)msg->lParam, msg->hwnd,
+ msg->message, msg->wParam, GetTickCount()
);
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ retval = 0;
+ }
+ __ENDTRY
+ return retval;
+ }
}
if (!msg->hwnd) return 0;
Modified: branches/arwinss/reactos/dll/win32/user32/sysparams.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/sysparams.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/sysparams.c [iso-8859-1] Mon Oct 12 16:56:37
2009
@@ -2321,8 +2321,15 @@
WINE_SPI_FIXME(SPI_SETMOUSESONAR); /* 0x101D _WIN32_WINNT >= 0x510 ||
_WIN32_WINDOW >= 0x490*/
WINE_SPI_FIXME(SPI_GETMOUSECLICKLOCK); /* 0x101E _WIN32_WINNT >= 0x510 ||
_WIN32_WINDOW >= 0x490*/
WINE_SPI_FIXME(SPI_SETMOUSECLICKLOCK); /* 0x101F _WIN32_WINNT >= 0x510 ||
_WIN32_WINDOW >= 0x490*/
- WINE_SPI_FIXME(SPI_GETMOUSEVANISH); /* 0x1020 _WIN32_WINNT >= 0x510 ||
_WIN32_WINDOW >= 0x490*/
- WINE_SPI_FIXME(SPI_SETMOUSEVANISH); /* 0x1021 _WIN32_WINNT >= 0x510 ||
_WIN32_WINDOW >= 0x490*/
+
+ case SPI_GETMOUSEVANISH:
+ ret = get_user_pref_param( 2, 0x01, pvParam );
+ break;
+
+ case SPI_SETMOUSEVANISH:
+ ret = set_user_pref_param( 2, 0x01, PtrToUlong(pvParam), fWinIni );
+ break;
+
case SPI_GETFLATMENU:
ret = get_user_pref_param( 2, 0x02, pvParam );
break;
@@ -2331,8 +2338,14 @@
ret = set_user_pref_param( 2, 0x02, PtrToUlong(pvParam), fWinIni );
break;
- WINE_SPI_FIXME(SPI_GETDROPSHADOW); /* 0x1024 _WIN32_WINNT >= 0x510 */
- WINE_SPI_FIXME(SPI_SETDROPSHADOW); /* 0x1025 _WIN32_WINNT >= 0x510 */
+ case SPI_GETDROPSHADOW:
+ ret = get_user_pref_param( 2, 0x04, pvParam );
+ break;
+
+ case SPI_SETDROPSHADOW:
+ ret = set_user_pref_param( 2, 0x04, PtrToUlong(pvParam), fWinIni );
+ break;
+
WINE_SPI_FIXME(SPI_GETBLOCKSENDINPUTRESETS);
WINE_SPI_FIXME(SPI_SETBLOCKSENDINPUTRESETS);
case SPI_GETUIEFFECTS:
Modified: branches/arwinss/reactos/dll/win32/user32/text.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/text.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/text.c [iso-8859-1] Mon Oct 12 16:56:37
2009
@@ -855,6 +855,7 @@
int tabwidth /* to keep gcc happy */ = 0;
int prefix_offset;
ellipsis_data ellip;
+ int invert_y=0;
TRACE("%s, %d, [%s] %08x\n", debugstr_wn (str, count), count,
wine_dbgstr_rect(rect), flags);
@@ -898,6 +899,15 @@
}
}
+ if (GetGraphicsMode(hdc) == GM_COMPATIBLE)
+ {
+ SIZE window_ext, viewport_ext;
+ GetWindowExtEx(hdc, &window_ext);
+ GetViewportExtEx(hdc, &viewport_ext);
+ if ((window_ext.cy > 0) != (viewport_ext.cy > 0))
+ invert_y = 1;
+ }
+
if (dtp)
{
lmargin = dtp->iLeftMargin;
@@ -932,7 +942,10 @@
do
{
len = sizeof(line)/sizeof(line[0]);
- last_line = !(flags & DT_NOCLIP) && y + ((flags & DT_EDITCONTROL)
? 2*lh-1 : lh) > rect->bottom;
+ if (invert_y)
+ last_line = !(flags & DT_NOCLIP) && y - ((flags &
DT_EDITCONTROL) ? 2*lh-1 : lh) < rect->bottom;
+ else
+ last_line = !(flags & DT_NOCLIP) && y + ((flags &
DT_EDITCONTROL) ? 2*lh-1 : lh) > rect->bottom;
strPtr = TEXT_NextLineW(hdc, strPtr, &count, line, &len, width, flags,
&size, last_line, &p_retstr, tabwidth, &prefix_offset, &ellip);
if (flags & DT_CENTER) x = (rect->left + rect->right -
@@ -1001,7 +1014,10 @@
else if (size.cx > max_width)
max_width = size.cx;
- y += lh;
+ if (invert_y)
+ y -= lh;
+ else
+ y += lh;
if (dtp)
dtp->uiLengthDrawn += len;
}
Modified: branches/arwinss/reactos/dll/win32/user32/uitools.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/uitools.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/uitools.c [iso-8859-1] Mon Oct 12 16:56:37
2009
@@ -1534,7 +1534,7 @@
return DrawTextA(hdc, (LPSTR)lp, (INT)wp, rc, dtflags);
case DST_ICON:
- return DrawIcon(hdc, rc->left, rc->top, (HICON)lp);
+ return DrawIconEx(hdc, rc->left, rc->top, (HICON)lp, 0, 0, 0, NULL,
DI_NORMAL);
case DST_BITMAP:
memdc = CreateCompatibleDC(hdc);