Posts tagged ‘fcitx-qt5 show underline on preedit string’

先日からJoplinのエディタの代わりに使い始めたMDエディタ、QOwnNotesは なかなか良い。が、前回も書いたけど、完璧ではないので使っていると問題は出て来るので、気になるものからフォーラム(正確には「問題報告ページ」だろうが、ここでは簡単に「フォーラム」と書く)に投稿して対応してもらっている。

その対応がなかなか良くて感心している。言葉はぶっきらぼう簡潔だけど、ちゃんと対応する気が感じられるのがいい。しかも速い。そこら辺は昔やっていたMusicBeeに似た雰囲気で、懐かしい。

(11/4 17:02) が、(忙しいせいか)結構いい加減かつクソ野郎癖の強い人で、なかなかイライラすることがあった。が、他にいいエディタがないので今は使うしかないと、諦めている。その代わり、寄付はしない。

(11/4 18:53) いつもの「坊主憎けりゃ」で、使うどころか画面を見るだけでもイライラするので、QOwnNotesは止めた! 少々物足りないけど、安心感のあるZettlerに戻る(とりあえず今はねw)。

 

そういう問題の中で一番最初に何とかしたかったのは、日本語(Fcitx+Mozc)の未確定入力(pre-edit text)に下線が出ないことだ。落ちるとかでなく表示だけの問題なので、致命的ではないのだが、エディタで文章を書いている時には、どこからが変換対象なのか分からない(候補を良く見ればいいかも知れないが、書くのを邪魔される)のは結構なストレスだ。ただ、普通のアプリは出るのが謎だった。

検索してみると、いくつか情報が出て来た。いいヒントになったのは、LibreOffice(実際にはKDE?)のフォーラムへの報告だった。更に、fcitx-qt5のフォーラムに まさにこの問題が報告されていたのだが、作者の環境では「起こっていない」で未解決(と思われる)のまま閉じられて仕舞っている。

どうやらQt5アプリとFcitxの組み合わせで起こるようだ。実際、いくつかのQt5アプリで試したら ほぼ全滅だった。以下に結果を示す。

  • 下線が出ない。
    • digiKam7, QuiteRSS, QtQR, SMPlayer, VLC, FeatherPad, Calibre, Nextcloud, KeePassXC
  • 下線が不完全に出る。
    • LibreOffice Writer
  • 下線が出る。
    • LibreOffice Calc

確かにdigiKam(7からだったと思う)では下線が出なくて使いにくかったが、この問題のせいだったことが分かった。

それで、これはQOwnNotesの問題ではないのだが、fcitx-qt5の作者は問題が起こって居ないスタンスで解決の見込みがないので、QOwnNotesもLibreOfficeと同様な対応をしてもらえないか聞いてみたが、さすがに無理だった。(出て来ないが、「無理強い」の今の言葉だw ← 「無茶振り」だw)

その時はQt5の問題と思ったが、実際には、Fcitx(fcitx-qt5)の問題のようだ。ただ、Qt5がfcitx-qt5に下線を描くように指定していないせいだとしたら、Qt5の問題だ。この辺りは分からない。

そこで、「ちょっと何とか」できないかと思ってQOwnNotesのソースを見たが、上のLibreOfficeのパッチを適用するところに相当する部分はなく、未確定入力に関しては何も処理していない(確定した文字列を受け取って処理しているだけ?)と想像した。そこでfcitx-qt5のソースを見たら、(無理やり)下線を出す方法が分かった気がしたので やってみたら、たった1行の修正(削除)だけで見事に出た!

この変更は、本来 文字列に指定された(そういうことがあるのか?)スタイルに関係なく、無理やり下線を出しているので どこかで問題が起きそうだが、2時間くらい使った範囲では大丈夫だ。

ただ、他のQt5でないアプリでは下線は破線でなく実線なのが気になった。少しソースを検討したら、本来はデフォルトで実線の下線を描くつもりのようで、指定されたら破線にしているようだ。それがなぜか、実線の下線すら描いていない。Fcitxの設定があるのか調べたが、なかった。

そこで、とりあえず、破線の下線(DashUnderline)の指定がない場合(デフォルト)は実線の下線(SingleUnderline)を描くように修正した。参考までに、以下に修正したソースの関連部分を載せる。変更箇所は"Default to draw underline."辺りである(行頭の":"は省略した部分)。

platforminputcontext/qfcitxplatforminputcontext.cpp:

void QFcitxPlatformInputContext::updateFormattedPreedit(
 const FcitxFormattedPreeditList &preeditList, int cursorPos) {
:
    if (preedit.format() & TextFormatFlag_Underline) {
        format.setUnderlineStyle(QTextCharFormat::DashUnderline);
    } else { // Default to draw underline.: Butty: 2021/11/3
        format.setUnderlineStyle(QTextCharFormat::SingleUnderline);
    }
:
    update(Qt::ImCursorRectangle);
}

※上のソースコードのオリジナル部の著作権は、オリジナルファイルの先頭に記載のとおり。

 

妙なのは、これが全然問題になっていないことで、ひょっとすると僕とか特定の環境だけで起こり、世の中の多く(実は少ないのか?)の方は普通に使えているのかも知れない。であるので、本来は こういう修正は作者に連絡してオリジナルに入れてもらうべきだが、上記のように作者が「起こってない」スタンスということもあって保留した。

(11/4 12:19) その後、別件で「まっさら」かつ僕のとは別な環境(KDE neon)で試したところ、やっぱり問題は起こったので、少なくとも僕だけの問題ではないようだ。ただ、Ubuntu系だけかも知れないし、そもそも作者が上記のとおりなので、報告は保留する。

 

もし、この投稿を読まれて「自分のところでも起こっている」という方が多いなら、オリジナルに入れてもらうようにします。そういう方は、コメントを書いて下さるか、「いいね!」か「そうね!」を押して下さい。

(2023/6/6 8:42) オリジナルへの反映依頼について: 書いてから時間が経ったため、現在はQt6版がメインと思われますので、僕がQt6版で確認してからにしたいと思います。なお、Qt5版のソースを見ると"Fix the underline bit when using portal"という修正(2022/11)があるので、もしかしたら修正されたのかも知れません(ただ、"when using portal"の意味が不明)が、未確認です。

あと、「とりあえず、自分も直したい」という方がいらっしゃたら、もう少し詳しいやり方(と言っても、ビルドの方法、ビルド時にエラーが出た時の対処、インストール方法程度)を書きます。ただ、上の記述で分からない方ですと、理解して頂けるように書けるか不安です。

 

とりあえず、また一つ問題が解決して、(しかも、QOwnNotes以外もザクっと直って)気分がいい。そして、QOwnNotesは(気になることは他にも もう少しあるけど、)さらにサクサク書けるようになった^^

 

PS. 僕の「ちょっと何とか」は、大体ちょっとどころじゃ済まないが、今回は大丈夫だったwww でも、忘れた頃にトラブる可能性はある。

  • QOwnNotes

    QOwnNotes

    Open source markdown note-taking for Linux, macOS …

  •  1
  •  2
Keys: , ,