いくやの斬鉄日記

オープンソースからハイスクールフリート、The Beatlesまで何でもありの自称エンターテインメント日記。

fcitx-anthyのバグを直した話

2015年05月13日 22時08分37秒 | 言語入力機構
「どんな簡単なことでも、完璧にできるとうれしいもんでしょう」
田中あすか(『響け! ユーフォニアム』5話より)

fcitx-anthyのキーバインド設定が飛ぶというバグは、柴田さんが直してくれました。
このバグはどう頑張っても私には直せないものでした。ありがとうございます。

実はこのバグの検証中に、別なバグを見つけました。
[記号のスタイル]を変更しても、UI上は変更できたように見えても実際には反映されないというバグです。
得てしてこの手のバグは単純なものなので、自分で直すと決意しました。

ソースコードを読み込んで、src/imengine.cppの749行目以降がおかしいので間違いないという確信までは持てました。
void AnthyInstance::set_symbol_style(SymbolStyle symbol)
{
    m_config.m_symbol_style = symbol;
    FcitxUISetStatusString(m_owner,
                            "anthy-symbol-style",
                            _(symbol_style_status[symbol].label),
                            _(symbol_style_status[symbol].description));
    switch (m_config.m_symbol_style)
    {   
        case FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_WIDESLASH:
            m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
            m_preedit.set_slash_style   (FCITX_ANTHY_SLASH_WIDE);
        case FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_WIDESLASH:
            m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
            m_preedit.set_slash_style   (FCITX_ANTHY_SLASH_WIDE);
        case FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_MIDDLEDOT:
            m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
            m_preedit.set_slash_style   (FCITX_ANTHY_SLASH_JAPANESE);
        case FCITX_ANTHY_SYMBOL_STYLE_JAPANESE:
        default:
            m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
            m_preedit.set_slash_style   (FCITX_ANTHY_SLASH_JAPANESE);
            break;
    }
}

一瞬で気づかないとダメなレベルですよね。

そもそもこれはどういう機能かというと、鉤括弧と中黒キーを変更する機能です。
こういう機能があることは昔取った杵柄で知っていますけど、自分で使ったことはありません。
fcitx-anthyの場合は、
「」・
「」/
[]・
[]/
の4種類から選択できます。まず、この4つの定義はsrc/fcitx-anthy.descにあります。

[General/SymbolStyle]
Type=Enum
Description=Symbol style
DefaultValue=Japanese
EnumCount=4
Enum0=Japanese
Enum1=Wide bracket and wide slash
Enum2=Corner bracket and wide slash
Enum3=Wide bracket and Middle Dot

だめでしょこれ。
「」がwide bracket、[]がcorner braketだとすると、

[General/SymbolStyle]
Type=Enum
Description=Symbol style
DefaultValue=Japanese
EnumCount=4
Enum0=Japanese
Enum1=Wide bracket and wide slash
Enum2=Corner bracket and Middle Dot
Enum3=Corner bracket and wide slash

でないといけません。
(というか書いてて間違いに気づいたことは秘密な!)
ここを変更したら、src/factory.hも変更する必要があります。

typedef enum {
FCITX_ANTHY_SYMBOL_STYLE_JAPANESE,
FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_WIDESLASH,
FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_MIDDLEDOT,
FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_WIDESLASH,
FCITX_ANTHY_SYMBOL_STYLE_LAST
} SymbolStyle;

これは、

typedef enum {
FCITX_ANTHY_SYMBOL_STYLE_JAPANESE,
FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_WIDESLASH,
FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_MIDDLEDOT,
FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_WIDESLASH,
FCITX_ANTHY_SYMBOL_STYLE_LAST
} SymbolStyle;

でないといけません。

{
case FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_WIDESLASH:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_WIDE);
case FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_WIDESLASH:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_WIDE);
case FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_MIDDLEDOT:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_JAPANESE);
case FCITX_ANTHY_SYMBOL_STYLE_JAPANESE:
default:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_JAPANESE);
break;
}

これもよく見たら間違っていて、

{
case FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_WIDESLASH:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_WIDE);
case FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_WIDESLASH:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_WIDE);
case FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_MIDDLEDOT:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_JAPANESE);
case FCITX_ANTHY_SYMBOL_STYLE_JAPANESE:
default:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_JAPANESE);
break;
}

が正しいです。ほとんど間違い探しですな。diffがないとわかりにくくてしょうがないです。
で、ここまできて、あれ、これってbreakがないだけじゃね、ということに気がついて、

{
case FCITX_ANTHY_SYMBOL_STYLE_WIDEBRACKET_WIDESLASH:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_WIDE);
break;
case FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_WIDESLASH:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_WIDE);
break;
case FCITX_ANTHY_SYMBOL_STYLE_CORNERBRACKET_MIDDLEDOT:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_WIDE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_JAPANESE);
break;
case FCITX_ANTHY_SYMBOL_STYLE_JAPANESE:
default:
m_preedit.set_bracket_style (FCITX_ANTHY_BRACKET_JAPANESE);
m_preedit.set_slash_style (FCITX_ANTHY_SLASH_JAPANESE);
break;
}

としたら意図した通りに動いてくれました。めでたしめでたし。
pull requestはこれです。
C言語の文法はわかりませんけど、switch文はシェルスクリプトと同じなので、breakが必須であることは知ってました。自分ではswitch文はあまり書かないですけど。
breakがないからdefaultまでいっちゃうので、UI上では変更したのにもかかわらずそれが反映されない、というバグの挙動とも一致します。

今回わかったことは、本来どう動くべきなのかがわかっているといろいろと話が早いということと、今回はシェルスクリプトの知識で乗り越えられたものの、やっぱりC言語の文法知らなきゃダメだよね、ということです。
ちょっとC言語の勉強してきます……。
ジャンル:
ウェブログ
コメント (3)   この記事についてブログを書く
この記事をはてなブックマークに追加
« Ubuntu Weekly Recipe 第373... | トップ | VirtualBox 5.0 Beta4 と翻訳 »
最近の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
Unknown (runx)
2015-05-16 21:24:49
作業お疲れさまです。
着着と15.10へ向けてfcitxの改善が進んでますね。

残るは、kkcの辞書の自動登録ですね。ibus-kkcと同じになれば使いやすくなるんですよね(他のディストリビューションも気がついてないようですが)

skkdic-extra依存の件は改善プロジェクトに報告した方がのでしょうか?(いくやさんには報告済みだが…)
skkdic-extra対応は……。 (いくや)
2015-05-17 15:30:36
いろいろ考えたのですが、こうしようと思います。
1. PPAにあるfcitx-kkcは私が作成したものであり、Ubuntuには入らない
2. Ubuntuに入るべくfcitx-kkcが準備中
3. ibus-kkcに登録してある辞書はfcitx-kkcでも使えるようにPull Requestを投げる。ソースコードを読む限り、存在しない辞書が指定してあっても問題ない(無視される)
4. fcitx-kkcパッケージでskkdic-extraをdependするかは別問題。結構難しいと思われる

というわけで、skkdic-extraパッケージを別途インストールするという作業は残るように思います。
fcitx-kkcはいずれはfcitx-anthyに代わって欲しいところではあるのですが、そうなると手続きの関係上依存しているパッケージは少ないほうがいいのです。

まぁなんといいますか、長い目で見ていただけると幸いです……。
PR投げました。 (いくや)
2015-05-17 21:30:06
https://github.com/fcitx/fcitx-kkc/pull/7
です。

コメントを投稿

言語入力機構」カテゴリの最新記事