Squeekboard
I used the Debian package of squeekboard
, but it doesn't include any keyboard layouts. So the first order of business is to create your own or download some existing ones and place them in ~/.local/share/squeekboard/keyboards
.
To enable squeekboard dbus service I created this file:
[D-BUS Service] Name=sm.puri.OSK0 Exec=/usr/bin/squeekboard
It uses the layouts set in gnome settings, but since I'm not using gnome I opted to just set my desired layouts manually. Setting layout for the on-screen keyboard has no effect on hardware keyboards. The setting is maintained after you set it, but I did not test if Gnome modifies it without asking.
gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us'), ('xkb', 'ru'), ('xkb', 'us+dvorak')]"
Now you should be able to run squeekboard
. Try it in a terminal first to see any output. It should be hidden by default so enable it as below:
gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled true
Now it will automatically toggle visibility when it detects text input.
You can also manually trigger it while leaving it enabled as below:
busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b true
With these basics I built up these scripts and a little custom waybar module. For now they are just triggered by waybar, but I might want to use them with touchscreen gestures or sway binds later.
#!/bin/sh # check if squeekboard running if ! pgrep -x squeekboard > /dev/null; then nohup squeekboard > /dev/null & fi key="org.gnome.desktop.a11y.applications screen-keyboard-enabled" if [ "$(gsettings get $key)" = "true" ]; then gsettings set $key false else gsettings set $key true fi
#!/bin/sh # check if squeekboard running if ! pgrep -x squeekboard > /dev/null; then nohup squeekboard > /dev/null & fi dbus_string="--user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0" visible=$(busctl get-property $dbus_string Visible| cut -d ' ' -f 2) if [ "$visible" = "true" ]; then busctl call $dbus_string SetVisible b false else busctl call $dbus_string SetVisible b true fi
#!/bin/sh # check if squeekboard running if ! pgrep -x squeekboard > /dev/null; then nohup squeekboard > /dev/null & fi sleep 0.1 # wait for things to propagate text="" tooltip="Squeekboard" dbus_string="--user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0" visible=$(busctl get-property $dbus_string Visible| cut -d ' ' -f 2) # percentage is a proxy for 'enabled'. 0 = disabled, 100 = enabled if [ "$visible" = "true" ]; then percentage=100 else percentage=0 fi key="org.gnome.desktop.a11y.applications screen-keyboard-enabled" if [ "$(gsettings get $key)" = "true" ]; then class="activated" else class="" fi echo "{\"text\": \"$text\", \"tooltip\": \"$tooltip\", \"class\": \"$class\", \"percentage\": $percentage}"
"custom/osk": { "format": "{icon}", "format-icons": ["⌧", "⌨"], "exec": "$HOME/.config/waybar/osk/status.sh", "return-type": "json", "interval": 1, "exec-on-event": true, "exec-if": "! lsusb -d 045e:096f", "on-click": "$HOME/.config/waybar/osk/toggle_visible.sh", "on-click-right": "$HOME/.config/waybar/osk/toggle_enable.sh" }