[PATCH 5/5] riched20: Handle sending EN_MSGFILTER notifications in the host.
Huw Davies
huw at codeweavers.com
Tue Mar 16 03:22:49 CDT 2021
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/riched20/editor.c | 57 ++---------------------------------------
dlls/riched20/txthost.c | 40 +++++++++++++++++++++++++++--
2 files changed, 40 insertions(+), 57 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 559ed88ea33..6f38231de9b 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2384,28 +2384,6 @@ static BOOL copy_or_cut( ME_TextEditor *editor, BOOL cut )
return SUCCEEDED( hr );
}
-/* helper to send a msg filter notification */
-static BOOL
-ME_FilterEvent(ME_TextEditor *editor, UINT msg, WPARAM* wParam, LPARAM* lParam)
-{
- MSGFILTER msgf;
-
- 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(editor->hwndParent, WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf))
- return FALSE;
- *wParam = msgf.wParam;
- *lParam = msgf.lParam;
- msgf.wParam = *wParam;
-
- return TRUE;
-}
-
static void ME_UpdateSelectionLinkAttribute(ME_TextEditor *editor)
{
ME_Paragraph *start_para, *end_para;
@@ -4132,9 +4110,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_LBUTTONDOWN:
{
ME_CommitUndo(editor); /* End coalesced undos for typed characters */
- if ((editor->nEventMask & ENM_MOUSEEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
ITextHost_TxSetFocus(editor->texthost);
ME_LButtonDown(editor, (short)LOWORD(lParam), (short)HIWORD(lParam),
ME_CalculateClickCount(editor, msg, wParam, lParam));
@@ -4145,9 +4120,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
break;
}
case WM_MOUSEMOVE:
- if ((editor->nEventMask & ENM_MOUSEEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
if (editor->bMouseCaptured)
ME_MouseMove(editor, (short)LOWORD(lParam), (short)HIWORD(lParam));
else
@@ -4163,9 +4135,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
}
if (editor->nSelectionType == stDocument)
editor->nSelectionType = stPosition;
- if ((editor->nEventMask & ENM_MOUSEEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
else
{
ME_SetCursor(editor);
@@ -4176,9 +4145,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
ME_CommitUndo(editor); /* End coalesced undos for typed characters */
- if ((editor->nEventMask & ENM_MOUSEEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
ME_LinkNotify(editor, msg, wParam, lParam);
goto do_default;
case WM_CONTEXTMENU:
@@ -4206,22 +4172,11 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_COMMAND:
TRACE("editor wnd command = %d\n", LOWORD(wParam));
return 0;
- case WM_KEYUP:
- if ((editor->nEventMask & ENM_KEYEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
- goto do_default;
case WM_KEYDOWN:
- if ((editor->nEventMask & ENM_KEYEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
if (ME_KeyDown(editor, LOWORD(wParam)))
return 0;
goto do_default;
case WM_CHAR:
- if ((editor->nEventMask & ENM_KEYEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
return handle_wm_char( editor, wParam, lParam );
case WM_UNICHAR:
if (unicode)
@@ -4328,16 +4283,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
}
case WM_MOUSEWHEEL:
{
- int delta;
- BOOL ctrl_is_down;
-
- if ((editor->nEventMask & ENM_MOUSEEVENTS) &&
- !ME_FilterEvent(editor, msg, &wParam, &lParam))
- return 0;
-
- ctrl_is_down = GetKeyState(VK_CONTROL) & 0x8000;
-
- delta = GET_WHEEL_DELTA_WPARAM(wParam);
+ int delta = GET_WHEEL_DELTA_WPARAM( wParam );
+ BOOL ctrl_is_down = GetKeyState( VK_CONTROL ) & 0x8000;
/* if scrolling changes direction, ignore left overs */
if ((delta < 0 && editor->wheel_remain < 0) ||
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index d10b303a137..a8286905659 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -38,10 +38,10 @@ struct host
LONG ref;
ITextServices *text_srv;
ME_TextEditor *editor; /* to be removed */
- HWND window;
+ HWND window, parent;
BOOL emulate_10;
PARAFORMAT2 para_fmt;
- DWORD props, scrollbars;
+ DWORD props, scrollbars, event_mask;
};
static const ITextHostVtbl textHostVtbl;
@@ -82,6 +82,7 @@ struct host *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
texthost->ITextHost_iface.lpVtbl = &textHostVtbl;
texthost->ref = 1;
texthost->window = hwnd;
+ texthost->parent = cs->hwndParent;
texthost->emulate_10 = emulate_10;
memset( &texthost->para_fmt, 0, sizeof(texthost->para_fmt) );
texthost->para_fmt.cbSize = sizeof(texthost->para_fmt);
@@ -93,6 +94,7 @@ struct host *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
texthost->para_fmt.wAlignment = PFA_CENTER;
texthost->editor = NULL;
host_init_props( texthost );
+ texthost->event_mask = 0;
return texthost;
}
@@ -842,6 +844,26 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
return hr;
}
+static LRESULT send_msg_filter( struct host *host, UINT msg, WPARAM *wparam, LPARAM *lparam )
+{
+ MSGFILTER msgf;
+ LRESULT res;
+
+ if (!host->parent) return 0;
+ msgf.nmhdr.hwndFrom = host->window;
+ msgf.nmhdr.idFrom = GetWindowLongW( host->window, GWLP_ID );
+ msgf.nmhdr.code = EN_MSGFILTER;
+ msgf.msg = msg;
+ msgf.wParam = *wparam;
+ msgf.lParam = *lparam;
+ if ((res = SendMessageW( host->parent, WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf )))
+ return res;
+ *wparam = msgf.wParam;
+ *lparam = msgf.lParam;
+
+ return 0;
+}
+
static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
LPARAM lparam, BOOL unicode )
{
@@ -866,6 +888,15 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
else return DefWindowProcW( hwnd, msg, wparam, lparam );
}
+ if ((((host->event_mask & ENM_KEYEVENTS) && msg >= WM_KEYFIRST && msg <= WM_KEYLAST) ||
+ ((host->event_mask & ENM_MOUSEEVENTS) && msg >= WM_MOUSEFIRST && msg <= WM_MOUSELAST)) &&
+ send_msg_filter( host, msg, &wparam, &lparam ))
+ {
+ TRACE( "exit (filtered) hwnd %p msg %04x (%s) %lx %lx -> %lu\n",
+ hwnd, msg, get_msg_name(msg), wparam, lparam, res );
+ return res;
+ }
+
editor = host->editor;
switch (msg)
{
@@ -1042,6 +1073,11 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
res = len;
break;
}
+ case EM_SETEVENTMASK:
+ host->event_mask = lparam;
+ hr = ITextServices_TxSendMessage( host->text_srv, msg, wparam, lparam, &res );
+ break;
+
case EM_SETOPTIONS:
hr = set_options( host, wparam, lparam, &res );
break;
--
2.23.0
More information about the wine-devel
mailing list