xrdpとmacOSの組み合わせでキーボード判定

xrdpの環境にmacOS端末でログインすると結構な確率でキーボード判定がおかしくなりませんか?

macOSでRDPするにはMicrosoft謹製のwindows.appを使うわけなのですが、どうもxrdpに送られてくるキーボードレイアウトの情報がおかしい、というか無いに等しい。

これがWindows機ならばある程度の種類を送ってきてくれるので、それに適したレイアウトで操作できるわけなのですが、少なくとも私の個人持ちのMacBookではUSキー判定されたり日本語キー判定されたり。

接続自体はスムーズなのに、いざ「@」や「¥」を入力しようとすると違うレイアウトになっていることに気づいて接続し直す羽目になるのがどうも憂鬱。

・というわけでもう作っちゃえ

というわけで、GUIで設定変更できるツールをさくさくっと。

ついでに接続してきた端末名や解像度と設定内容を記録しておいて、自動実行でも設定できるように。

[ keyboard-switcher.sh ]

#!/bin/bash

# --- 実行モード判定 ---
AUTO_MODE=false
if [[ "$1" == "--auto" ]]; then
    AUTO_MODE=true
fi

# --- 設定保存先・識別情報取得 ---
CONFIG_DIR="$HOME/.config/keyboard_layouts"
mkdir -p "$CONFIG_DIR"

resolution=$(xdpyinfo | grep dimensions | awk '{print $2}')
hostname=$(xprop -root | grep Xdpy | cut -d\" -f2 | cut -d@ -f2)

[[ -z "$resolution" ]] && resolution="unknown_resolution"
[[ -z "$hostname" ]] && hostname="unknown_host"

safe_id=$(echo "${hostname}_${resolution}" | tr -cs '[:alnum:]_-' '_')
CONFIG_FILE="$CONFIG_DIR/${safe_id}.conf"

# --- 設定ファイルが存在する場合 ---
if [[ -f "$CONFIG_FILE" ]]; then
    saved_layout=$(cat "$CONFIG_FILE")
    if [[ "$saved_layout" == "us" || "$saved_layout" == "jp" ]]; then
        # 共通で即適用
        setxkbmap "$saved_layout"
        echo "[INFO] '${saved_layout}' を適用しました (${safe_id})"

        if $AUTO_MODE; then
            # 自動実行ならここで終了
            exit 0
        fi
        # 手動実行なら続行して GUI を表示(再選択可能)
    fi
else
    # 自動実行で設定がない → 何もしない
    if $AUTO_MODE; then
        echo "[INFO] 設定ファイルがありません (${safe_id})。自動実行なので何もせず終了。"
        exit 0
    fi
fi

# --- 手動実行: GUIで選択 ---
current_layout=$(setxkbmap -query | grep layout | awk '{print $2}')

if [[ "$current_layout" == "jp" ]]; then
    us_selected=FALSE
    jp_selected=TRUE
else
    us_selected=TRUE
    jp_selected=FALSE
fi

layout=$(zenity --list \
    --title="キーボードレイアウトの選択" \
    --text="使用するキーボードレイアウトを選んでください\n(端末: ${hostname}, 解像度: ${resolution})" \
    --radiolist \
    --column="選択" --column="レイアウト" \
    $us_selected "us (英語)" \
    $jp_selected "jp (日本語)")

if [[ $layout == *"us"* ]]; then
    setxkbmap us
    echo "us" > "$CONFIG_FILE"
elif [[ $layout == *"jp"* ]]; then
    setxkbmap jp
    echo "jp" > "$CONFIG_FILE"
else
    zenity --info --text="レイアウトが選択されませんでした。"
    exit 1
fi

と、こんな感じで。

配置はどこでも良いけれど、実行するためには chmod +x keyboard-switcher.sh を忘れずに。

・こまかいところ

仕様的には

・自動実行時+保存情報あり:保存された情報で設定して静かに終了
・自動実行時+保存情報なし:なにもせず静かに終了
・手動実行時+保存情報あり:GUIを開き保存された情報を表示
・手動実行時+保存情報なし:GUIを開く

と言う感じで、保存情報は

~/.config/keyboard_layouts/ 以下に「ホスト名_解像度.conf」の設定ファイルを作って記憶。

ただ、実際に動かしてみるとhost名が取得できなくて unknown_host_1440x900_.confみたいな形になってしまいましたが、実用上支障なしということで。

書き忘れるところだった。
自動実行時というのをどう判定するねん、という点は –auto というオプションを付けることで判断します。

・せっかく作ったならメニューへ

せっかくGUIなツールなのに起動がいちいちCLIではもったいないので、デスクトップエントリーに以下のように追加。

[ /usr/share/applications/keyboard-switcher.desktop ]

[Desktop Entry]
Name=キーボードレイアウト切替
Exec=/usr/local/bin/keyboard-switcher.sh ←ここは環境にあわせてフルpathを!
Type=Application
Terminal=false
Icon=input-keyboard
Categories=Settings;Utility;

これでちょっと楽ができるかな?


安心安全安価なSDカードデータ復元・HDDデータ復元は
長年の信頼と実績の『株式会社パソコントラブル救助隊』へ。
https://hqsecure.net/

WPS-OFFICEで太字が潰れてしまう対応

さて、どのくらいこの現象にぶち当たる人数がいるのかは想像できませんが。

ウチのUbuntu24環境でちょっとしたOFFICE系データの閲覧や編集に重宝しているWPS-OFFICEなんですけれど、最近構築しなおしたUbuntu24.04の環境ではなぜか日本語表示が潰れてしまうという現象にあたりました。

■どんな現象が起きる?

普通に日本語表示をさせている部分にはまるっきり問題は出ないのですよ。

ところが、日本語の文字列に太字の設定をしたとたんに、まるでマジックで雑に塗りつぶされたかのように黒く潰れてしまうんですね。

とまあこんな感じで、上記はライター(※ワード的なもの)で書いた文書ですが、日本語文字の太字設定をした部分だけが潰れた表示になってしまいます。

見ようによっちゃまるで呪われたかのような文書になってしまいます(笑)

文字情報そのものが失われるわけではなく、ただ単に表示が潰れているだけではあるのですが読めないのは困った。

■原因は?

どうやらこれはWPS-OFFICEのバグが原因なようで、ざっとネットを見渡してみると2023年ごろにはすでに話題に上がっているようなのですが現在のところバグが取り払われた気配はありません。

しかもこのバグ、FreeType2.13.0よりも新しいバージョンのFreeTypeと組み合わせた場合にのみ発症するようです。

なので、Ubuntu24.04にアップして標準インストールされるFreeTypeのバージョンが2.13.2になったがために目立つようになってしまった、ということのようです。

■対処方法は

さて、新しいバージョンどうしを組み合わせると問題が出るということであれば、どちらかを古いバージョンにダウングレードしてしまうというのが最も簡単な対処法です。

今回はこのサイトの記事を参考にfreetypeの側をダウングレードして対処したいと思います。

問題は、Ubuntu24ではfreetype2.13.2しか配布されていないようで、ちょっと探しにいってみても2.13.1までしか遡れない。

そうなるともう、古いバージョンのソースコードをなんとか入手してコンパイルするという作業が必要になってきます。

ソースコードそのものは、
https://sourceforge.net/projects/freetype/files/freetype2/2.13.0/freetype-2.13.0.tar.xz
から入手可能なようです。

■手順は?

ダウンロードした圧縮ファイルを解凍し、
そもそもfreetype2.13.2がインストール済みという前提なので2.13.0のインストールは不要で、コンパイルまで進めることになります。

tar -xvf freetype-2.13.0.tar.xz
cd freetype-2.13.0
./configure –prefix=~/freetype-2.13.0
make -j$(nproc)

ここまでで必要なファイルが出来上がっているはずなので、

find . -name “*.so*”

として場所を確認します。私の環境では 、

./objs/.libs/libfreetype.so
./objs/.libs/libfreetype.so.6
./objs/.libs/libfreetype.so.6.19.0

と3つのファイルが出来上がっていたので、この3つをWPS-OFFICE配下のディレクトリにコピーします(挙動をみている限り3つめは不要な気もするが)。

sudo cp ./objs/.libs/libfreetype.so /opt/kingsoft/wps-office/office6/
sudo cp ./objs/.libs/libfreetype.so.6 /opt/kingsoft/wps-office/office6/
sudo cp ./objs/.libs/libfreetype.so.6.19.0 /opt/kingsoft/wps-office/office6/

■無事に解決

さてコピーまで済んだところでWPSを立ち上げてみます。

冒頭のライター(※ワード的なもの)で書いたファイルですが、日本語文字の太字部分がちゃんと潰れずに表示されています

もちろんWPSのライター以外のアプリケーション(スプレッドシート※エクセル的なもの、プレゼンテーション※パワポ的なもの)でも同様に改善することが確認できます。

最初この現象を目の当たりにしたときにはフォントファイルが壊れているか足りないのかな?などと考えたてアレコレ試すためにとても時間を消費するわけです。

でも解決できてみると「なんだこんな簡単なのかっ」となってしまうのはトラブル解決あるあるですね。


安心安全安価なSDカードデータ復元・HDDデータ復元は
長年の信頼と実績の『株式会社パソコントラブル救助隊』へ。
https://hqsecure.net/