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;

これの模様。