From: Rémi Bernon rbernon@codeweavers.com
By only delaying ConfigureNotify events for merging, and report empty composition string when result string is committed.
Based on a patch from Byeong-Sik Jeon bsjeon@hanmail.net.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55027 --- dlls/winex11.drv/event.c | 70 ++++++++++++---------------------------- dlls/winex11.drv/xim.c | 2 +- 2 files changed, 21 insertions(+), 51 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index f364cdbe715..3ba6589d2cf 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -255,44 +255,6 @@ static Bool filter_event( Display *display, XEvent *event, char *arg ) } }
- -enum event_merge_action -{ - MERGE_DISCARD, /* discard the old event */ - MERGE_HANDLE, /* handle the old event */ - MERGE_KEEP, /* keep the old event for future merging */ - MERGE_IGNORE /* ignore the new event, keep the old one */ -}; - -/*********************************************************************** - * merge_events - * - * Try to merge 2 consecutive events. - */ -static enum event_merge_action merge_events( XEvent *prev, XEvent *next ) -{ - switch (prev->type) - { - case ConfigureNotify: - switch (next->type) - { - case ConfigureNotify: - if (prev->xany.window == next->xany.window) - { - TRACE( "discarding duplicate ConfigureNotify for window %lx\n", prev->xany.window ); - return MERGE_DISCARD; - } - break; - case Expose: - case PropertyNotify: - return MERGE_KEEP; - } - break; - } - return MERGE_HANDLE; -} - - /*********************************************************************** * call_event_handler */ @@ -339,7 +301,6 @@ static BOOL process_events( Display *display, Bool (*filter)(Display*, XEvent*,X XEvent event, prev_event; int count = 0; BOOL queued = FALSE; - enum event_merge_action action = MERGE_DISCARD;
prev_event.type = 0; while (XCheckIfEvent( display, &event, filter, (char *)arg )) @@ -375,20 +336,29 @@ static BOOL process_events( Display *display, Bool (*filter)(Display*, XEvent*,X else continue; /* filtered, ignore it */ } - if (prev_event.type) action = merge_events( &prev_event, &event ); - switch( action ) + + /* delay and merge consecutive ConfigureNotify events */ + if (event.type == ConfigureNotify && prev_event.type == ConfigureNotify) { - case MERGE_HANDLE: /* handle prev, keep new */ - queued |= call_event_handler( display, &prev_event ); - /* fall through */ - case MERGE_DISCARD: /* discard prev, keep new */ + if (prev_event.xany.window != event.xany.window) queued |= call_event_handler( display, &prev_event ); + else TRACE( "discarding duplicate ConfigureNotify for window %lx\n", prev_event.xany.window ); prev_event = event; - break; - case MERGE_KEEP: /* handle new, keep prev for future merging */ + } + else if (event.type == ConfigureNotify) + { + TRACE( "delaying ConfigureNotify event for future merging\n" ); + prev_event = event; + } + else + { + /* allow merging over PropertyNotify and Expose events */ + if (event.type != PropertyNotify && event.type != Expose) + { + if (prev_event.type) call_event_handler( display, &prev_event ); + prev_event.type = 0; + } + queued |= call_event_handler( display, &event ); - /* fall through */ - case MERGE_IGNORE: /* ignore new, keep prev for future merging */ - break; } } if (prev_event.type) queued |= call_event_handler( display, &prev_event ); diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c index 1c3d2dd9875..1b063cfe886 100644 --- a/dlls/winex11.drv/xim.c +++ b/dlls/winex11.drv/xim.c @@ -140,7 +140,7 @@ void xim_set_result_string( HWND hwnd, const char *str, UINT count ) len = ntdll_umbstowcs( str, count, output, count ); output[len] = 0;
- post_ime_update( hwnd, 0, ime_comp_buf, output ); + post_ime_update( hwnd, 0, NULL, output );
free( output ); }