15 Commits
v1.8 ... v1.9

Author SHA1 Message Date
19d201ecf4 Experimental multiple keyboard support added. 2023-08-31 01:31:51 -04:00
cb7bfb36e8 Add lxpolkit for policy kit authentication. 2023-08-30 16:08:24 -04:00
9c16367299 Email client bound to alt+e in ratpoison mode. 2023-08-29 16:57:06 -04:00
68620696fc Forgot to actually add some of my changes. 2023-08-29 16:23:51 -04:00
43067c0efe Fixed a couple of problems with screen brightness script. 2023-08-29 16:19:43 -04:00
4773bdae87 Screen brightness script added. 2023-08-29 16:14:11 -04:00
ea7450bb8b Fixed a bug when opening a terminal with RP + c. 2023-07-05 20:43:30 -04:00
50f7bd809a Work on Sway support for the window lister. Unfortunately, most of the window IDs that get returned are "None" so you can't actually select the window, but it does list them now. 2023-06-14 02:05:36 -04:00
1de8cde4cf Updated optional applications list in the README. 2023-06-10 13:21:29 -04:00
7ee783edeb Add ability to have removable storage auto mounted if udiskie is detected. 2023-06-07 00:15:13 -04:00
9c1ac5f7f3 Sound added for custom modes. Default mode sound should only play when switching back to the default mode now. This means we now have ratpoison mode sound, bypassmode sound, default sound for when no mode is being used other than default bindings, and custom, for when you add your on modes in the customizations file. 2023-06-01 15:47:10 -04:00
dca451c996 Workspace switching sound should now work correctly in Sway. 2023-06-01 15:20:52 -04:00
61cdfffc0d Window list should now work for sway. 2023-06-01 15:10:47 -04:00
5851aec8b3 Make the sway option use the sway version of sensible-terminal. 2023-06-01 14:48:52 -04:00
8b30abc8b6 Bypass mode added. In this mode, all keys except the toggle bypass mode key, mod+shift+backspace, will be passed to the application. As far as I know, the toggle key should not conflict with anything. 2023-04-25 19:09:20 -04:00
7 changed files with 283 additions and 10 deletions

View File

@ -20,6 +20,7 @@ An uppercase I looks like a 1, 3 from i3, and 8 because the song [We Are 138](ht
- clipster: clipboard manager - clipster: clipboard manager
- jq: for getting the current workspace - jq: for getting the current workspace
- libnotify: For sending notifications - libnotify: For sending notifications
- lxsession: For policykit authentication agent.
- notification-daemon: To handle notifications - notification-daemon: To handle notifications
- ocrdesktop: For getting contents of the current window with OCR. - ocrdesktop: For getting contents of the current window with OCR.
- pamixer: for the mute-unmute script - pamixer: for the mute-unmute script
@ -28,7 +29,10 @@ An uppercase I looks like a 1, 3 from i3, and 8 because the song [We Are 138](ht
- 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
- udiskie: [optional] for automatically mounting removable storage
- xclip: Clipboard support - xclip: Clipboard support
- xbacklight: [optional] for screen brightness adjustment
- 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.

164
i38.sh
View File

@ -6,6 +6,7 @@
i3Path="${XDG_CONFIG_HOME:-$HOME/.config}/i3" i3Path="${XDG_CONFIG_HOME:-$HOME/.config}/i3"
i3msg="i3-msg" i3msg="i3-msg"
sensibleTerminal="i3-sensible-terminal"
# Dialog accessibility # Dialog accessibility
export DIALOGOPTS='--no-lines --visit-items' export DIALOGOPTS='--no-lines --visit-items'
@ -24,6 +25,105 @@ if [[ -n "${missing}" ]]; then
exit 1 exit 1
fi fi
keyboard_menu() {
keyboardMenu=("us" "USA"
"ad" "Andorra"
"af" "Afghanistan"
"ara" "Arabic"
"al" "Albania"
"am" "Armenia"
"az" "Azerbaijan"
"by" "Belarus"
"be" "Belgium"
"bd" "Bangladesh"
"in" "India"
"ba" "Bosnia and Herzegovina"
"br" "Brazil"
"bg" "Bulgaria"
"ma" "Morocco"
"mm" "Myanmar"
"ca" "Canada"
"cd" "Congo, Democratic Republic of the"
"cn" "China"
"hr" "Croatia"
"cz" "Czechia"
"dk" "Denmark"
"nl" "Netherlands"
"bt" "Bhutan"
"ee" "Estonia"
"ir" "Iran"
"iq" "Iraq"
"fo" "Faroe Islands"
"fi" "Finland"
"fr" "France"
"gh" "Ghana"
"gn" "Guinea"
"ge" "Georgia"
"de" "Germany"
"gr" "Greece"
"hu" "Hungary"
"is" "Iceland"
"il" "Israel"
"it" "Italy"
"jp" "Japan"
"kg" "Kyrgyzstan"
"kh" "Cambodia"
"kz" "Kazakhstan"
"la" "Laos"
"latam" "Latin American"
"lt" "Lithuania"
"lv" "Latvia"
"mao" "Maori"
"me" "Montenegro"
"mk" "Macedonia"
"mt" "Malta"
"mn" "Mongolia"
"no" "Norway"
"pl" "Poland"
"pt" "Portugal"
"ro" "Romania"
"ru" "Russia"
"rs" "Serbia"
"si" "Slovenia"
"sk" "Slovakia"
"es" "Spain"
"se" "Sweden"
"ch" "Switzerland"
"sy" "Syria"
"tj" "Tajikistan"
"lk" "Sri Lanka"
"th" "Thailand"
"tr" "Turkey"
"tw" "Taiwan"
"ua" "Ukraine"
"gb" "United Kingdom"
"uz" "Uzbekistan"
"vn" "Vietnam"
"kr" "Korea, Republic of"
"nec_vndr/jp" "Japan (PC-98xx Series)"
"ie" "Ireland"
"pk" "Pakistan"
"mv" "Maldives"
"za" "South Africa"
"epo" "Esperanto"
"np" "Nepal"
"ng" "Nigeria"
"et" "Ethiopia"
"sn" "Senegal"
"brai" "Braille"
"tm" "Turkmenistan"
"ml" "Mali"
"tz" "Tanzania"
)
dialog --title "I38" \
--backtitle "Use the arrow keys to find the option you want, and enter to select it. When you are finished selecting layouts, use right arrow to find \"Done\" and press enter." \
--clear \
--cancel-label "Done" \
--no-tags \
--menu "Select Keyboard Layout" 0 0 0 "${keyboardMenu[@]}" --stdout
return $?
}
menulist() { menulist() {
# Args: List of items for menu. # Args: List of items for menu.
# returns: selected tag # returns: selected tag
@ -37,7 +137,7 @@ menulist() {
--backtitle "Use the arrow keys to find the option you want, and enter to select it." \ --backtitle "Use the arrow keys to find the option you want, and enter to select it." \
--clear \ --clear \
--no-tags \ --no-tags \
--menu "$menuText" 0 0 0 ${menuList[@]} --stdout --menu "$menuText" 0 0 0 "${menuList[@]}" --stdout
return $? return $?
} }
@ -147,6 +247,7 @@ while getopts "${args}" i ; do
s) s)
i3msg="swaymsg" i3msg="swaymsg"
i3Path="${XDG_CONFIG_HOME:-$HOME/.config}/sway" i3Path="${XDG_CONFIG_HOME:-$HOME/.config}/sway"
sensibleTerminal="sway --sensible-terminal"
;; ;;
u) update_scripts;; u) update_scripts;;
x) write_xinitrc ;& x) write_xinitrc ;&
@ -170,11 +271,35 @@ while [[ "$escapeKey" == "$mod" ]]; do
dialog --title "I38" --msgbox "Ratpoison and mod key cannot be the same key." -1 -1 dialog --title "I38" --msgbox "Ratpoison and mod key cannot be the same key." -1 -1
fi fi
done done
# Multiple keyboard layouts
if [[ $(yesno "Do you want to use multiple keyboard layouts?") -eq 0 ]]; then
unset kbd
while : ; do
kbd+=("$(keyboard_menu)") || break
done
fi
# Volume jump # Volume jump
volumeJump=$(rangebox "How much should pressing the volume keys change the volume?" 1 15 5) volumeJump=$(rangebox "How much should pressing the volume keys change the volume?" 1 15 5)
# Email client
unset programList
for i in betterbird evolution thunderbird ; do
if command -v ${i/#-/} &> /dev/null ; then
if [ -n "$programList" ]; then
programList="$programList $i"
else
programList="$i"
fi
fi
done
if [ "$programList" != "${programList// /}" ]; then
emailClient="$(menulist "Email client:" $programList)"
else
emailClient="${programList/#-/}"
fi
emailClient="$(command -v $emailClient)"
# Web browser # Web browser
unset programList unset programList
for i in brave chromium epiphany firefox google-chrome-stable midori seamonkey ; do for i in brave chromium epiphany firefox google-chrome-stable microsoft-edge microsoft-edge-beta microsoft-edge-dev midori seamonkey ; do
if command -v ${i/#-/} &> /dev/null ; then if command -v ${i/#-/} &> /dev/null ; then
if [ -n "$programList" ]; then if [ -n "$programList" ]; then
programList="$programList $i" programList="$programList $i"
@ -224,6 +349,11 @@ else
fileBrowser="${programList/#-/}" fileBrowser="${programList/#-/}"
fi fi
fileBrowser="$(command -v $fileBrowser)" fileBrowser="$(command -v $fileBrowser)"
# Auto mount removable media
udiskie=1
if command -v udiskie &> /dev/null ; then
export udiskie=$(yesno "Would you like removable drives to automatically mount when plugged in?")
fi
# Auto start with dex # Auto start with dex
dex=1 dex=1
if command -v dex &> /dev/null ; then if command -v dex &> /dev/null ; then
@ -302,7 +432,7 @@ bindsym XF86AudioStop exec --no-startup-id play -qV0 "| sox -np synth 0.03 sin 2
bindsym XF86AudioNext exec --no-startup-id play -qV0 "| sox -np synth 0.03 sin 2000 pad 0 .02" "| sox -np synth 0.03 sin 2000" norm 1.0 vol 0.4 & ${i3Path}/scripts/music_controler.sh next bindsym XF86AudioNext exec --no-startup-id play -qV0 "| sox -np synth 0.03 sin 2000 pad 0 .02" "| sox -np synth 0.03 sin 2000" norm 1.0 vol 0.4 & ${i3Path}/scripts/music_controler.sh next
# start a terminal # start a terminal
bindsym \$mod+Return exec i3-sensible-terminal bindsym \$mod+Return exec $sensibleTerminal
# kill focused window # kill focused window
bindsym \$mod+F4 kill bindsym \$mod+F4 kill
@ -367,8 +497,22 @@ bindsym Control+Shift+F9 move container to workspace number \$ws9, exec spd-say
bindsym Control+Shift+F10 move container to workspace number \$ws10, exec spd-say -P important -Cw "moved to workspace 10" bindsym Control+Shift+F10 move container to workspace number \$ws10, exec spd-say -P important -Cw "moved to workspace 10"
# A mode that will pass all keys except $mod+shift+backspace to the current application.
# Use $mod+shift+backspace to exit the mode.
bindsym $mod+shift+BackSpace mode "bypass"
mode "bypass" {
# Exit bypass mode.
bindsym $mod+Shift+BackSpace mode "default"
}
EOF EOF
# Multiple keyboard layouts if requested.
if [[ ${#kbd[@]} -gt 1 ]]; then
echo "bindsym Mod4+space exec ${i3Path}/scripts/keyboard.sh cycle ${kbd[@]}" >> ${i3Path}/config
fi
# Create ratpoison mode if requested. # Create ratpoison mode if requested.
if [[ -n "${escapeKey}" ]]; then if [[ -n "${escapeKey}" ]]; then
cat << EOF >> ${i3Path}/config cat << EOF >> ${i3Path}/config
@ -377,11 +521,13 @@ mode "ratpoison" {
# I38 help bound to ? # I38 help bound to ?
bindsym Shift+slash exec ${i3Path}/scripts/i38-help.sh, mode "default" bindsym Shift+slash exec ${i3Path}/scripts/i38-help.sh, mode "default"
# Terminal emulator bound to c # Terminal emulator bound to c
bindsym c exec i3-sensible-terminal, 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 # File browser bound to f
bindsym f exec $fileBrowser, mode "default" bindsym f exec $fileBrowser, mode "default"
# Email client bound to \$mod+e
bindsym \$mod+e exec $emailClient, mode "default"
# Web browser bound to w # Web browser bound to w
bindsym w exec $webBrowser, mode "default" bindsym w exec $webBrowser, mode "default"
# Kill window bound to k # Kill window bound to k
@ -399,6 +545,10 @@ $(if command -v pidgin &> /dev/null ; then
echo "# p bound to pidgin" echo "# p bound to pidgin"
echo "bindsym p exec $(command -v pidgin), mode \"default\"" echo "bindsym p exec $(command -v pidgin), mode \"default\""
fi) fi)
$(if command -v xrandr &> /dev/null ; then
echo "# alt+s bound to brightness control"
echo "bindsym \$mod+s exec --no-startup-id ${i3Path}/scripts/screen_controller.sh, mode \"default\""
fi)
$(if command -v transfersh &> /dev/null ; then $(if command -v transfersh &> /dev/null ; then
echo "# t bound to share file with transfer.sh" echo "# t bound to share file with transfer.sh"
echo 'bindsym t exec bash -c '"'"'fileName="$(yad --title "I38 Upload File" --file)" && url="$(transfersh "${fileName}" | tee >(yad --title "I38 - Uploading ${fileName##*/} ..." --progress --pulsate --auto-close))" && echo "${url#*saved at: }" | tee >(yad --title "I38 - Upload URL" --show-cursor --show-uri --button yad-close --sticky --text-info) >(xclip -selection clipboard)'"', mode \"default\"" echo 'bindsym t exec bash -c '"'"'fileName="$(yad --title "I38 Upload File" --file)" && url="$(transfersh "${fileName}" | tee >(yad --title "I38 - Uploading ${fileName##*/} ..." --progress --pulsate --auto-close))" && echo "${url#*saved at: }" | tee >(yad --title "I38 - Upload URL" --show-cursor --show-uri --button yad-close --sticky --text-info) >(xclip -selection clipboard)'"', mode \"default\""
@ -451,6 +601,12 @@ 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
if [[ $udiskie -eq 0 ]]; then
echo 'exec --no-startup-id udiskie'
fi
if command -v lxpolkit &> /dev/null ; then
echo "exec_always --no-startup-id $(command -v lxpolkit)"
fi
if [[ -x "/usr/lib/notification-daemon-1.0/notification-daemon" ]]; then if [[ -x "/usr/lib/notification-daemon-1.0/notification-daemon" ]]; then
echo 'exec_always --no-startup-id /usr/lib/notification-daemon-1.0/notification-daemon -r' echo 'exec_always --no-startup-id /usr/lib/notification-daemon-1.0/notification-daemon -r'
fi fi

View File

@ -1,8 +1,17 @@
#!/usr/bin/env bash #!/usr/bin/env bash
workSpace="$(i3-msg -t get_workspaces \ path="$(readlink -f $0)"
| jq '.[] | select(.focused==true).name' \ path="${path%/*/*}"
| cut -d"\"" -f2)" path="${path##*/}"
if [[ "$path" == "i3" ]]; then
workSpace="$(i3-msg -t get_workspaces \
| jq '.[] | select(.focused==true).name' \
| cut -d"\"" -f2)"
else
workSpace="$(swaymsg -t get_workspaces \
| jq '.[] | select(.focused==true).name' \
| cut -d"\"" -f2)"
fi
left=9 left=9
right=0 right=0
msg="Workspace ${workSpace}" msg="Workspace ${workSpace}"

48
scripts/keyboard.sh Executable file
View File

@ -0,0 +1,48 @@
#!/usr/bin/env bash
# This script is a modified version of i3-keyboard-layout.
# Originally Copyright (c) 2018 Sergio Gil.
# https://github.com/porras/i3-keyboard-layout
# This modified script, like the rest of I38, is released under the WTFPL license.
# The original work was released under the MIT license.
set -e
get_kbdlayout() {
layout=$(setxkbmap -query | grep -oP 'layout:\s*\K([\w,]+)')
variant=$(setxkbmap -query | grep -oP 'variant:\s*\K(\w+)')
echo "$layout" "$variant"
}
set_kbdlayout() {
eval "array=($1)"
setxkbmap "${array[@]}" &&
spd-say -P important -Cw "${array[@]}"
}
cycle() {
current_layout=$(get_kbdlayout | xargs)
layouts=("$@" "$1") # add the first one at the end so that it cycles
index=0
while [ "${layouts[$index]}" != "$current_layout" ] && [ $index -lt "${#layouts[@]}" ]; do index=$[index +1]; done
next_index=$[index +1]
next_layout=${layouts[$next_index]}
set_kbdlayout "$next_layout"
}
subcommand="$1"
shift || exit 1
case $subcommand in
"get")
echo -n $(get_kbdlayout)
;;
"cycle")
cycle "$@"
;;
esac
exit 0

24
scripts/screen_controller.sh Executable file
View File

@ -0,0 +1,24 @@
#!/usr/bin/env bash
# Not for multiple screens.
# Get the name of the screen.
screenName="$(xrandr --query | grep "connected" | cut -d ' ' -f1 | head -n 1)"
menuOptions=(
"1.0" "Maximum Brightness"
"0.75" "75 percent"
"0.5" "50 percent"
"0.25" "25 percent"
"0" "Screen Curtain"
)
brightness="$(yad --list --title "I38" --text "Set Screen Brightness" --columns 2 --hide-column 1 --column "" --column "Select" "${menuOptions[@]}")"
if [[ ${#brightness} -lt 1 ]]; then
exit 0
fi
xrandr --output ${screenName} --brightness ${brightness%%|*} &&
spd-say -P important -Cw "Screen set to ${brightness#*|}."
exit 0

View File

@ -14,10 +14,14 @@ def on_new_window(self,i3):
def on_mode(self,event): def on_mode(self,event):
mode= event.change mode= event.change
if mode == 'default': if mode == 'ratpoison':
system('play -qV0 "|sox -np synth .07 sq 400" "|sox -np synth .5 sq 800" fade h 0 .5 .5 norm -20 &')
elif mode == 'bypass':
system('play -nqV0 synth .1 saw 700 saw 1200 delay 0 .04 remix - norm -6')
elif mode == 'default':
system('play -qV0 "|sox -np synth .07 sq 400" "|sox -np synth .5 sq 800" fade h 0 .5 .5 norm -20 reverse &') system('play -qV0 "|sox -np synth .07 sq 400" "|sox -np synth .5 sq 800" fade h 0 .5 .5 norm -20 reverse &')
else: else:
system('play -qV0 "|sox -np synth .07 sq 400" "|sox -np synth .5 sq 800" fade h 0 .5 .5 norm -20 &') system('play -n synth 0.05 pluck F3 norm -8 : synth 0.05 pluck C4 norm -8 : synth 0.05 pluck F4 norm -8 : synth 0.05 pluck C5 norm -8')
def on_workspace_focus(self,i3): def on_workspace_focus(self,i3):
#system('play -qnV0 synth pi fade 0 .25 .15 pad 0 1 reverb overdrive riaa norm -8 speed 1 &') #system('play -qnV0 synth pi fade 0 .25 .15 pad 0 1 reverb overdrive riaa norm -8 speed 1 &')

View File

@ -1,5 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
path="$(readlink -f $0)"
path="${path%/*/*}"
path="${path##*/}"
if [[ "$path" == "i3" ]]; then
mapfile -t windowList < <(python3 -c ' mapfile -t windowList < <(python3 -c '
import i3ipc import i3ipc
@ -13,4 +17,28 @@ id="$(yad --title "I38" --list --separator "" --column "id" --column "Select Win
if [[ -z "${id}" ]]; then if [[ -z "${id}" ]]; then
exit 0 exit 0
fi fi
i3-msg \[id="${id}"\] focus i3-msg \[id="${id}"\] focus
else
mapfile -t windowList < <(python3 -c '
import i3ipc
i3 = i3ipc.Connection()
for con in i3.get_tree():
if con.window or con.type == "con":
if con.name:
print(con.window)
print(con.name)')
# Remove the first entry if it is "none"
if [[ "${windowList[0]}" == "none" ]]; then
unset "windowList[0]"
fi
id="$(yad --title "I38" --list --separator "" --column "id" --column "Select Window" --hide-column 1 --print-column 1 "${windowList[@]}")"
if [[ -z "${id}" ]]; then
exit 0
fi
swaymsg \[id="${id}"\] focus
fi