libX11: Changes to 'master'

Egbert Eich eich at kemper.freedesktop.org
Wed Aug 7 07:52:07 PDT 2013


 modules/im/ximcp/imDefIc.c   |   27 +++++++++++++++++++++++++++
 modules/im/ximcp/imDefLkup.c |    4 +++-
 2 files changed, 30 insertions(+), 1 deletion(-)

New commits:
commit e7fd6f0eda57300df4d6b695b7064610ca5dec57
Author: Egbert Eich <eich at freedesktop.org>
Date:   Thu Jun 16 18:47:49 2011 +0200

    XIM: Fix sync problem on focus change.
    
    XSetICFocus() and XUnsetICFocus() are both asynchronous events.
    This is a pretty stupid idea: those functions may undo certain
    settings on the client side for which requests from the server
    may still be in the queue unprocessed. Thus things may be set
    in the wrong order ie instead of set -> unest it will be unset -> set.
    Moreover there is no way for either the client or the server to
    cause the event queue to be flushed - which is pretty bad as
    XIM is bidirectional.
    The scenario is as follows:
    Two ICs are created:
            ic1 = XCreateIC(im,
                XNInputStyle, XIMPreeditCallbacks | XIMStatusCallbacks,
                XNClientWindow, window,
                XNPreeditAttributes, preedit_attr,
                XNStatusAttributes, status_attr,
                NULL);
            ic2 = XCreateIC(im, XNInputStyle,
                           XIMPreeditNothing | XIMStatusNothing,
                           XNClientWindow, window, NULL);
    Then the focus is removed from ic2:
            XUnsetICFocus(ic2);
    If SCIM is used as the input server it will send a bunch of requests
    following an XCreateIC(). One of the requests registers a key release
    filter. XUnsetICFocus() unsets both key press and release filters.
    Since it is asynchronous, the input server requests to register key
    press and release filters may not have been processed, when XUnsetICFocus()
    is called. Since there is no explicite way for client programs to enforce
    the request queue to be flushed explicitely before an X[Set/Unset]ICFocus()
    call it would be safest to make those two calls synchronous in the sense
    that they ensure the request queue has been handled before they execute.
    The easiest way to do this from Xlib is thru a call to XGetICValues()
    which sends a request to the server and subsequently reads the queue
    from the server to the client. This will cause all outstanding requests
    in the queue to be read and handled.
    This is an ugly hack and this could be fixed directly in the client,
    however it seems to be easier to fix Xlib than to fix numerous clients.
    This problem arose since there is no well documented way how to handle
    and synchronize XIM requests and not all input servers send requests
    when an IC is created.
    This has been discussed extensively in:
     https://bugzilla.novell.com/show_bug.cgi?id=221326
    
    Signed-off-by: Egbert Eich <eich at freedesktop.org>

commit 26ec7d3821bc19debc73c8c3e42e6e33ef6f856e
Author: Egbert Eich <eich at freedesktop.org>
Date:   Thu Jun 16 17:28:39 2011 +0200

    XIM: Fix race on focus change: set 'FABRICATED' only when keyev filters in place.
    
    When synthesized key events are sent on commit XIM sets the 'fabricated'
    flag so that the keypress handler knows that these were not real events.
    This also happens when committing due to the loss of focus. However in this
    case the keypress/release filters which consume and unset this flag are no
    longer in the filter chain.
    So the flag is erronously set when a real keyboard event is received after
    focus has been regained. So the first event is wrongly treated as a
    fabricated key in the keypress handler which will at the same time reset
    the flag so the second key event is treated correctly.
    This fix only sets the flag when at least one of the keyboard filters is in
    place.
    How to reproduce this bug: run scim, choose a Japanese input method start
    two instances of xterm: start typing in one xterm (this should pop up an
    IM window). Without comitting (hitting 'enter') move focus to the other
    xterm, then move focus back. Start typing again. The first character will
    be committed immediately without popping up an input window.
    With this fix this behavior is gone.
    
    See also: https://bugzilla.novell.com/show_bug.cgi?id=239698
    
    Signed-off-by: Egbert Eich <eich at freedesktop.org>



More information about the xorg-commit mailing list