diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 97e55bafc3c..11d4925df5c 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -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); diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 7edd86f72c4..8a5304baa01 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -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__ */ diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index 6258a638b18..115662cb7b0 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -326,7 +326,7 @@ typedef struct tagME_FontCacheItem typedef struct tagME_TextEditor { - HWND hWnd; + HWND hWnd, hwndParent; ITextHost *texthost; BOOL bEmulateVersion10; ME_TextBuffer *pBuffer; diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index e5f6310cc59..15ac461971b 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -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); diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c index 0ccb1777526..950d200251a 100644 --- a/dlls/riched20/txthost.c +++ b/dlls/riched20/txthost.c @@ -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: