Commit 3fe20bdc authored by Dylan Smith's avatar Dylan Smith Committed by Alexandre Julliard

richedit: Handle to parent window is cached.

The parent window for the richedit control on creation is the one that receives notify messages, even after the parent has been changed using SetParent.
parent 992381b3
......@@ -2035,14 +2035,14 @@ ME_FilterEvent(ME_TextEditor *editor, UINT msg, WPARAM* wParam, LPARAM* lParam)
{
MSGFILTER msgf;
if (!editor->hWnd) return FALSE;
if (!editor->hWnd || !editor->hwndParent) return FALSE;
msgf.nmhdr.hwndFrom = editor->hWnd;
msgf.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID);
msgf.nmhdr.code = EN_MSGFILTER;
msgf.msg = msg;
msgf.wParam = *wParam;
msgf.lParam = *lParam;
if (SendMessageW(GetParent(editor->hWnd), WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf))
if (SendMessageW(editor->hwndParent, WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf))
return FALSE;
*wParam = msgf.wParam;
*lParam = msgf.lParam;
......@@ -2598,7 +2598,7 @@ static BOOL ME_ShowContextMenu(ME_TextEditor *editor, int x, int y)
}
if(SUCCEEDED(IRichEditOleCallback_GetContextMenu(editor->lpOleCallback, seltype, NULL, &selrange, &menu)))
{
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, GetParent(editor->hWnd), NULL);
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, editor->hwndParent, NULL);
DestroyMenu(menu);
}
return TRUE;
......@@ -2612,6 +2612,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
LONG selbarwidth;
ed->hWnd = NULL;
ed->hwndParent = NULL;
ed->texthost = texthost;
ed->bEmulateVersion10 = bEmulateVersion10;
ITextHost_TxGetPropertyBits(texthost,
......@@ -4369,7 +4370,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
ITextHost *texthost;
TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style);
texthost = ME_CreateTextHost(hWnd, FALSE);
texthost = ME_CreateTextHost(hWnd, pcs, FALSE);
return texthost != NULL;
}
else if (msg != WM_NCDESTROY)
......@@ -4499,7 +4500,7 @@ LRESULT WINAPI RichEdit10ANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM
CREATESTRUCTW *pcs = (CREATESTRUCTW *)lParam;
TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style);
texthost = ME_CreateTextHost(hWnd, TRUE);
texthost = ME_CreateTextHost(hWnd, pcs, TRUE);
return texthost != NULL;
}
return RichEditANSIWndProc(hWnd, msg, wParam, lParam);
......
......@@ -271,7 +271,7 @@ struct RTFTable *ME_MakeTableDef(ME_TextEditor *editor);
void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef);
/* txthost.c */
ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10);
ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10);
#ifdef __i386__ /* Use wrappers to perform thiscall on i386 */
#define TXTHOST_VTABLE(This) (&itextHostStdcallVtbl)
#else /* __i386__ */
......
......@@ -326,7 +326,7 @@ typedef struct tagME_FontCacheItem
typedef struct tagME_TextEditor
{
HWND hWnd;
HWND hWnd, hwndParent;
ITextHost *texthost;
BOOL bEmulateVersion10;
ME_TextBuffer *pBuffer;
......
......@@ -5741,7 +5741,7 @@ static void test_WM_NOTIFY(void)
SetWindowLongPtr(hwndRichedit_WM_NOTIFY, GWLP_HWNDPARENT, 0);
SendMessage(hwndRichedit_WM_NOTIFY, WM_KEYDOWN, VK_RIGHT, 0);
SendMessage(hwndRichedit_WM_NOTIFY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
todo_wine ok(sel_start == 1 && sel_end == 1,
ok(sel_start == 1 && sel_end == 1,
"selections is incorrectly at (%d,%d)\n", sel_start, sel_end);
DestroyWindow(hwndRichedit_WM_NOTIFY);
......
......@@ -44,7 +44,7 @@ typedef struct ITextHostImpl {
static const ITextHostVtbl textHostVtbl;
ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10)
ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10)
{
ITextHostImpl *texthost;
texthost = CoTaskMemAlloc(sizeof(*texthost));
......@@ -60,6 +60,7 @@ ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10)
editor = ME_MakeEditor((ITextHost*)texthost, bEmulateVersion10);
editor->exStyleFlags = GetWindowLongW(hwnd, GWL_EXSTYLE);
editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */
editor->hwndParent = cs->hwndParent;
SetWindowLongPtrW(hwnd, 0, (LONG_PTR)editor);
}
......@@ -448,9 +449,13 @@ HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface,
void *pv)
{
ITextHostImpl *This = (ITextHostImpl *)iface;
ME_TextEditor *editor = (ME_TextEditor*)GetWindowLongPtrW(This->hWnd, 0);
HWND hwnd = This->hWnd;
HWND parent = GetParent(hwnd);
UINT id = GetWindowLongW(hwnd, GWLP_ID);
UINT id;
if (!editor || !editor->hwndParent) return S_OK;
id = GetWindowLongW(hwnd, GWLP_ID);
switch (iNotify)
{
......@@ -471,13 +476,13 @@ HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface,
info->hwndFrom = hwnd;
info->idFrom = id;
info->code = iNotify;
SendMessageW(parent, WM_NOTIFY, id, (LPARAM)info);
SendMessageW(editor->hwndParent, WM_NOTIFY, id, (LPARAM)info);
break;
}
case EN_UPDATE:
/* Only sent when the window is visible. */
if (!IsWindowVisible(This->hWnd))
if (!IsWindowVisible(hwnd))
break;
/* Fall through */
case EN_CHANGE:
......@@ -487,7 +492,7 @@ HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface,
case EN_MAXTEXT:
case EN_SETFOCUS:
case EN_VSCROLL:
SendMessageW(parent, WM_COMMAND, MAKEWPARAM(id, iNotify), (LPARAM)hwnd);
SendMessageW(editor->hwndParent, WM_COMMAND, MAKEWPARAM(id, iNotify), (LPARAM)hwnd);
break;
case EN_MSGFILTER:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment