Compare commits
15 Commits
1a0ad68ad2
...
v2.0
Author | SHA1 | Date | |
---|---|---|---|
6f8b418e80 | |||
239d110f58 | |||
b24c0fad91 | |||
00a89467fd | |||
9c3cadd7dc | |||
43bec02a2c | |||
a7746d962c | |||
0727ff31c3 | |||
482d8ebed2 | |||
df4182b32f | |||
ef030f9cd1 | |||
e484405684 | |||
4d5abd5489 | |||
cff7288c9e | |||
b1f413660f |
33
README.md
33
README.md
@ -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,7 +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.
|
- 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
|
||||||
@ -36,8 +37,36 @@ An uppercase I looks like a 1, 3 from i3, and 8 because the song [We Are 138](ht
|
|||||||
- xorg-setxkbmap: [optional] for multiple keyboard layouts
|
- xorg-setxkbmap: [optional] for multiple keyboard layouts
|
||||||
- yad: For screen reader accessible dialogs
|
- yad: For screen reader accessible dialogs
|
||||||
|
|
||||||
I38 will try to detect your browser, file manager, and web browser and present you with a list of options to bind to their launch keys. It will also create bindings for pidgin and mumble if they are installed. To use the bindings, press your ratpoison mode key which is set when you run the i38.sh script. next, press the binding for the application you want, w for web browser, e for text editor, f for file manager, m for mumble, etc. To learn all the bindings, find and read the mode ratpoison section of ~/.config/i3/config.
|
I38 will try to detect your browser, file manager, and web browser and present you with a list of options to bind to their launch keys. It will also create bindings for pidgin and mumble if they are installed. To use the bindings, press your ratpoison mode key which is set when you run the i38.sh script. next, press the binding for the application you want; w for web browser, e for text editor, f for file manager, m for mumble, etc. To learn all the bindings, find and read the mode ratpoison section of ~/.config/i3/config.
|
||||||
|
|
||||||
|
The login sound uses the GTK sound theme. Configure this using GTK configuration files or gsettings. Replace "name" with the name of the theme you want to use.
|
||||||
|
|
||||||
|
Note that if you enable all sound events as shown below, you'll also hear GTK sounds when moving around menus, buttons, etc, if the sound theme has sounds for those events.
|
||||||
|
|
||||||
|
To configure the theme name with gsettings, do as follows.
|
||||||
|
|
||||||
|
gsettings set org.gnome.desktop.sound theme-name name
|
||||||
|
|
||||||
|
If you'd like all sound types enabled:
|
||||||
|
|
||||||
|
gsettings set org.gnome.desktop.sound input-feedback-sounds true
|
||||||
|
|
||||||
|
gsettings set org.gnome.desktop.sound event-sounds true
|
||||||
|
|
||||||
|
To configure with a config file, edit or create ~/.config/gtk-3.0/settings.ini
|
||||||
|
|
||||||
|
[Settings]
|
||||||
|
gtk-enable-event-sounds=1
|
||||||
|
gtk-enable-input-feedback-sounds=1
|
||||||
|
gtk-sound-theme-name=name
|
||||||
|
gtk-modules=canberra-gtk-module
|
||||||
|
|
||||||
|
You can apply the same configuration to GTK2 appss. Create or edit ~/.gtkrc-2.0
|
||||||
|
|
||||||
|
gtk-enable-event-sounds=1
|
||||||
|
gtk-enable-input-feedback-sounds=1
|
||||||
|
gtk-sound-theme-name=name
|
||||||
|
gtk-modules=canberra-gtk-module
|
||||||
|
|
||||||
## Usage:
|
## Usage:
|
||||||
|
|
||||||
|
15
i38.sh
15
i38.sh
@ -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
|
||||||
@ -524,8 +529,10 @@ bindsym Shift+slash exec ${i3Path}/scripts/i38-help.sh, mode "default"
|
|||||||
bindsym c exec $sensibleTerminal, mode "default"
|
bindsym c exec $sensibleTerminal, mode "default"
|
||||||
# Text editor bound to e
|
# Text editor bound to e
|
||||||
bindsym e exec $textEditor, mode "default"
|
bindsym e exec $textEditor, mode "default"
|
||||||
# File browser bound to f
|
$(if [[ ${#fileBrowser} -gt 3 ]]; then
|
||||||
bindsym f exec $fileBrowser, mode "default"
|
echo "# File browser bound to f"
|
||||||
|
echo "bindsym f exec $fileBrowser, mode \"default\""
|
||||||
|
fi)
|
||||||
# Email client bound to \$mod+e
|
# Email client bound to \$mod+e
|
||||||
bindsym \$mod+e exec $emailClient, mode "default"
|
bindsym \$mod+e exec $emailClient, mode "default"
|
||||||
# Web browser bound to w
|
# Web browser bound to w
|
||||||
@ -602,6 +609,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
|
||||||
@ -620,6 +630,7 @@ if [[ -x "/usr/libexec/notification-daemon" ]]; then
|
|||||||
fi
|
fi
|
||||||
if command -v remind &> /dev/null && command -v notify-send &> /dev/null ; then
|
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"
|
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"
|
||||||
|
touch ~/.reminders
|
||||||
fi
|
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'
|
||||||
|
@ -36,6 +36,91 @@ add_custom_reminder() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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!gtk-cancel:1" \
|
||||||
|
--button="Create Reminder!gtk-ok: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!gtk-cancel:1" \
|
||||||
|
--button="Create Reminder!gtk-ok: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() {
|
add_weekly_reminder() {
|
||||||
info="$(yad --form --selectable-labels \
|
info="$(yad --form --selectable-labels \
|
||||||
--title "I38 - New Weekly Reminder" \
|
--title "I38 - New Weekly Reminder" \
|
||||||
@ -51,12 +136,21 @@ add_weekly_reminder() {
|
|||||||
--field="Select Hour:":num '1!1..12' \
|
--field="Select Hour:":num '1!1..12' \
|
||||||
--field="Select Minute:":num '0!0..59' \
|
--field="Select Minute:":num '0!0..59' \
|
||||||
--field="Select AM or PM":cb 'AM!PM' \
|
--field="Select AM or PM":cb 'AM!PM' \
|
||||||
--button="Cancel:1" \
|
--button="Cancel!gtk-cancel:1" \
|
||||||
--button="Create Reminder:0")"
|
--button="Create Reminder!gtk-ok:0")"
|
||||||
|
|
||||||
|
# Properly handle window close events.
|
||||||
|
if [[ $? -eq 1 || $? -eq 252 ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
# Get information for reminder into an array
|
# Get information for reminder into an array
|
||||||
IFS='|' read -a reminder <<< $info
|
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.
|
# Change checked days into their name.
|
||||||
reminder[2]="${reminder[2]/TRUE/Sun}"
|
reminder[2]="${reminder[2]/TRUE/Sun}"
|
||||||
reminder[3]="${reminder[3]/TRUE/Mon}"
|
reminder[3]="${reminder[3]/TRUE/Mon}"
|
||||||
@ -93,6 +187,7 @@ add_weekly_reminder() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
view_reminders() {
|
view_reminders() {
|
||||||
if ! [[ -r ~/.reminders ]]; then
|
if ! [[ -r ~/.reminders ]]; then
|
||||||
error "No reminders found."
|
error "No reminders found."
|
||||||
@ -119,7 +214,7 @@ view_reminders() {
|
|||||||
# Display the reminders
|
# Display the reminders
|
||||||
reminder="$(yad --list --title "I38 - Reminders" --text "Current reminders:" \
|
reminder="$(yad --list --title "I38 - Reminders" --text "Current reminders:" \
|
||||||
--column "Reminder" "${yadMenu[@]}" \
|
--column "Reminder" "${yadMenu[@]}" \
|
||||||
--button="Close:1" --button="Delete:0" --response=1)"
|
--button="Close!gtk-ok:1" --button="Delete!gtk-delete:0" --response=1)"
|
||||||
if [[ $? -ne 0 ]]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@ -144,6 +239,21 @@ view_reminders() {
|
|||||||
done
|
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
|
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."
|
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
|
exit 1
|
||||||
@ -151,32 +261,60 @@ fi
|
|||||||
|
|
||||||
if [[ $# -ne 0 ]]; then
|
if [[ $# -ne 0 ]]; then
|
||||||
sox -ndqV0 synth .1 tri 600 norm -9 pad .05 repeat
|
sox -ndqV0 synth .1 tri 600 norm -9 pad .05 repeat
|
||||||
notify-send "$*"
|
notification="$*"
|
||||||
|
if [[ "${notification}" =~ "http" ]]; then
|
||||||
|
url="${notification##*http}"
|
||||||
|
url="${url%%[[:space:]]*}"
|
||||||
|
url="http${url}"
|
||||||
|
notification="${notification/${url}[[:space:]]/}"
|
||||||
|
url="${url%[[:space:].?!]}"
|
||||||
|
fi
|
||||||
|
if command -v xclip &> /dev/null && [[ "${#url}" -gt 3 ]]; then
|
||||||
|
echo "${url}" | xclip -selection clipboard
|
||||||
|
notify-send "${notification} The URL has been copied to the clipboard." --expire-time=30000
|
||||||
|
else
|
||||||
|
notify-send "${*}" --expire-time=30000
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
while : ; do
|
while : ; do
|
||||||
action=$(yad --title "I38 - Reminders" --form \
|
action=$(yad --title "I38 - Reminders" --form \
|
||||||
--button="_Add Reminder!gtk-ok":0 \
|
--button="_View Today's Reminders!gtk-info":2 \
|
||||||
--button="_View Reminders!gtk-info":2 \
|
--button="_View All Reminders!gtk-info":3 \
|
||||||
--button="Add Custom Reminder!gtk-edit":3 \
|
--button="_Add Daily Reminder!gtk-edit":0 \
|
||||||
|
--button="_Add Weekly Reminder!gtk-edit":4 \
|
||||||
|
--button="Add Monthly Reminder!gtk-edit":5 \
|
||||||
|
--button="Add Custom Reminder!gtk-edit":6 \
|
||||||
--button="Close!gtk-cancel":1 \
|
--button="Close!gtk-cancel":1 \
|
||||||
--separator="")
|
--separator="")
|
||||||
|
|
||||||
case $? in
|
case $? in
|
||||||
0)
|
0)
|
||||||
# Handle "Add Weekly Reminder" button click
|
# Handle "Add Daily Reminder" button click
|
||||||
add_weekly_reminder
|
add_daily_reminder
|
||||||
;;
|
;;
|
||||||
1|252)
|
1|252)
|
||||||
# Handle "Close" button click and escape.
|
# Handle "Close" button click and escape.
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
|
# View today's reminders
|
||||||
|
view_today
|
||||||
|
;;
|
||||||
|
3)
|
||||||
# View reminders
|
# View reminders
|
||||||
view_reminders
|
view_reminders
|
||||||
;;
|
;;
|
||||||
3)
|
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
|
# Handle "Add Custom Reminder" button click
|
||||||
add_custom_reminder
|
add_custom_reminder
|
||||||
;;
|
;;
|
||||||
|
Reference in New Issue
Block a user