Author: akhaldi Date: Thu Dec 13 13:10:17 2012 New Revision: 57901
URL: http://svn.reactos.org/svn/reactos?rev=57901&view=rev Log: [RICHED20] * Sync with Wine 1.5.19.
Modified: trunk/reactos/dll/win32/riched20/context.c trunk/reactos/dll/win32/riched20/editor.c trunk/reactos/dll/win32/riched20/editor.h trunk/reactos/dll/win32/riched20/editstr.h trunk/reactos/dll/win32/riched20/paint.c trunk/reactos/dll/win32/riched20/para.c trunk/reactos/dll/win32/riched20/reader.c trunk/reactos/dll/win32/riched20/style.c trunk/reactos/dll/win32/riched20/table.c trunk/reactos/dll/win32/riched20/txthost.c trunk/reactos/dll/win32/riched20/wrap.c trunk/reactos/dll/win32/riched20/writer.c trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/dll/win32/riched20/context.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/context.... ============================================================================== --- trunk/reactos/dll/win32/riched20/context.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/context.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -22,12 +22,10 @@
void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) { - c->nSequence = editor->nSequence++; c->hDC = hDC; c->editor = editor; c->pt.x = 0; c->pt.y = 0; - c->hbrMargin = CreateSolidBrush(RGB(224,224,224)); c->rcView = editor->rcFormat; if (hDC) { c->dpi.cx = GetDeviceCaps(hDC, LOGPIXELSX); @@ -44,5 +42,4 @@ void ME_DestroyContext(ME_Context *c) { if (c->hDC) ITextHost_TxReleaseDC(c->editor->texthost, c->hDC); - DeleteObject(c->hbrMargin); }
Modified: trunk/reactos/dll/win32/riched20/editor.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/editor.c... ============================================================================== --- trunk/reactos/dll/win32/riched20/editor.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/editor.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -283,14 +283,16 @@
static LRESULT ME_StreamInText(ME_TextEditor *editor, DWORD dwFormat, ME_InStream *stream, ME_Style *style) { - WCHAR wszText[STREAMIN_BUFFER_SIZE+1]; WCHAR *pText; LRESULT total_bytes_read = 0; + BOOL is_read = FALSE; + static const char bom_utf8[] = {0xEF, 0xBB, 0xBF};
TRACE("%08x %p\n", dwFormat, stream);
do { LONG nWideChars = 0; + WCHAR wszText[STREAMIN_BUFFER_SIZE+1];
if (!stream->dwSize) { @@ -304,8 +306,22 @@
if (!(dwFormat & SF_UNICODE)) { - /* FIXME? this is doomed to fail on true MBCS like UTF-8, luckily they're unlikely to be used as CP_ACP */ - nWideChars = MultiByteToWideChar(CP_ACP, 0, stream->buffer, stream->dwSize, wszText, STREAMIN_BUFFER_SIZE); + char * buf = stream->buffer; + DWORD size = stream->dwSize; + DWORD cp = CP_ACP; + + if (!is_read) + { + is_read = TRUE; + if (stream->dwSize >= 3 && !memcmp(stream->buffer, bom_utf8, 3)) + { + cp = CP_UTF8; + buf += 3; + size -= 3; + } + } + + nWideChars = MultiByteToWideChar(cp, 0, buf, size, wszText, STREAMIN_BUFFER_SIZE); pText = wszText; } else @@ -2687,7 +2703,6 @@ ed->nLastTotalLength = ed->nTotalLength = 0; ed->nLastTotalWidth = ed->nTotalWidth = 0; ed->nUDArrowX = -1; - ed->nSequence = 0; ed->rgbBackColor = -1; ed->hbrBackground = GetSysColorBrush(COLOR_WINDOW); ed->bCaretAtEnd = FALSE; @@ -2794,8 +2809,8 @@ if (editor->rgbBackColor != -1) DeleteObject(editor->hbrBackground); if(editor->lpOleCallback) - IUnknown_Release(editor->lpOleCallback); - IUnknown_Release(editor->texthost); + IRichEditOleCallback_Release(editor->lpOleCallback); + ITextHost_Release(editor->texthost); OleUninitialize();
FREE_OBJ(editor->pBuffer); @@ -3592,6 +3607,7 @@ return FALSE; } case WM_PASTE: + case WM_MBUTTONDOWN: ME_Paste(editor); return 0; case WM_CUT: @@ -4311,10 +4327,10 @@ } case EM_SETOLECALLBACK: if(editor->lpOleCallback) - IUnknown_Release(editor->lpOleCallback); - editor->lpOleCallback = (LPRICHEDITOLECALLBACK)lParam; + IRichEditOleCallback_Release(editor->lpOleCallback); + editor->lpOleCallback = (IRichEditOleCallback*)lParam; if(editor->lpOleCallback) - IUnknown_AddRef(editor->lpOleCallback); + IRichEditOleCallback_AddRef(editor->lpOleCallback); return TRUE; case EM_GETWORDBREAKPROC: return (LRESULT)editor->pfnWordBreak;
Modified: trunk/reactos/dll/win32/riched20/editor.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/editor.h... ============================================================================== --- trunk/reactos/dll/win32/riched20/editor.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/editor.h [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -187,7 +187,7 @@
/* wrap.c */ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) DECLSPEC_HIDDEN; -void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor, ME_DisplayItem *start_para, ME_DisplayItem *end_para) DECLSPEC_HIDDEN; +void ME_InvalidateParagraphRange(ME_TextEditor *editor, ME_DisplayItem *start_para, ME_DisplayItem *last_para) DECLSPEC_HIDDEN; void ME_SendRequestResize(ME_TextEditor *editor, BOOL force) DECLSPEC_HIDDEN;
/* para.c */ @@ -201,8 +201,6 @@ void ME_DumpParaStyleToBuf(const PARAFORMAT2 *pFmt, char buf[2048]) DECLSPEC_HIDDEN; BOOL ME_SetSelectionParaFormat(ME_TextEditor *editor, const PARAFORMAT2 *pFmt) DECLSPEC_HIDDEN; void ME_GetSelectionParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt) DECLSPEC_HIDDEN; -/* marks from first up to (but not including) last */ -void ME_MarkForPainting(ME_TextEditor *editor, ME_DisplayItem *first, const ME_DisplayItem *last) DECLSPEC_HIDDEN; void ME_MarkAllForWrapping(ME_TextEditor *editor) DECLSPEC_HIDDEN; void ME_SetDefaultParaFormat(PARAFORMAT2 *pFmt) DECLSPEC_HIDDEN;
@@ -261,6 +259,7 @@ ME_DisplayItem *ME_InsertTableRowEndFromCursor(ME_TextEditor *editor) DECLSPEC_HIDDEN; ME_DisplayItem *ME_GetTableRowEnd(ME_DisplayItem *para) DECLSPEC_HIDDEN; ME_DisplayItem *ME_GetTableRowStart(ME_DisplayItem *para) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_GetOuterParagraph(ME_DisplayItem *para) DECLSPEC_HIDDEN; void ME_CheckTablesForCorruption(ME_TextEditor *editor) DECLSPEC_HIDDEN; void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars) DECLSPEC_HIDDEN; ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, ME_DisplayItem *table_row) DECLSPEC_HIDDEN;
Modified: trunk/reactos/dll/win32/riched20/editstr.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/editstr.... ============================================================================== --- trunk/reactos/dll/win32/riched20/editstr.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/editstr.h [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -67,7 +67,6 @@ HFONT hFont; /* cached font for the style */ TEXTMETRICW tm; /* cached font metrics for the style */ int nRefs; /* reference count */ - int nSequence; /* incremented when cache needs to be rebuilt, ie. every screen redraw */ } ME_Style;
typedef enum { @@ -139,7 +138,6 @@
/* this paragraph was already wrapped and hasn't changed, every change resets that flag */ #define MEPF_REWRAP 0x01 -#define MEPF_REPAINT 0x02 /* v4.1 */ #define MEPF_CELL 0x04 /* The paragraph is nested in a cell */ #define MEPF_ROWSTART 0x08 /* Hidden empty paragraph at the start of the row */ @@ -186,7 +184,6 @@ int nFlags; POINT pt; int nHeight, nWidth; - int nLastPaintYPos, nLastPaintHeight; int nRows; struct tagME_DisplayItem *prev_para, *next_para; } ME_Paragraph; @@ -335,7 +332,6 @@ int nTotalWidth, nLastTotalWidth; int nAvailWidth; /* 0 = wrap to client area, else wrap width in twips */ int nUDArrowX; - int nSequence; COLORREF rgbBackColor; HBRUSH hbrBackground; BOOL bCaretAtEnd; @@ -385,16 +381,12 @@ { HDC hDC; POINT pt; - POINT ptRowOffset; RECT rcView; - HBRUSH hbrMargin; SIZE dpi; int nAvailWidth;
/* those are valid inside ME_WrapTextParagraph and related */ - POINT ptFirstRun; ME_TextEditor *editor; - int nSequence; } ME_Context;
typedef struct tagME_WrapContext
Modified: trunk/reactos/dll/win32/riched20/paint.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/paint.c?... ============================================================================== --- trunk/reactos/dll/win32/riched20/paint.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/paint.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -41,7 +41,6 @@ IntersectClipRect(hDC, rcUpdate->left, rcUpdate->top, rcUpdate->right, rcUpdate->bottom);
- editor->nSequence++; ME_InitContext(&c, editor, hDC); SetBkMode(hDC, TRANSPARENT); ME_MoveCaret(editor); @@ -1275,32 +1274,29 @@ * they can point past the end of the document */ if (editor->nLastSelStart > len || editor->nLastSelEnd > len) { repaint_start = ME_FindItemFwd(editor->pBuffer->pFirst, diParagraph); - repaint_end = editor->pBuffer->pLast; - ME_MarkForPainting(editor, repaint_start, repaint_end); + repaint_end = editor->pBuffer->pLast->member.para.prev_para; } else { /* if the start part of selection is being expanded or contracted... */ if (nStart < editor->nLastSelStart) { repaint_start = sel_start; - repaint_end = editor->pLastSelStartPara->member.para.next_para; + repaint_end = editor->pLastSelStartPara; } else if (nStart > editor->nLastSelStart) { repaint_start = editor->pLastSelStartPara; - repaint_end = sel_start->member.para.next_para; - } - ME_MarkForPainting(editor, repaint_start, repaint_end); + repaint_end = sel_start; + }
/* if the end part of selection is being contracted or expanded... */ if (nEnd < editor->nLastSelEnd) { if (!repaint_start) repaint_start = sel_end; - repaint_end = editor->pLastSelEndPara->member.para.next_para; - ME_MarkForPainting(editor, sel_end, repaint_end); + repaint_end = editor->pLastSelEndPara; } else if (nEnd > editor->nLastSelEnd) { if (!repaint_start) repaint_start = editor->pLastSelEndPara; - repaint_end = sel_end->member.para.next_para; - ME_MarkForPainting(editor, editor->pLastSelEndPara, repaint_end); - } - } - - ME_InvalidateMarkedParagraphs(editor, repaint_start, repaint_end); + repaint_end = sel_end; + } + } + + if (repaint_start) + ME_InvalidateParagraphRange(editor, repaint_start, repaint_end); /* remember the last invalidated position */ ME_GetSelectionOfs(editor, &editor->nLastSelStart, &editor->nLastSelEnd); ME_GetSelectionParas(editor, &editor->pLastSelStartPara, &editor->pLastSelEndPara);
Modified: trunk/reactos/dll/win32/riched20/para.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/para.c?r... ============================================================================== --- trunk/reactos/dll/win32/riched20/para.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/para.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -92,15 +92,6 @@ void ME_MarkAllForWrapping(ME_TextEditor *editor) { ME_MarkForWrapping(editor, editor->pBuffer->pFirst->member.para.next_para, editor->pBuffer->pLast); -} - -void ME_MarkForPainting(ME_TextEditor *editor, ME_DisplayItem *first, const ME_DisplayItem *last) -{ - while(first != last && first) - { - first->member.para.nFlags |= MEPF_REPAINT; - first = first->member.para.next_para; - } }
static void ME_UpdateTableFlags(ME_DisplayItem *para)
Modified: trunk/reactos/dll/win32/riched20/reader.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/reader.c... ============================================================================== --- trunk/reactos/dll/win32/riched20/reader.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/reader.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -2397,8 +2397,11 @@ font = RTFGetFont(info, info->rtfParam); if (font) { - if (info->ansiCodePage != CP_UTF8) + if (info->ansiCodePage != CP_UTF8 && info->codePage != font->rtfFCodePage) + { + RTFFlushOutputBuffer(info); info->codePage = font->rtfFCodePage; + } TRACE("font %d codepage %d\n", info->rtfParam, info->codePage); } else
Modified: trunk/reactos/dll/win32/riched20/style.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/style.c?... ============================================================================== --- trunk/reactos/dll/win32/riched20/style.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/style.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -41,7 +41,7 @@ CopyMemory(to, f, FIELD_OFFSET(CHARFORMATA, szFaceName)); to->cbSize = sizeof(CHARFORMAT2W); if (f->dwMask & CFM_FACE) { - MultiByteToWideChar(0, 0, f->szFaceName, -1, to->szFaceName, sizeof(to->szFaceName)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, f->szFaceName, -1, to->szFaceName, sizeof(to->szFaceName)/sizeof(WCHAR)); } return to; } @@ -61,7 +61,7 @@ CopyMemory(to, f, FIELD_OFFSET(CHARFORMATA, szFaceName)); /* convert face name */ if (f->dwMask & CFM_FACE) - MultiByteToWideChar(0, 0, f->szFaceName, -1, to->szFaceName, sizeof(to->szFaceName)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, f->szFaceName, -1, to->szFaceName, sizeof(to->szFaceName)/sizeof(WCHAR)); /* copy the rest of the 2A structure to 2W */ CopyMemory(&to->wWeight, &f->wWeight, sizeof(CHARFORMAT2A)-FIELD_OFFSET(CHARFORMAT2A, wWeight)); to->cbSize = sizeof(CHARFORMAT2W); @@ -78,7 +78,7 @@ { CHARFORMATA *t = (CHARFORMATA *)to; CopyMemory(t, from, FIELD_OFFSET(CHARFORMATA, szFaceName)); - WideCharToMultiByte(0, 0, from->szFaceName, -1, t->szFaceName, sizeof(t->szFaceName), 0, 0); + WideCharToMultiByte(CP_ACP, 0, from->szFaceName, -1, t->szFaceName, sizeof(t->szFaceName), NULL, NULL); if (from->dwMask & CFM_UNDERLINETYPE) { switch (from->bUnderlineType) @@ -123,7 +123,7 @@ /* copy the A structure without face name */ CopyMemory(t, from, FIELD_OFFSET(CHARFORMATA, szFaceName)); /* convert face name */ - WideCharToMultiByte(0, 0, from->szFaceName, -1, t->szFaceName, sizeof(t->szFaceName), 0, 0); + WideCharToMultiByte(CP_ACP, 0, from->szFaceName, -1, t->szFaceName, sizeof(t->szFaceName), NULL, NULL); /* copy the rest of the 2A structure to 2W */ CopyMemory(&t->wWeight, &from->wWeight, sizeof(CHARFORMAT2W)-FIELD_OFFSET(CHARFORMAT2W,wWeight)); t->cbSize = sizeof(*t); /* it was overwritten by CopyMemory */ @@ -145,7 +145,6 @@
assert(style->cbSize == sizeof(CHARFORMAT2W)); s->fmt = *style; - s->nSequence = -2; s->nRefs = 1; s->hFont = NULL; memset(&s->tm, 0, sizeof(s->tm));
Modified: trunk/reactos/dll/win32/riched20/table.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/table.c?... ============================================================================== --- trunk/reactos/dll/win32/riched20/table.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/table.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -169,6 +169,20 @@
para = ME_FindItemBack(cell, diParagraph); assert(para && para->member.para.nFlags & MEPF_ROWSTART); + return para; +} + +ME_DisplayItem* ME_GetOuterParagraph(ME_DisplayItem *para) +{ + if (para->member.para.nFlags & MEPF_ROWEND) + para = para->member.para.prev_para; + while (para->member.para.pCell) + { + para = ME_GetTableRowStart(para); + if (!para->member.para.pCell) + break; + para = ME_FindItemBack(para->member.para.pCell, diParagraph); + } return para; }
Modified: trunk/reactos/dll/win32/riched20/txthost.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/txthost.... ============================================================================== --- trunk/reactos/dll/win32/riched20/txthost.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/txthost.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -141,8 +141,7 @@ DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetScrollPos(ITextHost *iface, INT fnBar, INT nPos, BOOL fRedraw) { ITextHostImpl *This = impl_from_ITextHost(iface); - int pos = SetScrollPos(This->hWnd, fnBar, nPos, fRedraw); - return (pos ? TRUE : FALSE); + return SetScrollPos(This->hWnd, fnBar, nPos, fRedraw) != 0; }
DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxInvalidateRect(ITextHost *iface, LPCRECT prc, BOOL fMode)
Modified: trunk/reactos/dll/win32/riched20/wrap.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/wrap.c?r... ============================================================================== --- trunk/reactos/dll/win32/riched20/wrap.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/wrap.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -589,8 +589,7 @@ { if (!*repaint_start) *repaint_start = para; - *repaint_end = para->member.para.next_para; - para->member.para.nFlags |= MEPF_REPAINT; + *repaint_end = para; }
BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) @@ -738,42 +737,35 @@ ME_DestroyContext(&c);
if (repaint_start || editor->nTotalLength < editor->nLastTotalLength) - { - if (!repaint_start) repaint_start = editor->pBuffer->pFirst; - ME_InvalidateMarkedParagraphs(editor, repaint_start, repaint_end); - } + ME_InvalidateParagraphRange(editor, repaint_start, repaint_end); return !!repaint_start; }
-void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor, - ME_DisplayItem *start_para, - ME_DisplayItem *end_para) +void ME_InvalidateParagraphRange(ME_TextEditor *editor, + ME_DisplayItem *start_para, + ME_DisplayItem *last_para) { ME_Context c; RECT rc; int ofs; - ME_DisplayItem *item;
ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost)); rc = c.rcView; ofs = editor->vert_si.nPos;
- item = start_para; - while(item && item != end_para) { - if (item->member.para.nFlags & MEPF_REPAINT) { - rc.top = c.rcView.top + item->member.para.pt.y - ofs; - rc.bottom = max(rc.top + item->member.para.nHeight, c.rcView.bottom); - ITextHost_TxInvalidateRect(editor->texthost, &rc, TRUE); - item->member.para.nFlags &= ~MEPF_REPAINT; - } - item = item->member.para.next_para; + if (start_para) { + start_para = ME_GetOuterParagraph(start_para); + last_para = ME_GetOuterParagraph(last_para); + rc.top = c.rcView.top + start_para->member.para.pt.y - ofs; + } else { + rc.top = c.rcView.top + editor->nTotalLength - ofs; } if (editor->nTotalLength < editor->nLastTotalLength) - { - rc.top = c.rcView.top + editor->nTotalLength - ofs; rc.bottom = c.rcView.top + editor->nLastTotalLength - ofs; - ITextHost_TxInvalidateRect(editor->texthost, &rc, TRUE); - } + else + rc.bottom = c.rcView.top + last_para->member.para.pt.y + last_para->member.para.nHeight - ofs; + ITextHost_TxInvalidateRect(editor->texthost, &rc, TRUE); + ME_DestroyContext(&c); }
Modified: trunk/reactos/dll/win32/riched20/writer.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/writer.c... ============================================================================== --- trunk/reactos/dll/win32/riched20/writer.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/riched20/writer.c [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -251,11 +251,8 @@ } while (item); item = ME_GetParagraph(pFirstRun); do { - if (item->member.para.pCell && item->member.para.pCell) + if ((pCell = item->member.para.pCell)) { - pCell = item->member.para.pCell; - if (pCell) - { ME_Border* borders[4] = { &pCell->member.cell.border.top, &pCell->member.cell.border.left, &pCell->member.cell.border.bottom, @@ -275,7 +272,6 @@ } } } - } } if (item == pLastPara) break;
Modified: trunk/reactos/media/doc/README.WINE URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=5... ============================================================================== --- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original) +++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Thu Dec 13 13:10:17 2012 @@ -148,7 +148,7 @@ reactos/dll/win32/query # Synced to Wine-1.5.19 reactos/dll/win32/rasapi32 # Synced to Wine-1.5.4 reactos/dll/win32/resutils # Synced to Wine-1.5.19 -reactos/dll/win32/riched20 # Synced to Wine-1.5.4 +reactos/dll/win32/riched20 # Synced to Wine-1.5.19 reactos/dll/win32/riched32 # Synced to Wine-1.5.19 reactos/dll/win32/rpcrt4 # Synced to Wine-1.3.26 reactos/dll/win32/rsabase # Autosync