13 Commits

Author SHA1 Message Date
e484405684 Updated readme to include libcanberra as an optional dependency. 2023-09-28 06:30:25 -06:00
4d5abd5489 Added login sound option, uses canberra-gtk-play if installed, if not doesn't ask. 2023-09-28 06:27:39 -06:00
cff7288c9e Add daily reminder option added. A second option for viewing today's reminders added. It is view only, and does not contain the delete option like view all reminders has. 2023-09-27 01:35:06 -04:00
b1f413660f Fixed up formatting for hours, minutes, and day of month. Properly handle window close events using cancel or escape. Add monthly reminder option. 2023-09-26 21:49:35 -04:00
1a0ad68ad2 Merge branch 'master' of ssh://git.stormux.org/storm/I38 2023-09-26 06:56:27 -06:00
556b8cb7d8 Added a window close sound to the sound script. 2023-09-26 06:38:02 -06:00
563e0277aa View reminder wil now tell you if there are no reminders. 2023-09-26 08:33:15 -04:00
4e00211c02 Reminder notifications now play a sound before they happen, so should be harder to miss. 2023-09-26 08:26:55 -04:00
e61d0394c3 Add Custom reminder option. 2023-09-25 08:54:51 -04:00
af77a60355 Reminder dialog now handles pressing escape to close. 2023-09-24 14:21:27 -04:00
80cb28dc10 Simple reminder management gui added. For now, only simple recurring reminders can be added. I may try to add more options in the future. This was a bit complex, so watch for bugs and make sure your reminders actually work before depending on its reliability. 2023-09-24 13:40:22 -04:00
2968bbe325 Forgot to remove the background from the remind command. It's handled by the i3 config. 2023-09-22 00:50:52 -04:00
15bf470616 Started work on adding reminders. 2023-09-19 21:45:00 -04:00
4 changed files with 330 additions and 0 deletions

View File

@ -19,6 +19,7 @@ An uppercase I looks like a 1, 3 from i3, and 8 because the song [We Are 138](ht
- dex: [optional] Alternative method for auto starting applications. - dex: [optional] Alternative method for auto starting applications.
- clipster: clipboard manager - clipster: clipboard manager
- jq: for getting the current workspace - jq: for getting the current workspace
- libcanberra: [optional]To play the desktop login sound.
- libnotify: For sending notifications - libnotify: For sending notifications
- lxsession: For policykit authentication agent. - lxsession: For policykit authentication agent.
- notification-daemon: To handle notifications - notification-daemon: To handle notifications
@ -26,6 +27,7 @@ An uppercase I looks like a 1, 3 from i3, and 8 because the song [We Are 138](ht
- pamixer: for the mute-unmute script - pamixer: for the mute-unmute script
- playerctl: music controls - playerctl: music controls
- python-i3ipc: for sounds etc. - python-i3ipc: for sounds etc.
- remind: [optional]For reminder notifications, Requires notify-daemon and notify-send for automatic reminders.
- sgtk-menu: for applications menu - sgtk-menu: for applications menu
- sox: for sounds. - sox: for sounds.
- transfersh: [optional] for file sharing GUI - transfersh: [optional] for file sharing GUI

15
i38.sh
View File

@ -366,6 +366,11 @@ brlapi=1
brlapi=$(yesno "Do you want to use a braille display with Orca?") brlapi=$(yesno "Do you want to use a braille display with Orca?")
sounds=1 sounds=1
sounds=$(yesno "Do you want window event sounds?") sounds=$(yesno "Do you want window event sounds?")
# Play Login Sound
loginSound=1
if command -v canberra-gtk-play &> /dev/null ; then
export loginSound=$(yesno "Would you like to play the default desktop-login sound according to your GTK sound theme upon login?")
fi
if [[ -d "${i3Path}" ]]; then if [[ -d "${i3Path}" ]]; then
yesno "This will replace your existing configuration at ${i3Path}. Do you want to continue?" || exit 0 yesno "This will replace your existing configuration at ${i3Path}. Do you want to continue?" || exit 0
@ -536,6 +541,10 @@ $(if command -v mumble &> /dev/null ; then
echo "# Mumble bound to m" echo "# Mumble bound to m"
echo "bindsym m exec $(command -v mumble), mode \"default\"" echo "bindsym m exec $(command -v mumble), mode \"default\""
fi) fi)
$(if command -v remind &> /dev/null ; then
echo "# Reminders bound to r"
echo "bindsym r exec --no-startup-id ${i3Path}/scripts/reminder.sh, mode \"default\""
fi)
$(if command -v ocrdesktop &> /dev/null ; then $(if command -v ocrdesktop &> /dev/null ; then
echo "# OCR desktop bound to print screen alternative \$mod+r" echo "# OCR desktop bound to print screen alternative \$mod+r"
echo "bindsym Print exec $(command -v ocrdesktop) -b, mode \"default\"" echo "bindsym Print exec $(command -v ocrdesktop) -b, mode \"default\""
@ -598,6 +607,9 @@ cat << EOF >> ${i3Path}/config
$(if [[ $sounds -eq 0 ]]; then $(if [[ $sounds -eq 0 ]]; then
echo "exec_always --no-startup-id ${i3Path}/scripts/sound.py" echo "exec_always --no-startup-id ${i3Path}/scripts/sound.py"
fi fi
if [[ $loginSound -eq 0 ]]; then
echo 'exec --no-startup-id canberra-gtk-play -i desktop-login'
fi
if [[ $brlapi -eq 0 ]]; then if [[ $brlapi -eq 0 ]]; then
echo 'exec --no-startup-id xbrlapi --quiet' echo 'exec --no-startup-id xbrlapi --quiet'
fi fi
@ -614,6 +626,9 @@ fi
if [[ -x "/usr/libexec/notification-daemon" ]]; then if [[ -x "/usr/libexec/notification-daemon" ]]; then
echo 'exec_always --no-startup-id /usr/libexec/notification-daemon -r' echo 'exec_always --no-startup-id /usr/libexec/notification-daemon -r'
fi fi
if command -v remind &> /dev/null && command -v notify-send &> /dev/null ; then
echo "exec_always --no-startup-id $(command -v remind) -z '-k:${HOME}/.config/i3/scripts/reminder.sh %s &' ${HOME}/.reminders < /dev/null > /dev/null 2>&1"
fi
if [[ $dex -eq 0 ]]; then if [[ $dex -eq 0 ]]; then
echo '# Start XDG autostart .desktop files using dex. See also' echo '# Start XDG autostart .desktop files using dex. See also'
echo '# https://wiki.archlinux.org/index.php/XDG_Autostart' echo '# https://wiki.archlinux.org/index.php/XDG_Autostart'

309
scripts/reminder.sh Executable file
View File

@ -0,0 +1,309 @@
#!/usr/bin/env bash
error() {
yad --form --selectable-labels --title "I38 - Reminder Error" --field="${*}":lbl --button="Close!gtk-ok":0
}
message() {
yad --form --selectable-labels --title "I38 - Reminder" --field="${*}":lbl --button="Close!gtk-ok":0
}
add_custom_reminder() {
info="$(yad --form --selectable-labels \
--title "I38 - New Custom Reminder" \
--field="Comment for ~/.reminders file":lbl "" \
--field="Reminder Comment" "" \
--field="Reminder entry. Remember for notifications, it must ccontain the +5 after the time and the %2. at the end of the MSG.":lbl "" \
--field="Reminder" "REM at +5 MSG %2.")"
if [[ $? -eq 1 || $? -eq 252 ]]; then
return
fi
while [[ $info =~ \|\| ]]; do
info="${info//||/|}"
done
info="${info#|#}"
# Get information for reminder into an array
IFS='|' read -a reminder <<< $info
if [[ "${reminder[0]}" != "# " ]]; then
echo "# ${reminder[0]}" >> ~/.reminders
fi
if [[ "${reminder[1]}" != "REM at +5 MSG %2." ]]; then
echo "${reminder[1]}" >> ~/.reminders
message "Custom reminder added."
else
error "No reminder text entered, No action taken."
fi
}
add_daily_reminder() {
info="$(yad --form --selectable-labels \
--title "I38 - New Daily Reminder" \
--field="Reminder Text" "" \
--field="Select Hour:":num '1!1..12' \
--field="Select Minute:":num '0!0..59' \
--field="Select AM or PM":cb 'AM!PM' \
--button="Cancel:1" \
--button="Create Reminder:0")"
# Properly handle window close events.
if [[ $? -eq 1 || $? -eq 252 ]]; then
return
fi
# Get information for reminder into an array
IFS='|' read -a reminder <<< $info
# Fix time to be 2 digits.
[[ ${#reminder[1]} -eq 1 ]] && reminder[1]="0${reminder[1]}"
[[ ${#reminder[2]} -eq 1 ]] && reminder[2]="0${reminder[2]}"
# Make sure we have reminder text
if [[ ${#reminder[0]} -lt 3 ]]; then
error "No reminder text given, addition canceled."
return
fi
reminderEntry="REM AT ${reminder[1]}:${reminder[2]}${reminder[3]} +5 REPEAT daily MSG ${reminder[0]} %2."
echo "# Added by I38." >> ~/.reminders
echo "$reminderEntry" >> ~/.reminders
if [[ -N ~/.reminders ]]; then
message "Reminder added."
else
error "Something went wrong. The reminder was not added."
fi
}
add_monthly_reminder() {
info="$(yad --form --selectable-labels \
--title "I38 - New Monthly Reminder" \
--field="For dates over 28, some months may be skipped. If you want to be sure of the last day of the month, check the last day of month box.":lbl "" \
--field="Reminder Text" "" \
--field="Select Date:":num '1!1..31' \
--field="Select Hour:":num '1!1..12' \
--field="Select Minute:":num '0!0..59' \
--field="Select AM or PM":cb 'AM!PM' \
--field="Last day of month":chk "FALSE" \
--button="Cancel:1" \
--button="Create Reminder:0")"
# Properly handle window close events.
if [[ $? -eq 1 || $? -eq 252 ]]; then
return
fi
# Get information for reminder into an array
IFS='|' read -a reminder <<< $info
# Fix time and date to be 2 digits.
[[ ${#reminder[2]} -eq 1 ]] && reminder[2]="0${reminder[2]}"
[[ ${#reminder[3]} -eq 1 ]] && reminder[3]="0${reminder[3]}"
[[ ${#reminder[4]} -eq 1 ]] && reminder[4]="0${reminder[4]}"
# Make sure we have reminder text
if [[ ${#reminder[1]} -lt 3 ]]; then
error "No reminder text given, addition canceled."
return
fi
if [[ "${reminder[6]}" == "FALSE" ]]; then
reminderEntry="REM ${reminder[2]} "
else
reminderEntry="REM 1 -1 "
fi
reminderEntry+="AT ${reminder[3]}:${reminder[4]}${reminder[5]} +5 REPEAT monthly MSG ${reminder[1]} %2."
echo "# Added by I38." >> ~/.reminders
echo "$reminderEntry" >> ~/.reminders
if [[ -N ~/.reminders ]]; then
message "Reminder added."
else
error "Something went wrong. The reminder was not added."
fi
}
add_weekly_reminder() {
info="$(yad --form --selectable-labels \
--title "I38 - New Weekly Reminder" \
--field="Reminder Text" "" \
--field="Select Days":lbl "" \
--field="Sunday":chk "FALSE" \
--field="Monday":chk "FALSE" \
--field="Tuesday":chk "FALSE" \
--field="Wednesday":chk "FALSE" \
--field="Thursday":chk "FALSE" \
--field="Friday":chk "FALSE" \
--field="Saturday":chk "FALSE" \
--field="Select Hour:":num '1!1..12' \
--field="Select Minute:":num '0!0..59' \
--field="Select AM or PM":cb 'AM!PM' \
--button="Cancel:1" \
--button="Create Reminder:0")"
# Properly handle window close events.
if [[ $? -eq 1 || $? -eq 252 ]]; then
return
fi
# Get information for reminder into an array
IFS='|' read -a reminder <<< $info
# Fix time to be 2 digits.
[[ ${#reminder[9]} -eq 1 ]] && reminder[9]="0${reminder[9]}"
[[ ${#reminder[10]} -eq 1 ]] && reminder[10]="0${reminder[10]}"
# Change checked days into their name.
reminder[2]="${reminder[2]/TRUE/Sun}"
reminder[3]="${reminder[3]/TRUE/Mon}"
reminder[4]="${reminder[4]/TRUE/Tue}"
reminder[5]="${reminder[5]/TRUE/Wed}"
reminder[6]="${reminder[6]/TRUE/Thu}"
reminder[7]="${reminder[7]/TRUE/Fri}"
reminder[8]="${reminder[8]/TRUE/Sat}"
# Make sure we have reminder text
if [[ ${#reminder[0]} -lt 3 ]]; then
error "No reminder text given, addition canceled."
return
fi
reminderEntry="REM "
noDays=1
for ((i=2;i<=8;i++)) ; do
if [[ "${reminder[i]}" != "FALSE" ]]; then
reminderEntry+="${reminder[i]} "
noDays=0
fi
done
if [[ $noDays -eq 1 ]]; then
error "No days were selected for the reminder. Nothing changed."
return
fi
reminderEntry+="AT ${reminder[9]}:${reminder[10]}${reminder[11]} +5 REPEAT weekly MSG ${reminder[0]} %2."
echo "# Added by I38." >> ~/.reminders
echo "$reminderEntry" >> ~/.reminders
if [[ -N ~/.reminders ]]; then
message "Reminder added."
else
error "Something went wrong. The reminder was not added."
fi
}
view_reminders() {
if ! [[ -r ~/.reminders ]]; then
error "No reminders found."
return
fi
mapfile -t lines < ~/.reminders
# Create an empty array to store cleaned-up reminders
yadMenu=()
# Iterate through the reminder lines and clean them up
for i in "${lines[@]}"; do
# Remove the "REM" prefix and leading/trailing spaces
formattedLine="${i#*REM }"
# Remove MSG from the output.
formattedLine="${formattedLine/MSG /}"
# remove the usually %2. from the end of the line, but accept any digit in case someone changes it.
formattedLine="${formattedLine% %[[:digit:]].}"
# Add to the menu
yadMenu+=("$formattedLine")
done
# Display the reminders
reminder="$(yad --list --title "I38 - Reminders" --text "Current reminders:" \
--column "Reminder" "${yadMenu[@]}" \
--button="Close:1" --button="Delete:0" --response=1)"
if [[ $? -ne 0 ]]; then
return
fi
if [[ "${reminder:0:1}" == "#" ]]; then
error "Please select the actual reminder to be deleted, anything starting with # is only a comment. Nothing changed."
return
fi
# Remove the | from the end of reminder
reminder="${reminder%|}"
# Find the index to remove from lines.
for i in "${!yadMenu[@]}" ; do
if [[ "${yadMenu[i]}" == "${reminder}" ]]; then
# Delete selected reminder and possible preceeding comment.
commentIndex=$((i - 1))
if [[ "${lines[commentIndex]:0:1}" == "#" ]]; then
unset lines[$commentIndex]
fi
unset lines[$i]
message "Reminder deleted."
printf "%s\n" "${lines[@]}" > ~/.reminders
fi
done
}
view_today() {
if ! [[ -r ~/.reminders ]]; then
error "No reminders found."
return
fi
mapfile -t lines < <(rem | tr -s $'\n')
# Display the reminders
yad --list --title "I38 - Reminders" --text "Today's reminders:" \
--column "Reminder" "${lines[@]}" \
--button="Close!gtk-ok:0"
}
if ! command -v remind &> /dev/null ; then
error "Please install remind. For notifications, please make sure to have notification-daemon and notify-send as well. Run i38.sh to regenerate your i3 config after the needed components are installed."
exit 1
fi
if [[ $# -ne 0 ]]; then
sox -ndqV0 synth .1 tri 600 norm -9 pad .05 repeat
notify-send "$*"
exit 0
fi
while : ; do
action=$(yad --title "I38 - Reminders" --form \
--button="_View Today's Reminders!gtk-info":2 \
--button="_View All Reminders!gtk-info":3 \
--button="_Add Daily Reminder!gtk-ok":0 \
--button="_Add Weekly Reminder!gtk-ok":4 \
--button="Add Monthly Reminder!gtk-ok":5 \
--button="Add Custom Reminder!gtk-edit":6 \
--button="Close!gtk-cancel":1 \
--separator="")
case $? in
0)
# Handle "Add Daily Reminder" button click
add_daily_reminder
;;
1|252)
# Handle "Close" button click and escape.
exit 0
;;
2)
# View today's reminders
view_today
;;
3)
# View reminders
view_reminders
;;
4)
# Handle "Add Weekly Reminder" button click
add_weekly_reminder
;;
5)
# Handle "Add Monthly Reminder" button click
add_monthly_reminder
;;
6)
# Handle "Add Custom Reminder" button click
add_custom_reminder
;;
esac
done

View File

@ -12,6 +12,9 @@ i3 = i3ipc.Connection()
def on_new_window(self,i3): def on_new_window(self,i3):
system('play -n synth .25 sin 440:880 sin 480:920 remix - norm -3 pitch -500 &') system('play -n synth .25 sin 440:880 sin 480:920 remix - norm -3 pitch -500 &')
def on_close_window(self,i3):
system('play -n synth .25 sin 880:440 sin 920:480 remix - norm -3 pitch -500 &')
def on_mode(self,event): def on_mode(self,event):
mode= event.change mode= event.change
if mode == 'ratpoison': if mode == 'ratpoison':
@ -42,6 +45,7 @@ def on_fullscreen(self,i3):
i3 = i3ipc.Connection() i3 = i3ipc.Connection()
i3.on('window::new', on_new_window) i3.on('window::new', on_new_window)
i3.on('window::close', on_close_window)
i3.on(Event.MODE, on_mode) i3.on(Event.MODE, on_mode)
i3.on('workspace::focus', on_workspace_focus) i3.on('workspace::focus', on_workspace_focus)
i3.on('window::move', on_workspace_move) i3.on('window::move', on_workspace_move)