[openbox] exit script
D.T.
ohnonot-github at posteo.de
Sat May 21 10:33:16 EDT 2022
On Wed, 2022-05-18 at 13:03 -0600, Dave Serls wrote:
> I'm wondering if there is any approved method of executing a command
> or
> script when "exit" is the selected action from the main menu.
> I'd like to scan (xlsclients -a) for running tasks and either cleanup
> or
> abort the "exit".
>
Thanks you for the hint with xlsclients! I wonder why I never knew
about it.
I have been using a script to gracefully close all windows before
exiting or shutting down.
It simply sends wmctrl -c to close all windows gracefully; if the app
objects (like e.g. an editor with unsaved changes would) I get
prompted.
It works well enough, but I will definitely take a look at xlsclients.
The menu.xml part:
<item label="Exit"><action
name="Execute"><command><![CDATA[alacritty --title 'Graceful Exit' -e
~/.config/scripts/close-all-windows 'openbox --
exit']]></command></action></item>
<item label="Reboot"><action
name="Execute"><command><![CDATA[alacritty --title 'Graceful Reboot' -e
~/.config/scripts/close-all-windows systemctl
reboot]]></command></action></item>
<item label="Shutdown"><action
name="Execute"><command><![CDATA[alacritty --title 'Graceful Shutdown'
-e ~/.config/scripts/close-all-windows systemctl
poweroff]]></command></action></item>
The script:
##################################################################
sep="############################"
excludeapps=( tint2 conky xfce4-panel glava )
# simple dependency check
for dep in grep xwininfo wmctrl; do
type -f $dep >/dev/null || exit 1
done
echo "Gracefully closing all windows."
excludeapps_winid=()
for (( i=0,j=0 ; i<${#excludeapps[@]} ; i++ ))
do
while read excludeapps_winid[j]
do
if [[ "x${excludeapps_winid[j]}" != "x" ]]
then
excludeapps_winid[j]="${excludeapps_winid[j]%% *}"
j=$((j + 1))
fi
done <<< "$(xwininfo -root -tree -int | grep -i
"(.*${excludeapps[i]}.*)")"
# dump all window info, with IDs in decimal, and grep for
classes/names,
# in brackets like: ("urxvt" "URxvt")
done
# Add this window to the array of excluded apps
# WINDOWID uses the same decimal format, just append it to the array
excludeapps_winid=( ${excludeapps_winid[@]} $WINDOWID )
echo "$sep
List of classes/names to exclude: \"${excludeapps[@]}\" and self.
$sep
Window IDs to exclude: ${excludeapps_winid[@]}"
while read -r line
do
for (( i=0 ; i<${#excludeapps_winid[@]} ; i++ ))
do
excludeapps_winid[i]="0x$(printf '%08x'
${excludeapps_winid[i]})"
if [[ "${line%% *}" == "${excludeapps_winid[i]}" ]]
then
line=''
break
fi
done
if [[ "x$line" != "x" ]]
then
echo -e "$sep\nClosing: ${line/$HOSTNAME/}"
# go to the desktop in question...
wmctrl -s "${line:10:3}"
# ...and close:
wmctrl -ic "${line%% *}"
# checking if it's really closed now:
if wmctrl -l | grep -E "^${line%% *}" >/dev/null 2>&1
then
# wait, presumably for user action:
echo -n "Waiting . "
while wmctrl -l | grep -E "^${line%% *}" >/dev/null 2>&1
do
sleep 0.1; echo -n '.'
done
echo
fi
fi
done <<< "$(wmctrl -l)"
wmctrl -ia "0x$(printf '%08x' $WINDOWID)" >/dev/null 2>&1
echo "$sep
Press <Enter> for \"$@\" or anything else to continue."
oldifs="$IFS"
IFS=
read -s -n 1 key
# -s: do not echo input character. -n 1: read only 1 character
if [ -z "$key" ]; then
IFS="$oldifs"
while :
do
$@
sleep 2
done
else
IFS="$oldifs"
fi
##################################################################
I cut out some irrelevant parts, I hope it works as-is.
___
Vaccines for everyone!
Donate to the COVAX alliance:
https://gogiveone.org/ (WHO)
https://www.gavi.org/donate (Gavi)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: This is a digitally signed message part
URL: <http://icculus.org/pipermail/openbox/attachments/20220521/005c170e/attachment.sig>
More information about the openbox
mailing list