xdotool comes to the rescue
July 6, 2017 Leave a comment
In a previous post I explained how I implemented a method for adding my current location and the local time to my e-mail signature wherever I happen to be in the World, irrespective of the time on the laptop’s hardware clock and system clock. In that post I described how I created a keyboard shortcut using the Linux application AutoKey. Unfortunately AutoKey has not been updated for several years and no longer works properly in KDE Plasma 5 on my laptops. Therefore I decided to replace it with a KDE keyboard shortcut, and this is to explain how I did it.
First create a custom shortcut in KDE:
- ‘System Settings’ > ‘Shortcuts’ > ‘Custom Shortcuts’
- ‘Edit’ > ‘New’ > ‘Global Shortcut’ > ‘Command/URL’, and name the New Action ‘Insert current time’
- On the Comment pane for ‘Insert current time’, add the comment ‘Insert current time at specified location’ (without the quotes)
- On the Trigger pane, configure the shortcut to be Ctrl+Alt+Space
- On the Action pane, enter the Command/URL as ‘
/home/fitzcarraldo/timezone_signature_GeoNames.sh
‘ (without the quotes) - Click ‘Apply’
Next modify the Bash script timezone_signature_GeoNames.sh
so that it contains the following (obviously change the username and path to suit):
#!/bin/bash place=$(kdialog --title "Current Location" --inputbox "Enter your location:") placetime=$(perl /home/fitzcarraldo/now1.pl $place) # xdotool does not output a space in a string, so we have to extract each field from the string # and print each field individually, separated by a space character. city=$(echo $placetime | awk -F "|" '{print $1}') country=$(echo $placetime | awk -F "|" '{print $2}' | sed 's/[)(]//g') region=$(echo $placetime | awk -F "|" '{print $4}') datetime=$(/usr/bin/zdump $region | awk -F " " '{print $2" "$3" "$4" "$5" "$6" "$7}') dayofweek=$(echo $datetime | awk -F " " '{print $1}') month=$(echo $datetime | awk -F " " '{print $2}') day=$(echo $datetime | awk -F " " '{print $3}') time=$(echo $datetime | awk -F " " '{print $4}') year=$(echo $datetime | awk -F " " '{print $5}') timezone=$(echo $datetime | awk -F " " '{print $6}') activewindow=$(xdotool getactivewindow) xdotool type --window $activewindow "Sent from:" for oneword in $city; do xdotool key --window $activewindow space sleep 0.1s xdotool type --window $activewindow --delay 100 $oneword done xdotool key --window $activewindow comma for oneword in $country; do xdotool key --window $activewindow space sleep 0.1s xdotool type --window $activewindow --delay 100 $oneword done xdotool key --window $activewindow Return xdotool type --window $activewindow "Local time now: " xdotool type --window $activewindow $dayofweek xdotool type --window $activewindow " " xdotool type --window $activewindow $month xdotool type --window $activewindow " " xdotool type --window $activewindow $day xdotool type --window $activewindow " " xdotool type --window $activewindow $time xdotool type --window $activewindow " " xdotool type --window $activewindow $year xdotool type --window $activewindow " " if [ ${timezone:0:1} = "-" ]; then timezone="UTC-"${timezone#*-} elif [ ${timezone:0:1} = "+" ]; then timezone="UTC+"${timezone#*+} fi xdotool type --window $activewindow $timezone xdotool type --window $activewindow " " xdotool key --window $activewindow Return xdotool key --window $activewindow Return echo
The Perl script now1.pl
is listed in my my earlier post. Notice that the script timezone_signature_GeoNames.sh
in my earlier post was much simpler. This was because the AutoKey shortcut took care of sending the text to the currently active window. Without AutoKey, I now had to do this myself in the script timezone_signature_GeoNames.sh
, and the command xdotool came to the rescue. The developer explains what xdotool
does as follows:
This tool lets you simulate keyboard input and mouse activity, move and resize windows, etc. It does this using X11’s XTEST extension and other Xlib functions.
Additionally, you can search for windows and move, resize, hide, and modify window properties like the title. If your window manager supports it, you can use xdotool to switch desktops, move windows between desktops, and change the number of desktops.
So I installed xdotool
via the Gentoo package manager:
# emerge xdotool
# eix xdotool
[I] x11-misc/xdotool
Available versions: 3.20150503.1-r1^t ~3.20160805.1^t {examples}
Installed versions: 3.20150503.1-r1^t(22:51:30 02/04/17)(-examples)
Homepage: http://www.semicomplete.com/projects/xdotool/
Description: Simulate keyboard input and mouse activity, move and resize windows
Anyway, my Bash script using xdotool
works a treat with Thunderbird (and KWrite, LibreOffice Writer, etc.). I used to experience a problem with certain characters, for example a colon was printed as a semi-colon (see the xdotool
bug report xdotool writes the wrong case #121), but that no longer happens in my current KDE Plasma 5 installation:
Sent from: Galeão International Airport, Brazil
Local time now: Thu Jul 6 15:11:40 2017 UTC-03
What a useful tool xdotool
is!