[PATCH 1/2] winex11: Invoke Key event handlers immediately, keeping pace with the XFilterEvent().
Byeongsik Jeon
bsjeon at hanmail.net
Mon Apr 4 08:49:10 CDT 2022
1. GCS_COMPSTR: XFilterEvent() True case, XIMPreeditDrawCallCallback() is
invoked by XFilterEvent() internally. immediately processing.
GCS_RESULTSTR: XFilterEvent() False case. X11DRV_XIMLookupChars() is
invoked by KeyPress event handler. delayed processing.
So, delayed event handler processing causes GCS_COMPSTR, GCS_RESULTSTR
pair sequence inverting.
In Hangul IME, one key often generates GCS_COMPSTR, GCS_RESULTSTR pairs.
The XIM server sends the correct order pair, but the message order
inverted through the process_events(). Japanese input system can also
produce similar situation.
2. Copying event variable does not guarantee complete state preservation.
At the time of delayed processing, the global information that the event
handler must refer to may be changed.
Ex. XFilterEvent(), KeyPress event handler confirmed.
Signed-off-by: Byeongsik Jeon <bsjeon at hanmail.net>
---
dlls/winex11.drv/event.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 170111e9c28..149069b0d29 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -445,6 +445,19 @@ static BOOL process_events( Display *display, Bool (*filter)(Display*, XEvent*,X
else
continue; /* filtered, ignore it */
}
+ if (event.type == KeyPress || event.type == KeyRelease)
+ {
+ if (prev_event.type)
+ {
+ queued |= call_event_handler( display, &prev_event );
+ free_event_data( &prev_event );
+ prev_event.type = 0;
+ action = MERGE_DISCARD;
+ }
+ queued |= call_event_handler( display, &event );
+ continue;
+ }
+
get_event_data( &event );
if (prev_event.type) action = merge_events( &prev_event, &event );
switch( action )
--
2.35.1
More information about the wine-devel
mailing list