Author: fireball
Date: Fri Sep 25 20:32:41 2009
New Revision: 43149
URL:
http://svn.reactos.org/svn/reactos?rev=43149&view=rev
Log:
- Drop in Wine 1.1.30 user32, gdi32, winex11.drv, server. Part 1/2.
Modified:
vendor/wine/dlls/gdi32/current/bitblt.c
vendor/wine/dlls/gdi32/current/opengl.c
vendor/wine/dlls/gdi32/current/tests/bitmap.c
vendor/wine/dlls/gdi32/current/tests/metafile.c
vendor/wine/dlls/user32/current/clipboard.c
vendor/wine/dlls/user32/current/cursoricon.c
vendor/wine/dlls/user32/current/edit.c
vendor/wine/dlls/user32/current/hook.c
vendor/wine/dlls/user32/current/nonclient.c
vendor/wine/dlls/user32/current/painting.c
vendor/wine/dlls/user32/current/resources/user32_Ja.rc
vendor/wine/dlls/user32/current/tests/cursoricon.c
vendor/wine/dlls/user32/current/tests/input.c
vendor/wine/dlls/user32/current/tests/msg.c
vendor/wine/dlls/user32/current/tests/win.c
vendor/wine/dlls/winex11.drv/current/bitmap.c
vendor/wine/dlls/winex11.drv/current/brush.c
vendor/wine/dlls/winex11.drv/current/dib.c
vendor/wine/dlls/winex11.drv/current/event.c
vendor/wine/dlls/winex11.drv/current/palette.c
vendor/wine/dlls/winex11.drv/current/window.c
vendor/wine/dlls/winex11.drv/current/x11drv.h
vendor/wine/dlls/winex11.drv/current/xrender.c
vendor/wine/dlls/winex11.drv/current/xvidmode.c
Modified: vendor/wine/dlls/gdi32/current/bitblt.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/gdi32/current/bitblt.c?…
==============================================================================
--- vendor/wine/dlls/gdi32/current/bitblt.c [iso-8859-1] (original)
+++ vendor/wine/dlls/gdi32/current/bitblt.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -518,9 +518,11 @@
DC *dcDst, *dcSrc;
dcSrc = get_dc_ptr( hdcSrc );
+ if (!dcSrc) return FALSE;
+
if ((dcDst = get_dc_ptr( hdcDst )))
{
- if (dcSrc) update_dc( dcSrc );
+ update_dc( dcSrc );
update_dc( dcDst );
TRACE("%p %d,%d %dx%d -> %p %d,%d %dx%d op=%02x flags=%02x
srcconstalpha=%02x alphafmt=%02x\n",
hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
@@ -529,11 +531,11 @@
blendFunction.SourceConstantAlpha, blendFunction.AlphaFormat);
if (dcDst->funcs->pAlphaBlend)
ret = dcDst->funcs->pAlphaBlend( dcDst->physDev, xDst, yDst,
widthDst, heightDst,
- dcSrc ? dcSrc->physDev : NULL,
- xSrc, ySrc, widthSrc, heightSrc,
blendFunction );
+ dcSrc->physDev, xSrc, ySrc, widthSrc,
heightSrc,
+ blendFunction );
release_dc_ptr( dcDst );
}
- if (dcSrc) release_dc_ptr( dcSrc );
+ release_dc_ptr( dcSrc );
return ret;
}
Modified: vendor/wine/dlls/gdi32/current/opengl.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/gdi32/current/opengl.c?…
==============================================================================
--- vendor/wine/dlls/gdi32/current/opengl.c [iso-8859-1] (original)
+++ vendor/wine/dlls/gdi32/current/opengl.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -193,7 +193,15 @@
/* When the context hglrc is NULL, the HDC is ignored and can be NULL.
* In that case use the global hDC to get access to the driver. */
if(hglrc == NULL)
+ {
+ if( hdc == NULL && !wglGetCurrentContext() )
+ {
+ WARN( "Current context is NULL\n");
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
dc = OPENGL_GetDefaultDC();
+ }
else
dc = get_dc_ptr( hdc );
Modified: vendor/wine/dlls/gdi32/current/tests/bitmap.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/gdi32/current/tests/bit…
==============================================================================
--- vendor/wine/dlls/gdi32/current/tests/bitmap.c [iso-8859-1] (original)
+++ vendor/wine/dlls/gdi32/current/tests/bitmap.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -2393,6 +2393,10 @@
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, -1, 0, 30, 30, blend), TRUE,
BOOL, "%d");
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, -1, 30, 30, blend), TRUE,
BOOL, "%d");
+ SetLastError(0xdeadbeef);
+ expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, NULL, 0, 0, 20, 20, blend), FALSE,
BOOL, "%d");
+ expect_eq(GetLastError(), 0xdeadbeef, int, "%d");
+
SelectObject(hdcDst, oldDst);
SelectObject(hdcSrc, oldSrc);
DeleteObject(bmpSrc);
Modified: vendor/wine/dlls/gdi32/current/tests/metafile.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/gdi32/current/tests/met…
==============================================================================
--- vendor/wine/dlls/gdi32/current/tests/metafile.c [iso-8859-1] (original)
+++ vendor/wine/dlls/gdi32/current/tests/metafile.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -1908,6 +1908,7 @@
HENHMETAFILE hemf;
HRGN hrgn;
INT ret;
+ RECT rc_res, rc_sclip;
SetLastError(0xdeadbeef);
hdc = CreateEnhMetaFileA(0, NULL, NULL, NULL);
@@ -1946,6 +1947,22 @@
DeleteEnhMetaFile(hemf);
ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd);
+
+ hdc = CreateEnhMetaFileA(0, NULL, NULL, NULL);
+
+ SetRect(&rc_sclip, 100, 100, GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
+ hrgn = CreateRectRgn(rc_sclip.left, rc_sclip.top, rc_sclip.right, rc_sclip.bottom);
+ SelectClipRgn(hdc, hrgn);
+ GetClipBox(hdc, &rc_res);
+ todo_wine ok(EqualRect(&rc_res, &rc_sclip),
+ "expected rc_res (%d, %d) - (%d, %d), got (%d, %d) - (%d,
%d)\n",
+ rc_sclip.left, rc_sclip.top, rc_sclip.right, rc_sclip.bottom,
+ rc_res.left, rc_res.top, rc_res.right, rc_res.bottom);
+
+ hemf = CloseEnhMetaFile(hdc);
+ DeleteEnhMetaFile(hemf);
+ DeleteObject(hrgn);
+ DeleteDC(hdc);
}
static INT CALLBACK EmfEnumProc(HDC hdc, HANDLETABLE *lpHTable, const ENHMETARECORD
*lpEMFR, INT nObj, LPARAM lpData)
Modified: vendor/wine/dlls/user32/current/clipboard.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/clipboar…
==============================================================================
--- vendor/wine/dlls/user32/current/clipboard.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/clipboard.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -188,6 +188,21 @@
return bRet;
}
+static HWND CLIPBOARD_SetClipboardViewer( HWND hWnd )
+{
+ HWND hwndPrev = 0;
+
+ SERVER_START_REQ( set_clipboard_info )
+ {
+ req->flags = SET_CB_VIEWER;
+ req->viewer = wine_server_user_handle( hWnd );
+ if (!wine_server_call_err( req ))
+ hwndPrev = wine_server_ptr_handle( reply->old_viewer );
+ }
+ SERVER_END_REQ;
+
+ return hwndPrev;
+}
/**************************************************************************
* WIN32 Clipboard implementation
@@ -285,7 +300,7 @@
USER_Driver->pEndClipboardUpdate();
if (hWndViewer)
- SendMessageW(hWndViewer, WM_DRAWCLIPBOARD, 0, 0);
+ SendMessageW(hWndViewer, WM_DRAWCLIPBOARD, (WPARAM) GetClipboardOwner(),
0);
bCBHasChanged = FALSE;
}
@@ -390,17 +405,10 @@
*/
HWND WINAPI SetClipboardViewer( HWND hWnd )
{
- HWND hwndPrev = 0;
-
- SERVER_START_REQ( set_clipboard_info )
- {
- req->flags = SET_CB_VIEWER;
- req->viewer = wine_server_user_handle( hWnd );
- if (!wine_server_call_err( req ))
- hwndPrev = wine_server_ptr_handle( reply->old_viewer );
- }
- SERVER_END_REQ;
-
+ HWND hwndPrev = CLIPBOARD_SetClipboardViewer(hWnd);
+
+ if (hWnd)
+ SendMessageW(hWnd, WM_DRAWCLIPBOARD, (WPARAM) GetClipboardOwner(), 0);
TRACE("(%p): returning %p\n", hWnd, hwndPrev);
return hwndPrev;
@@ -438,7 +446,7 @@
if (hWndViewer)
{
if (WIN_GetFullHandle(hWnd) == hWndViewer)
- SetClipboardViewer(WIN_GetFullHandle(hWndNext));
+ CLIPBOARD_SetClipboardViewer(WIN_GetFullHandle(hWndNext));
else
bRet = !SendMessageW(hWndViewer, WM_CHANGECBCHAIN, (WPARAM)hWnd,
(LPARAM)hWndNext);
}
Modified: vendor/wine/dlls/user32/current/cursoricon.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/cursoric…
==============================================================================
--- vendor/wine/dlls/user32/current/cursoricon.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/cursoricon.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -1715,7 +1715,9 @@
/* Do the alpha blending render */
premultiply_alpha_channel(dibBits, xorBitmapBits, dibLength);
hBitTemp = SelectObject( hMemDC, hXorBits );
- GdiAlphaBlend(hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC,
+ /* Destination width/height has to be "System Large" size */
+ GdiAlphaBlend(hdc, x, y, GetSystemMetrics(SM_CXICON),
+ GetSystemMetrics(SM_CYICON), hMemDC,
0, 0, ptr->nWidth, ptr->nHeight, pixelblend);
SelectObject( hMemDC, hBitTemp );
}
@@ -1729,9 +1731,13 @@
if (hXorBits && hAndBits)
{
hBitTemp = SelectObject( hMemDC, hAndBits );
- BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
+ StretchBlt( hdc, x, y, GetSystemMetrics(SM_CXICON),
+ GetSystemMetrics(SM_CYICON), hMemDC, 0, 0,
+ ptr->nWidth, ptr->nHeight, SRCAND );
SelectObject( hMemDC, hXorBits );
- BitBlt(hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0,SRCINVERT);
+ StretchBlt( hdc, x, y, GetSystemMetrics(SM_CXICON),
+ GetSystemMetrics(SM_CYICON), hMemDC, 0, 0,
+ ptr->nWidth, ptr->nHeight, SRCINVERT );
SelectObject( hMemDC, hBitTemp );
}
}
Modified: vendor/wine/dlls/user32/current/edit.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/edit.c?r…
==============================================================================
--- vendor/wine/dlls/user32/current/edit.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/edit.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -5011,6 +5011,9 @@
case EM_SETREADONLY16:
case EM_SETREADONLY:
+ {
+ DWORD old_style = es->style;
+
if (wParam) {
SetWindowLongW( hwnd, GWL_STYLE,
GetWindowLongW( hwnd, GWL_STYLE ) | ES_READONLY );
@@ -5020,8 +5023,13 @@
GetWindowLongW( hwnd, GWL_STYLE ) & ~ES_READONLY
);
es->style &= ~ES_READONLY;
}
- result = 1;
- break;
+
+ if (old_style ^ es->style)
+ InvalidateRect(es->hwndSelf, NULL, TRUE);
+
+ result = 1;
+ break;
+ }
case EM_SETWORDBREAKPROC16:
EDIT_EM_SetWordBreakProc16(es, (EDITWORDBREAKPROC16)lParam);
Modified: vendor/wine/dlls/user32/current/hook.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/hook.c?r…
==============================================================================
--- vendor/wine/dlls/user32/current/hook.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/hook.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -85,7 +85,7 @@
struct hook_info
{
INT id;
- FARPROC proc;
+ void *proc;
void *handle;
DWORD pid, tid;
BOOL prev_unicode, next_unicode;
@@ -844,24 +844,25 @@
do
{
- if (info.proc)
+ WINEVENTPROC proc = info.proc;
+ if (proc)
{
TRACE( "calling WH_WINEVENT hook %p event %x hwnd %p %x %x module
%s\n",
- info.proc, event, hwnd, object_id, child_id, debugstr_w(info.module)
);
-
- if (!info.module[0] || (info.proc = get_hook_proc( info.proc, info.module ))
!= NULL)
+ proc, event, hwnd, object_id, child_id, debugstr_w(info.module) );
+
+ if (!info.module[0] || (proc = get_hook_proc( proc, info.module )) != NULL)
{
if (TRACE_ON(relay))
DPRINTF( "%04x:Call winevent hook proc %p
(hhook=%p,event=%x,hwnd=%p,object_id=%x,child_id=%x,tid=%04x,time=%x)\n",
- GetCurrentThreadId(), info.proc, info.handle, event, hwnd,
object_id,
+ GetCurrentThreadId(), proc, info.handle, event, hwnd,
object_id,
child_id, GetCurrentThreadId(), GetCurrentTime());
- info.proc(info.handle, event, hwnd, object_id, child_id,
- GetCurrentThreadId(), GetCurrentTime());
+ proc( info.handle, event, hwnd, object_id, child_id,
+ GetCurrentThreadId(), GetCurrentTime());
if (TRACE_ON(relay))
DPRINTF( "%04x:Ret winevent hook proc %p
(hhook=%p,event=%x,hwnd=%p,object_id=%x,child_id=%x,tid=%04x,time=%x)\n",
- GetCurrentThreadId(), info.proc, info.handle, event, hwnd,
object_id,
+ GetCurrentThreadId(), proc, info.handle, event, hwnd,
object_id,
child_id, GetCurrentThreadId(), GetCurrentTime());
}
}
Modified: vendor/wine/dlls/user32/current/nonclient.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/nonclien…
==============================================================================
--- vendor/wine/dlls/user32/current/nonclient.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/nonclient.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -1316,7 +1316,7 @@
*
* Track a mouse button press on the Win95 close button.
*/
-static void NC_TrackCloseButton (HWND hwnd, WORD wParam)
+static void NC_TrackCloseButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
MSG msg;
HDC hdc;
@@ -1364,7 +1364,7 @@
ReleaseDC( hwnd, hdc );
if (!pressed) return;
- SendMessageW( hwnd, WM_SYSCOMMAND, SC_CLOSE, MAKELONG(msg.pt.x,msg.pt.y) );
+ SendMessageW( hwnd, WM_SYSCOMMAND, SC_CLOSE, lParam );
}
@@ -1442,7 +1442,7 @@
break;
case HTCLOSE:
- NC_TrackCloseButton (hwnd, wParam);
+ NC_TrackCloseButton (hwnd, wParam, lParam);
break;
case HTLEFT:
@@ -1600,7 +1600,9 @@
HMODULE hmodule = LoadLibraryA( "shell32.dll" );
if (hmodule)
{
- FARPROC aboutproc = GetProcAddress( hmodule, "ShellAboutA" );
+ BOOL (WINAPI *aboutproc)(HWND, LPCSTR, LPCSTR, HICON);
+
+ aboutproc = (void *)GetProcAddress( hmodule, "ShellAboutA" );
if (aboutproc) aboutproc( hwnd, PACKAGE_STRING, NULL, 0 );
FreeLibrary( hmodule );
}
Modified: vendor/wine/dlls/user32/current/painting.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/painting…
==============================================================================
--- vendor/wine/dlls/user32/current/painting.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/painting.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -1404,10 +1404,11 @@
hwnd = WIN_GetFullHandle( hwnd );
GetClientRect(hwnd, &rc);
- if (rect) IntersectRect(&rc, &rc, rect);
if (clipRect) IntersectRect(&cliprc,&rc,clipRect);
else cliprc = rc;
+
+ if (rect) IntersectRect(&rc, &rc, rect);
if( hrgnUpdate ) bOwnRgn = FALSE;
else if( bUpdate ) hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 );
Modified: vendor/wine/dlls/user32/current/resources/user32_Ja.rc
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/resource…
==============================================================================
--- vendor/wine/dlls/user32/current/resources/user32_Ja.rc [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/resources/user32_Ja.rc [iso-8859-1] Fri Sep 25
20:32:41 2009
@@ -53,7 +53,6 @@
MSGBOX DIALOG 100, 80, 216, 168
STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-FONT 9, "MS Shell Dlg"
BEGIN
ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE
LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP |
SS_NOPREFIX
Modified: vendor/wine/dlls/user32/current/tests/cursoricon.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/tests/cu…
==============================================================================
--- vendor/wine/dlls/user32/current/tests/cursoricon.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/tests/cursoricon.c [iso-8859-1] Fri Sep 25 20:32:41
2009
@@ -1039,6 +1039,8 @@
HICON hicon = create_test_icon(hdc, 1, 1, bpp, maskvalue, &color,
sizeof(color));
if (!hicon) return;
SetPixelV(hdc, 0, 0, background);
+ SetPixelV(hdc, GetSystemMetrics(SM_CXICON)-1, GetSystemMetrics(SM_CYICON)-1,
background);
+ SetPixelV(hdc, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON),
background);
DrawIcon(hdc, 0, 0, hicon);
result = GetPixel(hdc, 0, 0);
@@ -1047,6 +1049,21 @@
"Overlaying Mask %d on Color %06X with DrawIcon. "
"Expected a close match to %06X (modern), or %06X (legacy). Got %06X from
line %d\n",
maskvalue, color, modern_expected, legacy_expected, result, line);
+
+ result = GetPixel(hdc, GetSystemMetrics(SM_CXICON)-1,
GetSystemMetrics(SM_CYICON)-1);
+
+ ok (color_match(result, modern_expected) || /* Windows 2000 and up */
+ broken(color_match(result, legacy_expected)), /* Windows NT 4.0, 9X and below
*/
+ "Overlaying Mask %d on Color %06X with DrawIcon. "
+ "Expected a close match to %06X (modern), or %06X (legacy). Got %06X from
line %d\n",
+ maskvalue, color, modern_expected, legacy_expected, result, line);
+
+ result = GetPixel(hdc, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON));
+
+ ok (color_match(result, background),
+ "Overlaying Mask %d on Color %06X with DrawIcon. "
+ "Expected unchanged background color %06X. Got %06X from line %d\n",
+ maskvalue, color, background, result, line);
}
static void test_DrawIcon(void)
@@ -1070,8 +1087,8 @@
memset(&bitmapInfo, 0, sizeof(bitmapInfo));
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bitmapInfo.bmiHeader.biWidth = 1;
- bitmapInfo.bmiHeader.biHeight = 1;
+ bitmapInfo.bmiHeader.biWidth = GetSystemMetrics(SM_CXICON)+1;
+ bitmapInfo.bmiHeader.biHeight = GetSystemMetrics(SM_CYICON)+1;
bitmapInfo.bmiHeader.biBitCount = 32;
bitmapInfo.bmiHeader.biPlanes = 1;
bitmapInfo.bmiHeader.biCompression = BI_RGB;
Modified: vendor/wine/dlls/user32/current/tests/input.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/tests/in…
==============================================================================
--- vendor/wine/dlls/user32/current/tests/input.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/tests/input.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -892,6 +892,11 @@
HWND window;
HHOOK hook;
+ if (GetKeyboardLayout(0) != (HKL)(ULONG_PTR)0x04090409)
+ {
+ skip("Skipping Input_blackbox test on non-US keyboard\n");
+ return;
+ }
window = CreateWindow("Static", NULL, WS_POPUP|WS_HSCROLL|WS_VSCROLL
|WS_VISIBLE, 0, 0, 200, 60, NULL, NULL,
NULL, NULL);
Modified: vendor/wine/dlls/user32/current/tests/msg.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/tests/ms…
==============================================================================
--- vendor/wine/dlls/user32/current/tests/msg.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/tests/msg.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -11724,6 +11724,171 @@
DestroyWindow( hwnd);
}
+#define clear_clipboard(hwnd) clear_clipboard_(__LINE__, (hwnd))
+static void clear_clipboard_(int line, HWND hWnd)
+{
+ BOOL succ;
+ succ = OpenClipboard(hWnd);
+ ok_(__FILE__, line)(succ, "OpenClipboard failed, err=%u\n",
GetLastError());
+ succ = EmptyClipboard();
+ ok_(__FILE__, line)(succ, "EmptyClipboard failed, err=%u\n",
GetLastError());
+ succ = CloseClipboard();
+ ok_(__FILE__, line)(succ, "CloseClipboard failed, err=%u\n",
GetLastError());
+}
+
+#define expect_HWND(expected, got) expect_HWND_(__LINE__, (expected), (got))
+static void expect_HWND_(int line, HWND expected, HWND got)
+{
+ ok_(__FILE__, line)(got==expected, "Expected %p, got %p\n", expected,
got);
+}
+
+static WNDPROC pOldViewerProc;
+
+static LRESULT CALLBACK recursive_viewer_proc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
+{
+ static BOOL recursion_guard;
+
+ if (message == WM_DRAWCLIPBOARD && !recursion_guard)
+ {
+ recursion_guard = TRUE;
+ clear_clipboard(hWnd);
+ recursion_guard = FALSE;
+ }
+ return CallWindowProcA(pOldViewerProc, hWnd, message, wParam, lParam);
+}
+
+static void test_clipboard_viewers(void)
+{
+ static struct message wm_change_cb_chain[] =
+ {
+ { WM_CHANGECBCHAIN, sent|wparam|lparam, 0, 0 },
+ { 0 }
+ };
+ static const struct message wm_clipboard_destroyed[] =
+ {
+ { WM_DESTROYCLIPBOARD, sent|wparam|lparam, 0, 0 },
+ { 0 }
+ };
+ static struct message wm_clipboard_changed[] =
+ {
+ { WM_DRAWCLIPBOARD, sent|wparam|lparam, 0, 0 },
+ { 0 }
+ };
+ static struct message wm_clipboard_changed_and_owned[] =
+ {
+ { WM_DESTROYCLIPBOARD, sent|wparam|lparam, 0, 0 },
+ { WM_DRAWCLIPBOARD, sent|wparam|lparam, 0, 0 },
+ { 0 }
+ };
+
+ HINSTANCE hInst = GetModuleHandleA(NULL);
+ HWND hWnd1, hWnd2, hWnd3;
+ HWND hOrigViewer;
+ HWND hRet;
+
+ hWnd1 = CreateWindowExA(0, "TestWindowClass", "Clipboard viewer test
wnd 1",
+ WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ GetDesktopWindow(), NULL, hInst, NULL);
+ hWnd2 = CreateWindowExA(0, "SimpleWindowClass", "Clipboard viewer test
wnd 2",
+ WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ GetDesktopWindow(), NULL, hInst, NULL);
+ hWnd3 = CreateWindowExA(0, "SimpleWindowClass", "Clipboard viewer test
wnd 3",
+ WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ GetDesktopWindow(), NULL, hInst, NULL);
+ trace("clipbd viewers: hWnd1=%p, hWnd2=%p, hWnd3=%p\n", hWnd1, hWnd2,
hWnd3);
+ assert(hWnd1 && hWnd2 && hWnd3);
+
+ flush_sequence();
+
+ /* Test getting the clipboard viewer and setting the viewer to NULL. */
+ hOrigViewer = GetClipboardViewer();
+ hRet = SetClipboardViewer(NULL);
+ ok_sequence(WmEmptySeq, "set viewer to NULL", FALSE);
+ expect_HWND(hOrigViewer, hRet);
+ expect_HWND(NULL, GetClipboardViewer());
+
+ /* Test registering hWnd1 as a viewer. */
+ hRet = SetClipboardViewer(hWnd1);
+ wm_clipboard_changed[0].wParam = (WPARAM) GetClipboardOwner();
+ ok_sequence(wm_clipboard_changed, "set viewer NULL->1", FALSE);
+ expect_HWND(NULL, hRet);
+ expect_HWND(hWnd1, GetClipboardViewer());
+
+ /* Test that changing the clipboard actually refreshes the registered viewer. */
+ clear_clipboard(hWnd1);
+ wm_clipboard_changed[0].wParam = (WPARAM) GetClipboardOwner();
+ ok_sequence(wm_clipboard_changed, "clear clipbd (viewer=owner=1)", FALSE);
+
+ /* Again, but with different owner. */
+ clear_clipboard(hWnd2);
+ wm_clipboard_changed_and_owned[1].wParam = (WPARAM) GetClipboardOwner();
+ ok_sequence(wm_clipboard_changed_and_owned, "clear clipbd (viewer=1,
owner=2)", FALSE);
+
+ /* Test re-registering same window. */
+ hRet = SetClipboardViewer(hWnd1);
+ wm_clipboard_changed[0].wParam = (WPARAM) GetClipboardOwner();
+ ok_sequence(wm_clipboard_changed, "set viewer 1->1", FALSE);
+ expect_HWND(hWnd1, hRet);
+ expect_HWND(hWnd1, GetClipboardViewer());
+
+ /* Test ChangeClipboardChain. */
+ ChangeClipboardChain(hWnd2, hWnd3);
+ wm_change_cb_chain[0].wParam = (WPARAM) hWnd2;
+ wm_change_cb_chain[0].lParam = (LPARAM) hWnd3;
+ ok_sequence(wm_change_cb_chain, "change chain (viewer=1, remove=2,
next=3)", FALSE);
+ expect_HWND(hWnd1, GetClipboardViewer());
+
+ ChangeClipboardChain(hWnd2, NULL);
+ wm_change_cb_chain[0].wParam = (WPARAM) hWnd2;
+ wm_change_cb_chain[0].lParam = 0;
+ ok_sequence(wm_change_cb_chain, "change chain (viewer=1, remove=2,
next=NULL)", FALSE);
+ expect_HWND(hWnd1, GetClipboardViewer());
+
+ ChangeClipboardChain(NULL, hWnd2);
+ ok_sequence(WmEmptySeq, "change chain (viewer=1, remove=NULL, next=2)",
TRUE);
+ expect_HWND(hWnd1, GetClipboardViewer());
+
+ /* Actually change clipboard viewer with ChangeClipboardChain. */
+ ChangeClipboardChain(hWnd1, hWnd2);
+ ok_sequence(WmEmptySeq, "change chain (viewer=remove=1, next=2)", FALSE);
+ expect_HWND(hWnd2, GetClipboardViewer());
+
+ /* Test that no refresh messages are sent when viewer has unregistered. */
+ clear_clipboard(hWnd2);
+ ok_sequence(WmEmptySeq, "clear clipd (viewer=2, owner=1)", FALSE);
+
+ /* Register hWnd1 again. */
+ ChangeClipboardChain(hWnd2, hWnd1);
+ ok_sequence(WmEmptySeq, "change chain (viewer=remove=2, next=1)", FALSE);
+ expect_HWND(hWnd1, GetClipboardViewer());
+
+ /* Subclass hWnd1 so that when it receives a WM_DRAWCLIPBOARD message, it
+ * changes the clipboard. When this happens, the system shouldn't send
+ * another WM_DRAWCLIPBOARD (as this could cause an infinite loop).
+ */
+ pOldViewerProc = (WNDPROC) SetWindowLongPtrA(hWnd1, GWLP_WNDPROC, (LONG_PTR)
recursive_viewer_proc);
+ clear_clipboard(hWnd2);
+ /* The clipboard owner is changed in recursive_viewer_proc: */
+ wm_clipboard_changed[0].wParam = (WPARAM) hWnd2;
+ ok_sequence(wm_clipboard_changed, "recursive clear clipbd (viewer=1,
owner=2)", TRUE);
+
+ /* Test unregistering. */
+ ChangeClipboardChain(hWnd1, NULL);
+ ok_sequence(WmEmptySeq, "change chain (viewer=remove=1, next=NULL)",
FALSE);
+ expect_HWND(NULL, GetClipboardViewer());
+
+ clear_clipboard(hWnd1);
+ ok_sequence(wm_clipboard_destroyed, "clear clipbd (no viewer, owner=1)",
FALSE);
+
+ DestroyWindow(hWnd1);
+ DestroyWindow(hWnd2);
+ DestroyWindow(hWnd3);
+ SetClipboardViewer(hOrigViewer);
+}
+
static void test_PostMessage(void)
{
static const struct
@@ -11787,7 +11952,7 @@
START_TEST(msg)
{
BOOL ret;
- FARPROC pIsWinEventHookInstalled = 0;/*GetProcAddress(user32,
"IsWinEventHookInstalled");*/
+ BOOL (WINAPI *pIsWinEventHookInstalled)(DWORD)= 0;/*GetProcAddress(user32,
"IsWinEventHookInstalled");*/
init_procs();
@@ -11867,6 +12032,7 @@
test_menu_messages();
test_paintingloop();
test_defwinproc();
+ test_clipboard_viewers();
/* keep it the last test, under Windows it tends to break the tests
* which rely on active/foreground windows being correct.
*/
Modified: vendor/wine/dlls/user32/current/tests/win.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/user32/current/tests/wi…
==============================================================================
--- vendor/wine/dlls/user32/current/tests/win.c [iso-8859-1] (original)
+++ vendor/wine/dlls/user32/current/tests/win.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -3216,6 +3216,57 @@
check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME|WS_EX_STATICEDGE, WS_CHILD,
WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME);
check_window_style(WS_CAPTION, WS_EX_STATICEDGE, WS_CLIPSIBLINGS|WS_CAPTION,
WS_EX_STATICEDGE|WS_EX_WINDOWEDGE);
check_window_style(0, WS_EX_APPWINDOW, WS_CLIPSIBLINGS|WS_CAPTION,
WS_EX_APPWINDOW|WS_EX_WINDOWEDGE);
+}
+
+static void test_scrollwindow( HWND hwnd)
+{
+ HDC hdc;
+ RECT rc, rc2, rc3;
+ COLORREF colr;
+
+ ShowWindow( hwnd, SW_SHOW);
+ UpdateWindow( hwnd);
+ flush_events( TRUE );
+ GetClientRect( hwnd, &rc);
+ hdc = GetDC( hwnd);
+ /* test ScrollWindow(Ex) with no clip rectangle */
+ /* paint the lower half of the window black */
+ rc2 = rc;
+ rc2.top = ( rc2.top + rc2.bottom) / 2;
+ FillRect( hdc, &rc2, GetStockObject(BLACK_BRUSH));
+ /* paint the upper half of the window white */
+ rc2.bottom = rc2.top;
+ rc2.top =0;
+ FillRect( hdc, &rc2, GetStockObject(WHITE_BRUSH));
+ /* scroll lower half up */
+ rc2 = rc;
+ rc2.top = ( rc2.top + rc2.bottom) / 2;
+ ScrollWindowEx( hwnd, 0, - rc2.top, &rc2, NULL, NULL, NULL, SW_ERASE);
+ /* expected: black should have scrolled to the upper half */
+ colr = GetPixel( hdc, (rc2.left+rc2.right)/ 2, rc2.bottom / 4 );
+ ok ( colr == 0, "pixel should be black, color is %08x\n", colr);
+ /* Repeat that test of ScrollWindow(Ex) now with clip rectangle */
+ /* paint the lower half of the window black */
+ rc2 = rc;
+ rc2.top = ( rc2.top + rc2.bottom) / 2;
+ FillRect( hdc, &rc2, GetStockObject(BLACK_BRUSH));
+ /* paint the upper half of the window white */
+ rc2.bottom = rc2.top;
+ rc2.top =0;
+ FillRect( hdc, &rc2, GetStockObject(WHITE_BRUSH));
+ /* scroll lower half up */
+ rc2 = rc;
+ rc2.top = ( rc2.top + rc2.bottom) / 2;
+ rc3 = rc;
+ rc3.left = rc3.right / 4;
+ rc3.right -= rc3.right / 4;
+ ScrollWindowEx( hwnd, 0, - rc2.top, &rc2, &rc3, NULL, NULL, SW_ERASE);
+ /* expected: black should have scrolled to the upper half */
+ colr = GetPixel( hdc, (rc2.left+rc2.right)/ 2, rc2.bottom / 4 );
+ ok ( colr == 0, "pixel should be black, color is %08x\n", colr);
+
+ /* clean up */
+ ReleaseDC( hwnd, hdc);
}
static void test_scrollvalidate( HWND parent)
@@ -5724,6 +5775,7 @@
test_mouse_input(hwndMain);
test_validatergn(hwndMain);
test_nccalcscroll( hwndMain);
+ test_scrollwindow( hwndMain);
test_scrollvalidate( hwndMain);
test_scrolldc( hwndMain);
test_scroll();
Modified: vendor/wine/dlls/winex11.drv/current/bitmap.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/bit…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/bitmap.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/bitmap.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -102,6 +102,7 @@
physDev->bitmap = physBitmap;
physDev->drawable = physBitmap->pixmap;
+ physDev->color_shifts = physBitmap->trueColor ?
&physBitmap->pixmap_color_shifts : NULL;
SetRect( &physDev->drawable_rect, 0, 0, bitmap.bmWidth, bitmap.bmHeight );
physDev->dc_rect = physDev->drawable_rect;
@@ -110,10 +111,6 @@
if (physDev->depth != physBitmap->pixmap_depth)
{
physDev->depth = physBitmap->pixmap_depth;
- if(physDev->depth == 1)
- physDev->color_shifts = NULL;
- else
- physDev->color_shifts = &physBitmap->pixmap_color_shifts;
wine_tsx11_lock();
XFreeGC( gdi_display, physDev->gc );
physDev->gc = XCreateGC( gdi_display, physDev->drawable, 0, NULL );
@@ -122,6 +119,7 @@
XFlush( gdi_display );
wine_tsx11_unlock();
}
+
return hbitmap;
}
@@ -165,11 +163,13 @@
if(bitmap.bmBitsPixel == 1)
{
physBitmap->pixmap_depth = 1;
+ physBitmap->trueColor = FALSE;
}
else
{
physBitmap->pixmap_depth = screen_depth;
physBitmap->pixmap_color_shifts = X11DRV_PALETTE_default_shifts;
+ physBitmap->trueColor = (visual->class == TrueColor || visual->class ==
DirectColor);
}
physBitmap->pixmap = XCreatePixmap(gdi_display, root_window,
bitmap.bmWidth, bitmap.bmHeight,
physBitmap->pixmap_depth);
Modified: vendor/wine/dlls/winex11.drv/current/brush.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/bru…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/brush.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/brush.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -215,25 +215,22 @@
if (!physBitmap || !GetObjectW( hbitmap, sizeof(bitmap), &bitmap )) return
FALSE;
- wine_tsx11_lock();
if ((physDev->depth == 1) && (physBitmap->pixmap_depth != 1))
{
+ wine_tsx11_lock();
/* Special case: a color pattern on a monochrome DC */
physDev->brush.pixmap = XCreatePixmap( gdi_display, root_window,
bitmap.bmWidth, bitmap.bmHeight, 1);
/* FIXME: should probably convert to monochrome instead */
XCopyPlane( gdi_display, physBitmap->pixmap, physDev->brush.pixmap,
get_bitmap_gc(1), 0, 0, bitmap.bmWidth, bitmap.bmHeight, 0, 0, 1 );
+ wine_tsx11_unlock();
}
else
{
- physDev->brush.pixmap = XCreatePixmap( gdi_display, root_window,
- bitmap.bmWidth, bitmap.bmHeight,
- physBitmap->pixmap_depth );
- XCopyArea( gdi_display, physBitmap->pixmap, physDev->brush.pixmap,
- get_bitmap_gc(physBitmap->pixmap_depth), 0, 0, bitmap.bmWidth,
bitmap.bmHeight, 0, 0 );
- }
- wine_tsx11_unlock();
+ /* XRender is needed because of possible depth conversion */
+ X11DRV_XRender_CopyBrush(physDev, physBitmap, bitmap.bmWidth, bitmap.bmHeight);
+ }
if (physBitmap->pixmap_depth > 1)
{
Modified: vendor/wine/dlls/winex11.drv/current/dib.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/dib…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/dib.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/dib.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -4749,11 +4749,13 @@
if(dib.dsBm.bmBitsPixel == 1)
{
physBitmap->pixmap_depth = 1;
+ physBitmap->trueColor = FALSE;
}
else
{
physBitmap->pixmap_depth = screen_depth;
physBitmap->pixmap_color_shifts = X11DRV_PALETTE_default_shifts;
+ physBitmap->trueColor = (visual->class == TrueColor || visual->class ==
DirectColor);
}
#ifdef HAVE_LIBXXSHM
physBitmap->shminfo.shmid = -1;
Modified: vendor/wine/dlls/winex11.drv/current/event.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/eve…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/event.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/event.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -511,6 +511,7 @@
if (IsWindowEnabled(hwnd))
{
HMENU hSysMenu;
+ POINT pt;
if (GetClassLongW(hwnd, GCL_STYLE) & CS_NOCLOSE) return;
hSysMenu = GetSystemMenu(hwnd, FALSE);
@@ -524,7 +525,7 @@
{
LRESULT ma = SendMessageW( hwnd, WM_MOUSEACTIVATE,
(WPARAM)GetAncestor( hwnd, GA_ROOT ),
- MAKELONG(HTCLOSE,WM_LBUTTONDOWN) );
+ MAKELPARAM( HTCLOSE, WM_NCLBUTTONDOWN ) );
switch(ma)
{
case MA_NOACTIVATEANDEAT:
@@ -541,7 +542,10 @@
break;
}
}
- PostMessageW( hwnd, WM_X11DRV_DELETE_WINDOW, 0, 0 );
+ /* Simulate clicking the caption Close button */
+ GetCursorPos( &pt );
+ PostMessageW( hwnd, WM_NCLBUTTONDOWN, HTCLOSE, MAKELPARAM( pt.x, pt.y ) );
+ PostMessageW( hwnd, WM_LBUTTONUP, HTCLOSE, MAKELPARAM( pt.x, pt.y ) );
}
}
else if (protocol == x11drv_atom(WM_TAKE_FOCUS))
Modified: vendor/wine/dlls/winex11.drv/current/palette.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/pal…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/palette.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/palette.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -101,7 +101,6 @@
static BOOL X11DRV_PALETTE_BuildPrivateMap( const PALETTEENTRY *sys_pal_template );
static BOOL X11DRV_PALETTE_BuildSharedMap( const PALETTEENTRY *sys_pal_template );
-static void X11DRV_PALETTE_ComputeShifts(unsigned long maskbits, ChannelShift *physical,
ChannelShift *to_logical);
static void X11DRV_PALETTE_FillDefaultColors( const PALETTEENTRY *sys_pal_template );
static void X11DRV_PALETTE_FormatSystemPalette(void);
static BOOL X11DRV_PALETTE_CheckSysColor( const PALETTEENTRY *sys_pal_template, COLORREF
c);
@@ -223,9 +222,7 @@
X11DRV_PALETTE_PaletteXColormap = XCreateColormap(gdi_display, root_window,
visual, AllocNone);
X11DRV_PALETTE_PaletteFlags |= X11DRV_PALETTE_FIXED;
- X11DRV_PALETTE_ComputeShifts(visual->red_mask,
&X11DRV_PALETTE_default_shifts.physicalRed,
&X11DRV_PALETTE_default_shifts.logicalRed);
- X11DRV_PALETTE_ComputeShifts(visual->green_mask,
&X11DRV_PALETTE_default_shifts.physicalGreen,
&X11DRV_PALETTE_default_shifts.logicalGreen);
- X11DRV_PALETTE_ComputeShifts(visual->blue_mask,
&X11DRV_PALETTE_default_shifts.physicalBlue,
&X11DRV_PALETTE_default_shifts.logicalBlue);
+ X11DRV_PALETTE_ComputeColorShifts(&X11DRV_PALETTE_default_shifts,
visual->red_mask, visual->green_mask, visual->blue_mask);
}
XFree(depths);
wine_tsx11_unlock();
@@ -281,11 +278,11 @@
}
/***********************************************************************
- * X11DRV_PALETTE_ComputeShifts
+ * X11DRV_PALETTE_ComputeChannelShift
*
- * Calculate conversion parameters for direct mapped visuals
- */
-static void X11DRV_PALETTE_ComputeShifts(unsigned long maskbits, ChannelShift *physical,
ChannelShift *to_logical)
+ * Calculate conversion parameters for a given color mask
+ */
+static void X11DRV_PALETTE_ComputeChannelShift(unsigned long maskbits, ChannelShift
*physical, ChannelShift *to_logical)
{
int i;
@@ -324,6 +321,18 @@
to_logical->scale=physical->scale;
to_logical->max=physical->max;
}
+}
+
+/***********************************************************************
+ * X11DRV_PALETTE_ComputeColorShifts
+ *
+ * Calculate conversion parameters for a given color
+ */
+void X11DRV_PALETTE_ComputeColorShifts(ColorShifts *shifts, unsigned long redMask,
unsigned long greenMask, unsigned long blueMask)
+{
+ X11DRV_PALETTE_ComputeChannelShift(redMask, &shifts->physicalRed,
&shifts->logicalRed);
+ X11DRV_PALETTE_ComputeChannelShift(greenMask, &shifts->physicalGreen,
&shifts->logicalGreen);
+ X11DRV_PALETTE_ComputeChannelShift(blueMask, &shifts->physicalBlue,
&shifts->logicalBlue);
}
/***********************************************************************
@@ -782,10 +791,6 @@
COLORREF X11DRV_PALETTE_ToLogical(X11DRV_PDEVICE *physDev, int pixel)
{
XColor color;
- ColorShifts *shifts = &X11DRV_PALETTE_default_shifts;
-
- if(physDev->color_shifts)
- shifts = physDev->color_shifts;
#if 0
/* truecolor visual */
@@ -797,6 +802,11 @@
if ( (X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_FIXED) &&
!X11DRV_PALETTE_Graymax )
{
+ ColorShifts *shifts = &X11DRV_PALETTE_default_shifts;
+
+ if(physDev->color_shifts)
+ shifts = physDev->color_shifts;
+
color.red = (pixel >> shifts->logicalRed.shift) &
shifts->logicalRed.max;
if (shifts->logicalRed.scale<8)
color.red= color.red << (8-shifts->logicalRed.scale) |
Modified: vendor/wine/dlls/winex11.drv/current/window.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/win…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/window.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/window.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -2308,8 +2308,6 @@
{
case WM_X11DRV_ACQUIRE_SELECTION:
return X11DRV_AcquireClipboard( hwnd );
- case WM_X11DRV_DELETE_WINDOW:
- return SendMessageW( hwnd, WM_SYSCOMMAND, SC_CLOSE, 0 );
case WM_X11DRV_SET_WIN_FORMAT:
return set_win_format( hwnd, (XID)wp );
case WM_X11DRV_SET_WIN_REGION:
Modified: vendor/wine/dlls/winex11.drv/current/x11drv.h
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/x11…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/x11drv.h [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/x11drv.h [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -124,6 +124,7 @@
XImage *image; /* cached XImage */
int *colorMap; /* color map info */
int nColorMap;
+ BOOL trueColor;
CRITICAL_SECTION lock; /* GDI access lock */
enum x11drv_shm_mode shm_mode;
#ifdef HAVE_LIBXXSHM
@@ -286,6 +287,7 @@
extern void X11DRV_XRender_Finalize(void);
extern BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE*, HFONT);
extern void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE*);
+extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap,
int width, int height);
extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR wstr,
UINT count, const INT *lpDx);
@@ -493,6 +495,7 @@
extern COLORREF X11DRV_PALETTE_ToLogical(X11DRV_PDEVICE *physDev, int pixel);
extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color);
extern int X11DRV_PALETTE_LookupPixel(COLORREF color);
+extern void X11DRV_PALETTE_ComputeColorShifts(ColorShifts *shifts, unsigned long redMask,
unsigned long greenMask, unsigned long blueMask);
extern unsigned int depth_to_bpp( unsigned int depth );
@@ -700,7 +703,6 @@
enum x11drv_window_messages
{
WM_X11DRV_ACQUIRE_SELECTION = 0x80001000,
- WM_X11DRV_DELETE_WINDOW,
WM_X11DRV_SET_WIN_FORMAT,
WM_X11DRV_SET_WIN_REGION,
WM_X11DRV_RESIZE_DESKTOP
Modified: vendor/wine/dlls/winex11.drv/current/xrender.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/xre…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/xrender.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/xrender.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -427,23 +427,41 @@
return NULL;
}
-static WineXRenderFormat *get_xrender_format_from_pdevice(X11DRV_PDEVICE *physDev)
-{
- WXRFormat format;
-
- switch(physDev->depth)
- {
- case 1:
- format = WXR_FORMAT_MONO;
- break;
- default:
- /* For now fall back to the format of the default visual.
- In the future we should check if we are using a DDB/DIB and what exact
format we need.
- */
- return default_format;
- }
-
- return get_xrender_format(format);
+static WineXRenderFormat *get_xrender_format_from_color_shifts(int depth, ColorShifts
*shifts)
+{
+ int redMask, greenMask, blueMask;
+ unsigned int i;
+
+ if(depth == 1)
+ return get_xrender_format(WXR_FORMAT_MONO);
+
+ /* physDevs of a depth <=8, don't have color_shifts set and XRender can't
handle those except for 1-bit */
+ if(!shifts)
+ return default_format;
+
+ redMask = shifts->physicalRed.max << shifts->physicalRed.shift;
+ greenMask = shifts->physicalGreen.max << shifts->physicalGreen.shift;
+ blueMask = shifts->physicalBlue.max << shifts->physicalBlue.shift;
+
+ /* Try to locate a format which matches the specification of the dibsection. */
+ for(i = 0; i < (sizeof(wxr_formats_template) / sizeof(wxr_formats_template[0]));
i++)
+ {
+ if( depth == wxr_formats_template[i].depth &&
+ redMask == (wxr_formats_template[i].redMask <<
wxr_formats_template[i].red) &&
+ greenMask == (wxr_formats_template[i].greenMask <<
wxr_formats_template[i].green) &&
+ blueMask == (wxr_formats_template[i].blueMask <<
wxr_formats_template[i].blue) )
+
+ {
+ /* When we reach this stage the format was found in our template table but
this doesn't mean that
+ * the Xserver also supports this format (e.g. its depth might be too low).
The call below verifies that.
+ */
+ return get_xrender_format(wxr_formats_template[i].wxr_format);
+ }
+ }
+
+ /* This should not happen because when we reach 'shifts' must have been set
and we only allows shifts which are backed by X */
+ ERR("No XRender format found!\n");
+ return NULL;
}
static BOOL fontcmp(LFANDSIZE *p1, LFANDSIZE *p2)
@@ -1381,7 +1399,7 @@
unsigned int idx;
double cosEsc, sinEsc;
LOGFONTW lf;
- WineXRenderFormat *dst_format = get_xrender_format_from_pdevice(physDev);
+ WineXRenderFormat *dst_format =
get_xrender_format_from_color_shifts(physDev->depth, physDev->color_shifts);
Picture tile_pict = 0;
/* Do we need to disable antialiasing because of palette mode? */
@@ -1787,7 +1805,7 @@
POINT pts[2];
BOOL top_down = FALSE;
RGNDATA *rgndata;
- WineXRenderFormat *dst_format = get_xrender_format_from_pdevice(devDst);
+ WineXRenderFormat *dst_format =
get_xrender_format_from_color_shifts(devDst->depth, devDst->color_shifts);
WineXRenderFormat *src_format;
int repeat_src;
@@ -1816,14 +1834,10 @@
heightSrc = pts[1].y - pts[0].y;
if (!widthDst || !heightDst || !widthSrc || !heightSrc) return TRUE;
- /* If the source is a 1x1 bitmap, tiling is equivalent to stretching, but
- tiling is much faster. Therefore, we do no stretching in this case. */
- repeat_src = widthSrc == 1 && heightSrc == 1;
-
#ifndef HAVE_XRENDERSETPICTURETRANSFORM
- if((widthDst != widthSrc || heightDst != heightSrc) && !repeat_src)
+ if(widthDst != widthSrc || heightDst != heightSrc)
#else
- if(!pXRenderSetPictureTransform && !repeat_src)
+ if(!pXRenderSetPictureTransform)
#endif
{
FIXME("Unable to Stretch, XRenderSetPictureTransform is currently
required\n");
@@ -1840,6 +1854,10 @@
}
return FALSE;
}
+
+ /* If the source is a 1x1 bitmap, tiling is equivalent to stretching, but
+ tiling is much faster. Therefore, we do no stretching in this case. */
+ repeat_src = dib.dsBmih.biWidth == 1 && abs(dib.dsBmih.biHeight) == 1;
if (xSrc < 0 || ySrc < 0 || widthSrc < 0 || heightSrc < 0 || xSrc +
widthSrc > dib.dsBmih.biWidth
|| ySrc + heightSrc > abs(dib.dsBmih.biHeight))
@@ -1948,7 +1966,10 @@
/* Make sure we ALWAYS set the transformation matrix even if we don't need to
scale. The reason is
* that later on we want to reuse pictures (it can bring a lot of extra performance)
and each time
* a different transformation matrix might have been used. */
- set_xrender_transformation(src_pict, widthSrc/(double)widthDst,
heightSrc/(double)heightDst, 0, 0);
+ if (repeat_src)
+ set_xrender_transformation(src_pict, 1.0, 1.0, 0, 0);
+ else
+ set_xrender_transformation(src_pict, widthSrc/(double)widthDst,
heightSrc/(double)heightDst, 0, 0);
pXRenderComposite(gdi_display, PictOpOver, src_pict, 0, dst_pict,
0, 0, 0, 0,
xDst + devDst->dc_rect.left, yDst + devDst->dc_rect.top,
widthDst, heightDst);
@@ -1966,6 +1987,40 @@
return TRUE;
}
+void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int
width, int height)
+{
+ /* At depths >1, the depth of physBitmap and physDev might not be the same e.g.
the physbitmap might be a 16-bit DIB while the physdev uses 24-bit */
+ int depth = physBitmap->pixmap_depth == 1 ? 1 : physDev->depth;
+
+ wine_tsx11_lock();
+ physDev->brush.pixmap = XCreatePixmap(gdi_display, root_window, width, height,
depth);
+
+ /* Use XCopyArea when the physBitmap and brush.pixmap have the same depth. */
+ if(physBitmap->pixmap_depth == 1 || physDev->depth ==
physBitmap->pixmap_depth)
+ {
+ XCopyArea( gdi_display, physBitmap->pixmap, physDev->brush.pixmap,
+ get_bitmap_gc(physBitmap->pixmap_depth), 0, 0, width, height, 0, 0
);
+ }
+ else /* We meed depth conversion */
+ {
+ WineXRenderFormat *src_format =
get_xrender_format_from_color_shifts(physBitmap->pixmap_depth,
&physBitmap->pixmap_color_shifts);
+ WineXRenderFormat *dst_format =
get_xrender_format_from_color_shifts(physDev->depth, physDev->color_shifts);
+
+ Picture src_pict, dst_pict;
+ XRenderPictureAttributes pa;
+ pa.subwindow_mode = IncludeInferiors;
+ pa.repeat = RepeatNone;
+
+ src_pict = pXRenderCreatePicture(gdi_display, physBitmap->pixmap,
src_format->pict_format, CPSubwindowMode|CPRepeat, &pa);
+ dst_pict = pXRenderCreatePicture(gdi_display, physDev->brush.pixmap,
dst_format->pict_format, CPSubwindowMode|CPRepeat, &pa);
+
+ xrender_blit(src_pict, 0, dst_pict, 0, 0, 1.0, 1.0, width, height);
+ pXRenderFreePicture(gdi_display, src_pict);
+ pXRenderFreePicture(gdi_display, dst_pict);
+ }
+ wine_tsx11_unlock();
+}
+
BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE
*physDevDst,
Pixmap pixmap, GC gc,
INT widthSrc, INT heightSrc,
@@ -1977,8 +2032,8 @@
int height = visRectDst->bottom - visRectDst->top;
int x_src = physDevSrc->dc_rect.left + visRectSrc->left;
int y_src = physDevSrc->dc_rect.top + visRectSrc->top;
- WineXRenderFormat *src_format = get_xrender_format_from_pdevice(physDevSrc);
- WineXRenderFormat *dst_format = get_xrender_format_from_pdevice(physDevDst);
+ WineXRenderFormat *src_format =
get_xrender_format_from_color_shifts(physDevSrc->depth, physDevSrc->color_shifts);
+ WineXRenderFormat *dst_format =
get_xrender_format_from_color_shifts(physDevDst->depth, physDevDst->color_shifts);
Picture src_pict=0, dst_pict=0, mask_pict=0;
double xscale = widthSrc/(double)widthDst;
@@ -2107,6 +2162,16 @@
return FALSE;
}
+void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int
width, int height)
+{
+ wine_tsx11_lock();
+ physDev->brush.pixmap = XCreatePixmap(gdi_display, root_window, width, height,
physBitmap->pixmap_depth);
+
+ XCopyArea( gdi_display, physBitmap->pixmap, physDev->brush.pixmap,
+ get_bitmap_gc(physBitmap->pixmap_depth), 0, 0, width, height, 0, 0 );
+ wine_tsx11_unlock();
+}
+
BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE
*physDevDst,
Pixmap pixmap, GC gc,
INT widthSrc, INT heightSrc,
Modified: vendor/wine/dlls/winex11.drv/current/xvidmode.c
URL:
http://svn.reactos.org/svn/reactos/vendor/wine/dlls/winex11.drv/current/xvi…
==============================================================================
--- vendor/wine/dlls/winex11.drv/current/xvidmode.c [iso-8859-1] (original)
+++ vendor/wine/dlls/winex11.drv/current/xvidmode.c [iso-8859-1] Fri Sep 25 20:32:41 2009
@@ -29,6 +29,9 @@
#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
#include <X11/extensions/xf86vmode.h>
+#endif
+#ifdef HAVE_X11_EXTENSIONS_XF86VMPROTO_H
+#include <X11/extensions/xf86vmproto.h>
#endif
#include "xvidmode.h"