emacs 23.2.91のIMEパッチ
来たる emacs23.3のリリースに備えて pretestをビルドしました.IMEパッチは emacs23.2で適用している既存の IMEパッチを流用しています.
パッチは2ファイルに分けています.
- emacs-23.2.91-ImeUseW32-2010-12-30.patch.tar.gz
既存のIMEパッチを emacs 23.2.91に合わせて修正しただけで,ロジックとしての変更はありません. - emacs-23.2.91-ImeFont-2010-12-30.patch.tar.gz
新規に実装したIME変換中のフォントを指定するためのパッチです.ロジックの詳細は後述.一応バイナリ(emacs-23.2.91-20101230.exe)も公開しています.
emacs-23.2.91-ImeFont-2010-12-30.patch
では,ソースファイル w32fns.c
の関数 w32_wnd_proc
へのパッチを行います.ソースファイル中の関係する箇所と変更点(斜体太字)を以下に記載します.
LRESULT CALLBACK
w32_wnd_proc (hwnd, msg, wParam, lParam)
HWND hwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
{
struct frame *f;
struct w32_display_info *dpyinfo = &one_w32_display_info;
W32Msg wmsg;
int windows_translate;
int key;<省略>
case WM_IME_STARTCOMPOSITION:
if (!ignore_ime_char)
{
HDC hdc;
LOGFONT lf;
struct frame *f;
HFONT ime_font, old_font;
f = x_window_to_frame (dpyinfo, hwnd);
hdc = GetDC (hwnd);ime_font = GetCurrentObject (hdc, OBJ_FONT);
GetObject (ime_font, sizeof (lf), &lf);
ime_font = CreateFontIndirect (&lf);lf.lfHeight
= -MulDiv( FRAME_FONT (f)->pixel_size,
GetDeviceCaps( hdc, LOGPIXELSY ),
MulDiv( GetDeviceCaps(hdc, LOGPIXELSY),
GetDeviceCaps(hdc, LOGPIXELSY), 96 )
);
Lisp_Object font_name_org
= FRAME_FONT(f)->props[FONT_FULLNAME_INDEX];
char font_name_new[32];
int i;
memset(font_name_new, '\0', sizeof(font_name_new));
strncpy (font_name_new, SDATA(ENCODE_SYSTEM(font_name_org)), LF_FACESIZE);
for(i=sizeof(font_name_new)-1; i>=0; i--) {
if(font_name_new[i] == '-') {
font_name_new[i] = '\0';
break;
} else if(font_name_new[i] != '\0') {
font_name_new[i] = '\0';
}
}
#ifdef _UNICODE
MultiByteToWideChar (CP_ACP, 0, font_name_new, -1,
(LPWSTR) lf.lfFaceName, LF_FACESIZE);
#else
strncpy (lf.lfFaceName, font_name_new, LF_FACESIZE);
#endif<省略>
2chで公開されたパッチ(emacs-23.1-ime-font-yattsuke.patch)を見ると,IME変換中の処理は WM_IME_STARTCOMPOSITION
に実装すればよいらしい.さらに同パッチを参考にすると,関数 GetObject
で取得した LOGFONT
のメンバ lfHeight
にフォントのサイズを設定,lfFaceName
にフォント名を設定するとIME変換中のフォントを設定できるようです.
フォントサイズについては,frameの設定からピクセルサイズ pixel_size
を取得して,DPIの比率をかけることで算出しています.フォント名については,struct font
の props[FONT_FULLNAME_INDEX]
がフォント名のようですが,フォントサイズが付与されているので強引に削除しています(10ptの MSゴシックを使っている場合「MS ゴシック-10.0」となってしまう).
一応,上記のようなロジックでそれっぽく動作していますが,emacs起動後にフォントを変えても IME変換中のフォントは変更されない問題があるので,今後の課題かなぁ…(むしろ,どなたかご存知の方から教えてもらえることに期待してたり…)