Received: from mout01.posteo.de (mout01.posteo.de [185.67.36.141]) by mail-b.sr.ht (Postfix) with ESMTPS id 627F6FF045 for <~mil/sxmo-devel@lists.sr.ht>; Thu, 23 Jul 2020 21:19:00 +0000 (UTC) Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id 144E2160060 for <~mil/sxmo-devel@lists.sr.ht>; Thu, 23 Jul 2020 23:18:58 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4BCQDx63jdz6tmV; Thu, 23 Jul 2020 23:18:57 +0200 (CEST) From: iressa To: ~mil/sxmo-devel@lists.sr.ht Cc: iressa Subject: [PATCH v2 1/1] Interactive/dynamic notifications Date: Thu, 23 Jul 2020 17:18:52 -0400 Message-Id: <20200723211852.18439-2-ian@eonndev.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200723211852.18439-1-ian@eonndev.com> References: <20200723211852.18439-1-ian@eonndev.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable --- configs/appcfg/dunst.conf | 2 ++ scripts/core/sxmo_appmenu.sh | 13 ++++++-- scripts/core/sxmo_notifications.sh | 13 ++++++++ scripts/core/sxmo_notificationservice.sh | 40 ++++++++++++++++++++++++ scripts/core/sxmo_notificationwrite.sh | 30 ++++++++++++++++++ scripts/core/sxmo_xinit.sh | 1 + scripts/modem/sxmo_modemmonitor.sh | 31 +++++++++--------- 7 files changed, 113 insertions(+), 17 deletions(-) create mode 100755 scripts/core/sxmo_notifications.sh create mode 100755 scripts/core/sxmo_notificationservice.sh create mode 100755 scripts/core/sxmo_notificationwrite.sh diff --git a/configs/appcfg/dunst.conf b/configs/appcfg/dunst.conf index a7f9323..b2bddee 100644 --- a/configs/appcfg/dunst.conf +++ b/configs/appcfg/dunst.conf @@ -32,6 +32,8 @@ title =3D Dunst class =3D Dunst startup_notification =3D false + mouse_left_click =3D do_action + [shortcuts] close_all =3D ctrl+shift+space =20 diff --git a/scripts/core/sxmo_appmenu.sh b/scripts/core/sxmo_appmenu.sh index e31a3b2..7b38df2 100755 --- a/scripts/core/sxmo_appmenu.sh +++ b/scripts/core/sxmo_appmenu.sh @@ -1,6 +1,7 @@ #!/usr/bin/env sh trap gracefulexit INT TERM WIN=3D$(xdotool getwindowfocus) +NOTIFDIR=3D"$XDG_CONFIG_HOME"/sxmo/notifications =20 gracefulexit() { echo "Gracefully exiting $0" @@ -326,8 +327,16 @@ getprogchoices() { # E.g. sets CHOICES var programchoicesinit "$@" =20 + # Decorate menu at top w/ notifications if they exist + NOTIFICATIONS=3D"$(ls $NOTIFDIR/ | grep -v sxmo_incomingcall | wc -l ||= echo 0)" + echo $NOTIFICATIONS | grep -v 0 && + CHOICES=3D" + Notifications ($(echo $NOTIFICATIONS | cut -d " " -f1)) ^ 0 ^ sxmo_no= tifications.sh + $CHOICES + " + # Decorate menu at top w/ incoming call entry if present - INCOMINGCALL=3D"$(cat /tmp/sxmo_incomingcall || echo NOCALL)" + INCOMINGCALL=3D"$(cat $NOTIFDIR/sxmo_incomingcall || echo NOCALL)" if echo "$INCOMINGCALL" | grep -v NOCALL; then CALLID=3D"$(echo "$INCOMINGCALL" | cut -d: -f1)" CALLNUM=3D"$(echo "$INCOMINGCALL" | cut -d: -f2)" @@ -390,4 +399,4 @@ pgrep -f "$(command -v sxmo_appmenu.sh)" | grep -Ev "= ^${$}$" | xargs kill -TERM DMENUIDX=3D0 PICKED=3D"" ARGS=3D"$*" -mainloop \ No newline at end of file +mainloop diff --git a/scripts/core/sxmo_notifications.sh b/scripts/core/sxmo_notif= ications.sh new file mode 100755 index 0000000..402f0b7 --- /dev/null +++ b/scripts/core/sxmo_notifications.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env sh + +NOTIFDIR=3D"$XDG_CONFIG_HOME"/sxmo/notifications + +while true; do + CHOICES=3D"$(find $NOTIFDIR/* -type f -not -name 'sxmo_incomingcall' | = xargs cat)" + PICKED=3D"$(printf %b "$CHOICES\nClose Menu" | cut -f2 | dmenu -c -i -f= n "Terminus-18" -p "Notifs" -l 10)" + + echo "$PICKED" | grep "Close Menu" && exit 0 +=09 + $(printf %b "$CHOICES" | grep "$PICKED" | cut -f3) + exit 0 +done diff --git a/scripts/core/sxmo_notificationservice.sh b/scripts/core/sxmo= _notificationservice.sh new file mode 100755 index 0000000..b0a21ca --- /dev/null +++ b/scripts/core/sxmo_notificationservice.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env sh + +# This script should be run to initialize the notification watchers. + +NOTIFDIR=3D"$XDG_CONFIG_HOME"/sxmo/notifications + +notifyd(){ + inotifywait $1 && rm -f $2 +} + +handlecreation(){ + echo "$(ls $NOTIFDIR/ | wc -l || echo 0)" | grep -v 0 && sxmo_setpinele= d green 1 + + # Start notification watcher if it matches the sxmo_notificationwrite f= ormat + awk 'BEGIN {FS=3D"\t"} ; {print NF}' $1 | grep -v 4 ||=20 + ( notifyd "$(cat $1 | cut -f4)" "$1" & ) +} + + + for NOTIF in $(ls $NOTIFDIR/); do + handlecreation "$NOTIFDIR/$NOTIF" + done + + while true; do + { + inotifywait -e create,moved_to,delete,delete_self,moved_from "$NOTIFD= IR"/ > /tmp/notifyd + STATUS=3D"$(cat /tmp/notifyd | tail -1)" + case "$(echo $STATUS | cut -d" " -f2)" in + "CREATE"|"MOVED_TO") + NOTIFFILE=3D"$NOTIFDIR/$(echo $STATUS | cut -d" " -f3)" + handlecreation $NOTIFFILE + ;; + + "DELETE"|"DELETE_SELF"|"MOVED_FROM") + echo "$(ls $NOTIFDIR/ | wc -l || echo 0)" | grep 0 && sxmo_setpinel= ed green 0 + ;; + esac + } + done +exit 0 diff --git a/scripts/core/sxmo_notificationwrite.sh b/scripts/core/sxmo_n= otificationwrite.sh new file mode 100755 index 0000000..fdd2db1 --- /dev/null +++ b/scripts/core/sxmo_notificationwrite.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env sh + +# This script takes 3 arguments, (1) a fuzzy description of the notifica= tion, (2) the action that the notification invokes upon selecting, and (3= ) the file to watch for deactivation. +# The message will first be fed to Dunst, and then will be handled based= on whether the user interacts with the notification or not. +# A notification file has 4 different fields, (1) a timestamp, (2) a fuz= zy description, (3) the selection action, and (4) the watch file. + +NOTIFDIR=3D"$XDG_CONFIG_HOME"/sxmo/notifications +TIMEFORMAT=3D"$(date "+%a %m/%d %T")" + +mkdir -p $NOTIFDIR +echo $3 | grep -v . && { echo "Not enough args."; exit 2; } + +# Don't send a notification if we're already looking at it! +lsof | grep $3 && exit 0 + +{ + sxmo_vibratepine 200; + sleep 0.1; + sxmo_vibratepine 200; + sleep 0.1; + sxmo_vibratepine 200; +} & + +# Dunstify and handle input +DUNST_RETURN=3D$(dunstify --action=3D"2,open" "$1"); + echo $DUNST_RETURN | grep -v 2 || { $2& exit 0; } + OUTFILE=3D$NOTIFDIR/$(date "+%Y_%m_%d_%H_%M_%S_%N").tsv + printf %b "$(echo $TIMEFORMAT)\t$1\t$2\t$3\n" > $OUTFILE + +exit 0 diff --git a/scripts/core/sxmo_xinit.sh b/scripts/core/sxmo_xinit.sh index ea478af..3d28627 100755 --- a/scripts/core/sxmo_xinit.sh +++ b/scripts/core/sxmo_xinit.sh @@ -39,6 +39,7 @@ daemons() { autocutsel & autocutsel -selection PRIMARY & sxmo_statusbar.sh & + sxmo_notificationservice.sh & } =20 daemonsneedingdbus() { diff --git a/scripts/modem/sxmo_modemmonitor.sh b/scripts/modem/sxmo_mode= mmonitor.sh index 6283df3..0066392 100755 --- a/scripts/modem/sxmo_modemmonitor.sh +++ b/scripts/modem/sxmo_modemmonitor.sh @@ -1,6 +1,7 @@ #!/usr/bin/env sh TIMEOUT=3D3 LOGDIR=3D"$XDG_CONFIG_HOME"/sxmo/modem +NOTIFDIR=3D"$XDG_CONFIG_HOME"/sxmo/notifications trap "gracefulexit" INT TERM =20 err() { @@ -10,7 +11,6 @@ err() { =20 gracefulexit() { echo "gracefully exiting $0!" - sxmo_setpineled green 0 kill -9 0 } =20 @@ -28,14 +28,14 @@ checkforincomingcalls() { )" =20 if echo "$VOICECALLID" | grep -v .; then - rm -f /tmp/sxmo_incomingcall + rm -f $NOTIFDIR/sxmo_incomingcall return fi =20 if [ -x "$XDG_CONFIG_HOME/sxmo/hooks/ring" ]; then "$XDG_CONFIG_HOME/sxmo/hooks/ring" else - sxmo_vibratepine 2000 & sxmo_setpineled green 1 + sxmo_vibratepine 2000 & fi =20 # Delete all previous calls which have been terminated calls @@ -61,7 +61,7 @@ checkforincomingcalls() { TIME=3D"$(date --iso-8601=3Dseconds)" mkdir -p "$LOGDIR" printf %b "$TIME\tcall_ring\t$INCOMINGNUMBER\n" >> "$LOGDIR/modemlog.ts= v" - echo "$VOICECALLID:$INCOMINGNUMBER" > /tmp/sxmo_incomingcall + printf %b "$VOICECALLID:$INCOMINGNUMBER\n" > $NOTIFDIR/sxmo_incomingcal= l echo "Number: $INCOMINGNUMBER (VOICECALLID: $VOICECALLID)" } =20 @@ -74,18 +74,11 @@ checkfornewtexts() { echo "$TEXTIDS" | grep -v . && return =20 # Loop each textid received and read out the data into appropriate logf= ile - { - sxmo_setpineled green 1 - sxmo_vibratepine 200; - sleep 0.1; - sxmo_vibratepine 200; - sleep 0.1; - sxmo_vibratepine 200; - } & - - for TEXTID in $(printf %b "$TEXTIDS") ; do + for TEXTID in $TEXTIDS; do + TEXTDATA=3D"$(mmcli -m "$(modem_n)" -s "$TEXTID" -K)" TEXT=3D"$(echo "$TEXTDATA" | grep sms.content.text | sed -E 's/^sms\.c= ontent\.text\s+:\s+//')" + TRUNCATED=3D"$(printf %b "$TEXT" | cut -c1-70 | tr '\n' ' ' | sed '$s/= $/\n/')" NUM=3D"$( echo "$TEXTDATA" |=20 grep sms.content.number |=20 @@ -97,12 +90,20 @@ checkfornewtexts() { printf %b "Received from $NUM at $TIME:\n$TEXT\n\n" >> "$LOGDIR/$NUM/s= ms.txt" printf %b "$TIME\trecv_txt\t$NUM\t${#TEXT} chars\n" >> "$LOGDIR/modeml= og.tsv" mmcli -m "$(modem_n)" --messaging-delete-sms=3D"$TEXTID" + + CONTACT=3D"$(sxmo_contacts.sh | grep $NUM || echo $NUM)" + + # Send a notice of each message to a notification file / watcher + if [ $(echo $TEXT | wc -m) =3D=3D $(echo $TRUNCATED | wc -m) ]; then + ( sxmo_notificationwrite.sh "Message from $CONTACT: $TEXT" "st -e tai= l -n9999 -f "$LOGDIR/$NUM/sms.txt"" "$LOGDIR/$NUM/sms.txt" & ) & + else + ( sxmo_notificationwrite.sh "Message from $CONTACT: $TRUNCATED..." "s= t -e tail -n9999 -f "$LOGDIR/$NUM/sms.txt"" "$LOGDIR/$NUM/sms.txt" & ) & + fi done } =20 mainloop() { while true; do - sxmo_setpineled green 0 checkforincomingcalls checkfornewtexts sleep $TIMEOUT & wait --=20 2.27.0