試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

IBus/IBus-Anthyのその後(2009/6/25現在)

IBus/IBus-Anthyのその後(2009/6/24現在)」でIBus-Anthyの開発者あべ氏からxevの結果がこちら(id:kakurasan)と異なるため、前回貼り付けたキーのキーコード(133)をibus-anthy-1.2.0.20090617/engine/engine.pyの該当部分に用いて修正してテストしてみてはというコメントを頂いたので、試してみた。

修正部分

コードの修正

ファイル名: ibus-anthy-1.2.0.20090617-keycode.patch

diff -ur ibus-anthy-1.2.0.20090617.orig/engine/engine.py ibus-anthy-1.2.0.20090617/engine/engine.py
--- ibus-anthy-1.2.0.20090617.orig/engine/engine.py
+++ ibus-anthy-1.2.0.20090617/engine/engine.py
@@ -1023,7 +1023,7 @@
             if self.__typing_mode == jastring.TYPING_MODE_KANA:
                 if keyval == keysyms._0 and state == modifier.SHIFT_MASK:
                     keyval = keysyms.asciitilde
-                elif keyval == keysyms.backslash and keycode == 132 - 8:
+                elif keyval == keysyms.backslash and keycode == 133 - 8:
                     keyval = keysyms.yen
             ret = self.__on_key_common(keyval)
             if (unichr(keyval) in u',.' and
.specファイルの修正
--- ibus-anthy-1.1.0.20090603-1mdv2010.0/ibus-anthy.spec
+++ ibus-anthy-1.2.0.20090617-2kkr2010.0/ibus-anthy.spec
@@ -1,5 +1,5 @@
-%define	version 1.1.0.20090603
-%define	release %mkrel 1
+%define	version 1.2.0.20090617
+%define	release %mkrel 2
 
 Name:      ibus-anthy
 Summary:   ibus - Japanese Anthy engine
@@ -9,6 +9,7 @@
 License:   GPLv2+
 URL:       http://code.google.com/p/ibus/
 Source0:   http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
+Patch0:    %{name}-%{version}-keycode.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
 BuildRequires: anthy-devel
 BuildRequires: python-devel
@@ -21,6 +22,7 @@
 
 %prep
 %setup -q -n %{name}-%{version}
+%patch -p1
 
 %build
 %configure2_5x

テスト

「Use system keyboard layout setting」のチェックがオフのとき

IBus/IBus-Anthyのその後(2009/6/24現在)」のときと同じとなった。

  • 未確定文字列がないときにキーを押す: 半角バックスラッシュ/円記号の文字が出る
  • 未確定文字列に続いてキーを押す: 何も出ない

全角英数モードにしたときにキーを押すと全角バックスラッシュ、キーを押すと半角バックスラッシュ/円記号が出ている。
(2009/6/26)このチェックはかな入力時にはオンにする必要があるようだ。

「Use system keyboard layout setting」のチェックがオンのとき

「ろ」と「ー」の両方とも正常に入力されることを確認した。

キーコード値に依存しないキー区別をするのが良い?

[引用]ファイル名: ibus-anthy-1.2.0.20090617/engine/engine.py より

elif keyval == keysyms.backslash and keycode == 132 - 8:

システムによって異なることのあるキーコード値を直接用いるのは問題があるということが分かった。ただし、uimでは正常に動作していることが確認できているので、uimの方式を参考にすると改善できるのではないかという気がしたのでuimuim/uim-x-kana-input-hack.cを開いてみたところ、キーコード値に依存しない方法で2つのキーを区別していることが分かった。

  • も単独で押すと「XK_backslash」というキーシンボル値*1を返す
  • キーはShiftキーを押しながら押すとキーシンボル「XK_underscore」を返す
  • キーはShiftキーを押しながら押すとキーシンボル「XK_bar」を返す

下はShiftキー付きでxevを用いて各キーを押しているところ。「keysym」の部分がキーシンボル。
Shift+キー

KeyPress event, serial 35, synthetic NO, window 0x6200001,
    root 0x1a6, subw 0x0, time ttttttt, (xxx,yyy), root:(xxx,yyy),
    state 0x11, keycode 211 (keysym 0x5f, underscore), same_screen YES,
    XLookupString gives 1 bytes: (5f) "_"
    XmbLookupString gives 1 bytes: (5f) "_"
    XFilterEvent returns: False

Shift+キー

KeyPress event, serial 35, synthetic NO, window 0x6200001,
    root 0x1a6, subw 0x0, time ttttttt, (xxx,yyy), root:(xxx,yyy),
    state 0x11, keycode 133 (keysym 0x7c, bar), same_screen YES,
    XLookupString gives 1 bytes: (7c) "|"
    XmbLookupString gives 1 bytes: (7c) "|"
    XFilterEvent returns: False

これを利用して、単独で押したときに「XK_backslash」を返す場合、Shift付きのキーシンボルが「XK_underscore」と「XK_bar」のどちらになるかで判別しているようだ。

関連:キーコード定義の抜粋

(2009/6/26)キーとキーに関するキーコード定義の抜粋を貼り付ける。
キー

(Mandriva Linux 2009.0上)
$ grep Yen /usr/share/X11/xkb/keycodes -r
/usr/share/X11/xkb/keycodes/xfree86:    <AE13> =   133;         // Yen
/usr/share/X11/xkb/keycodes/evdev:      <AE13> = 132;   // Yen
(Mandriva Linux 2009.1上)
$ grep Yen [2009.1環境のマウントポイント]/usr/share/X11/xkb/keycodes -r
[2009.1環境のマウントポイント]/usr/share/X11/xkb/keycodes/xfree86:    <AE13> =   133;    // Yen
[2009.1環境のマウントポイント]/usr/share/X11/xkb/keycodes/evdev:  <AE13> = 132;   // Yen

いずれもkbdドライバでは133番、evdevドライバでは132番が使用されるようだ。
キー

(2009.0)
$ grep backslash /usr/share/X11/xkb/keycodes -r                    
/usr/share/X11/xkb/keycodes/xfree86:    <AB11> =   211;		// backslash/underscore
/usr/share/X11/xkb/keycodes/evdev:	<AB11> = 211;	// backslash/underscore
(2009.1)
$ grep backslash [2009.1環境のマウントポイント]/usr/share/X11/xkb/keycodes -r   
[2009.1環境のマウントポイント]/usr/share/X11/xkb/keycodes/xfree86:    <AB11> =   211;	// backslash/underscore
[2009.1環境のマウントポイント]/usr/share/X11/xkb/keycodes/evdev:	<AB11> = 97;	// backslash/underscore

evdev使用時の値が211から97に変わっている。

関連記事:

使用したバージョン:

*1:/usr/include/X11/keysymdef.hの中で定義されている値