xim: refresh placement before each key
This commit is contained in:
13
xim/xim.c
13
xim/xim.c
@@ -421,7 +421,7 @@ release(Ic *state)
|
||||
}
|
||||
|
||||
static void
|
||||
kpress(Ic *state, xcb_im_input_context_t *ic, xcb_key_press_event_t *ev)
|
||||
kpress(Ic *state, xcb_key_press_event_t *ev)
|
||||
{
|
||||
Keyres res;
|
||||
char buf[Maxutf];
|
||||
@@ -438,10 +438,7 @@ kpress(Ic *state, xcb_im_input_context_t *ic, xcb_key_press_event_t *ev)
|
||||
key = rune;
|
||||
if(meaningful(key)){
|
||||
wasvalid = state->caret.valid;
|
||||
if(!state->engaged)
|
||||
refreshplace(state);
|
||||
else if(readattrs(state))
|
||||
place(state);
|
||||
refreshplace(state);
|
||||
if(state->engaged && wasvalid && !state->caret.valid)
|
||||
sendrequest(state, Keycaret, 0, 0, &res);
|
||||
}
|
||||
@@ -450,7 +447,7 @@ kpress(Ic *state, xcb_im_input_context_t *ic, xcb_key_press_event_t *ev)
|
||||
commit(state, buf, n);
|
||||
updatepreedit(state, &res.preedit);
|
||||
if(!res.eaten)
|
||||
xcb_im_forward_event(xim, ic, ev);
|
||||
xcb_im_forward_event(xim, state->xic, ev);
|
||||
xcb_flush(conn);
|
||||
}
|
||||
|
||||
@@ -485,8 +482,6 @@ setstyle(Ic *state, u32int style)
|
||||
|
||||
if(!stylecap(style, &cap))
|
||||
style = XCB_IM_PreeditNothing | XCB_IM_StatusNothing;
|
||||
if(state->prestarted && !(style & XCB_IM_PreeditCallbacks))
|
||||
clearpreedit(state);
|
||||
state->style = style;
|
||||
state->cap = cap;
|
||||
}
|
||||
@@ -549,7 +544,7 @@ callback(xcb_im_t *im, xcb_im_client_t *client, xcb_im_input_context_t *ic,
|
||||
case XCB_XIM_FORWARD_EVENT:
|
||||
ev = arg;
|
||||
if(ev != nil && (ev->response_type & ~0x80) == XCB_KEY_PRESS)
|
||||
kpress(state, ic, ev);
|
||||
kpress(state, ev);
|
||||
break;
|
||||
case XCB_XIM_SET_IC_VALUES:
|
||||
case XCB_XIM_SET_IC_FOCUS:
|
||||
|
||||
Reference in New Issue
Block a user