84 行
2.0 KiB
Bash
実行ファイル
84 行
2.0 KiB
Bash
実行ファイル
#!/bin/bash
|
|
|
|
CAPS_SYMBOL="%{F#c0392b}⇧%{F-}"
|
|
IMLIST_FILE="/tmp/fcitx5-imlist"
|
|
|
|
capslock() {
|
|
xset -q | grep Caps | grep -q on && {
|
|
echo on
|
|
return 0
|
|
} || {
|
|
echo off
|
|
return 1
|
|
}
|
|
}
|
|
|
|
# Print out identifier of current input method
|
|
current() {
|
|
dbus-send --session --print-reply \
|
|
--dest=org.fcitx.Fcitx5 \
|
|
/controller \
|
|
org.fcitx.Fcitx.Controller1.CurrentInputMethod \
|
|
| grep -Po '(?<=")[^"]+'
|
|
}
|
|
|
|
# List all input methods added to Fcitx
|
|
imlist() {
|
|
if [ ! -f "${IMLIST_FILE}" ]; then
|
|
dbus-send --session --print-reply \
|
|
--dest=org.fcitx.Fcitx5 \
|
|
/controller \
|
|
org.fcitx.Fcitx.Controller1.AvailableInputMethods \
|
|
| awk 'BEGIN{i=0}{
|
|
if($0~/struct {/) i=0;
|
|
else if(i<6){gsub(/"/,"",$2); printf("%s,",$2); i++}
|
|
else if(i==6){printf("%s\n",$2); i++}
|
|
}' > ${IMLIST_FILE}
|
|
# Output like this:
|
|
# pinyin, 拼音, 拼音, fcitx-pinyin, 拼, zh_CN, true
|
|
# rime, 中州韻, , fcitx-rime, ㄓ, zh, true
|
|
# ......
|
|
fi
|
|
|
|
cat ${IMLIST_FILE}
|
|
}
|
|
|
|
# This script wait for events from `watch` and
|
|
# update the text by printing a new line.
|
|
#
|
|
# Strip `Keyboard - ` part from IM name then print
|
|
print_pretty_name() {
|
|
name=$(imlist | grep "^$(current)," | cut -d',' -f5)
|
|
if [[ -z "$name" ]]; then
|
|
return
|
|
fi
|
|
if capslock > /dev/null; then
|
|
# ${var^^} means uppercase, when CapsLock is on, let the name uppercase
|
|
name="${name^^}${CAPS_SYMBOL}"
|
|
fi
|
|
echo "${name}"
|
|
}
|
|
|
|
react() {
|
|
# Without this, Polybar will display empty
|
|
# string until you switch input method.
|
|
print_pretty_name
|
|
|
|
# Track input method changes. Each new line read is an event fired from IM switch
|
|
while true; do
|
|
# When read someting from dbus-monitor
|
|
read -r unused
|
|
print_pretty_name
|
|
done
|
|
}
|
|
|
|
##
|
|
# Watch for events from Fcitx.
|
|
#
|
|
# Because this script won't stop, I have to put the event handling part
|
|
# in another file named `react`.
|
|
##
|
|
|
|
# Need --line-buffered to avoid messages being hold in buffer
|
|
dbus-monitor --session destination=org.freedesktop.IBus | grep --line-buffered '65505\|65509' | react
|