xterm プチハック
kterm + uim を使ってるいるとプリエディット文字列が kterm 内の隣のテキストよりわずかに上に表示されるので直した。
static void setSpot(screen, spot_p) TScreen *screen; XPoint *spot_p; { spot_p->x = CursorX(screen, screen->cur_col); spot_p->y = CursorY(screen, screen->cur_row) + screen->max_ascent + 1; }
本当は + 1でなく + 2 するとぴったりなのかもしれないが、そうするとプリエディット文字列の下にカーソルが表示されたままになってしまう。
カーソルを消すにはHideCursor(), 出すにはShowCursor() のようだが、どのタイミングで ShowCursor() すればいいのかわからない。
また、IMがオンになっている間だけカーソルの色を変えたいと思い、XCreateIC の後で XNPreeditStartCallback を設定してみたが、コールバックが呼ばれなかった。これは全然違うコールバックなんだろうか。
{ XVaNestedList pa; XIMCallback preedit_start_cb; XIMCallback preedit_draw_cb; XIMCallback preedit_caret_cb; XIMCallback preedit_done_cb; preedit_start_cb.callback = (XIMProc)XIMPreEditStartCallback; preedit_draw_cb.callback = (XIMProc)XIMPreEditDrawCallback; preedit_caret_cb.callback = (XIMProc)XIMPreEditCaretCallback; preedit_done_cb.callback = (XIMProc)XIMPreEditDoneCallback; pa = XVaCreateNestedList (0, XNPreeditStartCallback, &preedit_start_cb, XNPreeditDrawCallback, &preedit_draw_cb, XNPreeditCaretCallback, &preedit_caret_cb, XNPreeditDoneCallback, &preedit_done_cb, 0); XSetICValues (screen->xic, XNPreeditAttributes, pa, 0); XFree(pa); }
カーソルの色を変えてるのはset_cursor_gcs() の中の
xgcv.foreground = bg; xgcv.background = cc;
これの模様。