diff --git a/.gitignore b/.gitignore index 209c003..a0abc6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store oh-my-posh/posh-* zinit/ -./config +config +*.bak diff --git a/main b/main index 09b81d2..cb3ebc7 100644 --- a/main +++ b/main @@ -22,6 +22,13 @@ fi # # Source the normal configuration source "${CONFIG_PATH}" +# Add ~/.local/bin and ~/bin to the PATH +if [ -d "$HOME/bin" ]; then + export PATH="$HOME/bin:$PATH" +fi +if [ -d "$HOME/.local/bin" ]; then + export PATH="$HOME/.local/bin:$PATH" +fi # # Detect Device Arch arch="$(uname -m | tr '[:upper:]' '[:lower:]')" diff --git a/oh-my-posh/basic.toml b/oh-my-posh/basic.toml index 175295d..f146866 100644 --- a/oh-my-posh/basic.toml +++ b/oh-my-posh/basic.toml @@ -1,47 +1,42 @@ -"$schema" = "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json" +console_title_template = '{{.PWD}}' +version = 3 final_space = true -version = 2 -console_title_template = "{{.PWD}}" - -[[blocks]] -type = "prompt" -alignment = "left" -newline = true - - [[blocks.segments]] - type = "root" - style = "plain" - template = "(Root) " - - [[blocks.segments]] - type = "session" - style = "plain" - template = "{{ if .SSHSession }}(SSH) {{ end }}" - - [[blocks.segments]] - type = "path" - style = "plain" - foreground = "white" - - [blocks.segments.properties] - style = "powerlevel" - - [[blocks.segments]] - type = "text" - foreground = "white" - style = "plain" - template = ">" - -[transient_prompt] - foreground_templates = [ - "{{if gt .Code 0}}red{{end}}", - "{{if eq .Code 0}}white{{end}}", - ] - background = 'transparent' - template = '> ' - [secondary_prompt] + template = ' >> ' foreground = 'white' background = 'transparent' - template = ' >> ' + +[transient_prompt] + template = '> ' + background = 'transparent' + foreground_templates = ['{{if gt .Code 0}}red{{end}}', '{{if eq .Code 0}}white{{end}}'] + +[[blocks]] + type = 'prompt' + alignment = 'left' + newline = true + + [[blocks.segments]] + style = 'plain' + template = '(Root) ' + type = 'root' + + [[blocks.segments]] + style = 'plain' + template = '{{ if .SSHSession }}(SSH) {{ end }}' + type = 'session' + + [[blocks.segments]] + style = 'plain' + foreground = 'white' + type = 'path' + + [blocks.segments.properties] + style = 'powerlevel' + + [[blocks.segments]] + style = 'plain' + template = '>' + foreground = 'white' + type = 'text' diff --git a/sway/config b/sway/config index f1aea38..5840002 100755 --- a/sway/config +++ b/sway/config @@ -23,8 +23,9 @@ set $filemanager nemo # Note: pass the final command to swaymsg so that the resulting window can be opened # on the original workspace that the command was run on. #set $menu dmenu_path | wmenu | xargs swaymsg exec -- -set $menu j4-dmenu-desktop --no-generic -set $background /home/pauljako/Pictures/Wallpaper/Canada.jpg +set $dmenu dmenu +set $menu j4-dmenu-desktop --no-generic --dmenu=$dmenu +set $background ~/.wallpaper ### Output configuration # # Default wallpaper (more resolutions are available in /run/current-system/sw/share/backgrounds/sway/) @@ -40,15 +41,15 @@ output * bg $background fill # # Example configuration: # -# exec swayidle -w \ -# timeout 300 'swaylock -f -c 000000' \ -# timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \ +#exec swayidle -w \ +# timeout 10 'swaylock -f -c 000000' \ +# timeout 20 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \ # before-sleep 'swaylock -f -c 000000' # # This will lock your screen after 300 seconds of inactivity, then turn off # your displays after another 300 seconds, and turn your screens back on when # resumed. It will also lock your screen before your computer goes to sleep. -exec_always /home/pauljako/.config/dotfiles/sway/lock.sh +exec_always ~/.config/dotfiles/sway/lock.sh exec_always libinput-gestures ### Input configuration # @@ -76,6 +77,8 @@ input "type:touchpad" { input "type:pointer" { natural_scroll enabled } +# Set the font +font pango:JetBrainsMonoNerdFont 9 ### Key bindings # # Basics: @@ -91,6 +94,7 @@ input "type:pointer" { # Start your launcher bindsym $mod+Space exec $menu + bindsym $mod+Shift+B exec --no-startup-id DMENU_BLUETOOTH_LAUNCHER=$dmenu ~/.config/dotfiles/sway/dmenu-bluetooth.sh # Drag floating windows by holding down $mod and left mouse button. # Resize them with right mouse button + $mod. @@ -237,7 +241,7 @@ bar { # When the status_command prints a new line to stdout, swaybar updates. # The default just shows the current date and time. - status_command bash /home/pauljako/.config/dotfiles/sway/statusbar.sh + status_command bash ~/.config/dotfiles/sway/statusbar.sh colors { statusline #ffffff diff --git a/sway/dmenu-bluetooth.sh b/sway/dmenu-bluetooth.sh new file mode 100755 index 0000000..fddaafe --- /dev/null +++ b/sway/dmenu-bluetooth.sh @@ -0,0 +1,412 @@ +#!/usr/bin/env bash +# _ _ _ _ _ _ +# __| |_ __ ___ ___ _ __ _ _ | |__ | |_ _ ___| |_ ___ ___ | |_ | |__ +# / _` | '_ ` _ \ / _ \ '_ \| | | |_____| '_ \| | | | |/ _ \ __/ _ \ / _ \| __|| '_ \ +# | (_| | | | | | | __/ | | | |_| |_____| |_) | | |_| | __/ || (_) | (_) | |_ | | | | +# \__,_|_| |_| |_|\___|_| |_|\__,_| |_.__/|_|\__,_|\___|\__\___/ \___/ \__||_| |_| +# +# Author: Nick Clyde (clydedroid) +# dmenu support by: Layerex +# Original script: https://github.com/nickclyde/rofi-bluetooth +# +# A script that generates a dmenu menu that uses bluetoothctl to +# connect to bluetooth devices and display status info. +# +# Inspired by networkmanager-dmenu (https://github.com/firecat53/networkmanager-dmenu) +# Thanks to x70b1 (https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/system-bluetooth-bluetoothctl) +# +# Depends on: +# Arch repositories: dmenu, bluez-utils (contains bluetoothctl) + +# Constants +divider="---------" +goback="Back" +exit="Exit" +connected_icon="" + +# Checks if bluetooth controller is powered on +power_on() { + if bluetoothctl show | grep -F -q "Powered: yes"; then + return 0 + else + return 1 + fi +} + +# Toggles power state +toggle_power() { + if power_on; then + bluetoothctl power off + show_menu + else + if rfkill list bluetooth | grep -F -q 'blocked: yes'; then + rfkill unblock bluetooth && sleep 3 + fi + bluetoothctl power on + show_menu + fi +} + +# Checks if controller is scanning for new devices +scan_on() { + if bluetoothctl show | grep -F -q "Discovering: yes"; then + echo "Scan: on" + return 0 + else + echo "Scan: off" + return 1 + fi +} + +# Toggles scanning state +toggle_scan() { + if scan_on; then + kill "$(pgrep -f "bluetoothctl scan on")" + bluetoothctl scan off + show_menu + else + bluetoothctl scan on & + echo "Scanning..." + sleep 5 + show_menu + fi +} + +# Checks if controller is able to pair to devices +pairable_on() { + if bluetoothctl show | grep -F -q "Pairable: yes"; then + echo "Pairable: on" + return 0 + else + echo "Pairable: off" + return 1 + fi +} + +# Toggles pairable state +toggle_pairable() { + if pairable_on; then + bluetoothctl pairable off + show_menu + else + bluetoothctl pairable on + show_menu + fi +} + +# Checks if controller is discoverable by other devices +discoverable_on() { + if bluetoothctl show | grep -F -q "Discoverable: yes"; then + echo "Discoverable: on" + return 0 + else + echo "Discoverable: off" + return 1 + fi +} + +# Toggles discoverable state +toggle_discoverable() { + if discoverable_on; then + bluetoothctl discoverable off + show_menu + else + bluetoothctl discoverable on + show_menu + fi +} + +# Checks if a device is connected +device_connected() { + if bluetoothctl info "$1" | grep -F -q "Connected: yes"; then + return 0 + else + return 1 + fi +} + +# Toggles device connection +toggle_connection() { + if device_connected "$1"; then + bluetoothctl disconnect "$1" + # device_menu "$device" + else + bluetoothctl connect "$1" + # device_menu "$device" + fi +} + +# Checks if a device is paired +device_paired() { + if bluetoothctl info "$1" | grep -F -q "Paired: yes"; then + echo "Paired: yes" + return 0 + else + echo "Paired: no" + return 1 + fi +} + +# Toggles device paired state +toggle_paired() { + if device_paired "$1"; then + bluetoothctl remove "$1" + device_menu "$device" + else + bluetoothctl pair "$1" + device_menu "$device" + fi +} + +# Checks if a device is trusted +device_trusted() { + if bluetoothctl info "$1" | grep -F -q "Trusted: yes"; then + echo "Trusted: yes" + return 0 + else + echo "Trusted: no" + return 1 + fi +} + +# Toggles device connection +toggle_trust() { + if device_trusted "$1"; then + bluetoothctl untrust "$1" + device_menu "$device" + else + bluetoothctl trust "$1" + device_menu "$device" + fi +} + +# Prints a short string with the current bluetooth status +# Useful for status bars like polybar, etc. +print_status() { + if power_on; then + printf '' + + mapfile -t paired_devices < <(bluetoothctl paired-devices | grep -F Device | cut -d ' ' -f 2) + counter=0 + + for device in "${paired_devices[@]}"; do + if device_connected "$device"; then + device_alias="$(bluetoothctl info "$device" | grep -F "Alias" | cut -d ' ' -f 2-)" + + if [ $counter -gt 0 ]; then + printf ", %s" "$device_alias" + else + printf " %s" "$device_alias" + fi + + ((counter++)) + fi + done + printf "\n" + else + echo "" + fi +} + +# A submenu for a specific device that allows connecting, pairing, and trusting +device_menu() { + device="$1" + + # Get device name and mac address + device_name="$(echo "$device" | cut -d ' ' -f 3-)" + mac="$(echo "$device" | cut -d ' ' -f 2)" + + # Build options + if device_connected "$mac"; then + connected="Connected: yes" + else + connected="Connected: no" + fi + paired="$(device_paired "$mac")" + trusted="$(device_trusted "$mac")" + options="$connected\n$paired\n$trusted\n$divider\n$goback\n$exit" + + # Open dmenu menu, read chosen option + chosen="$(echo -e "$options" | run_dmenu "$device_name")" + + # Match chosen option to command + case $chosen in + "" | "$divider") + echo "No option chosen." + ;; + "$connected") + toggle_connection "$mac" + ;; + "$paired") + toggle_paired "$mac" + ;; + "$trusted") + toggle_trust "$mac" + ;; + "$goback") + show_menu + ;; + esac +} + +# Opens a dmenu menu with current bluetooth status and options to connect +show_menu() { + # Get menu options + if power_on; then + power="Power: on" + + # Human-readable names of devices, one per line + # If scan is off, will only list paired devices + if [[ -n "$connected_icon" ]]; then + devices="$(bluetoothctl devices | grep -F Device | while read -r device; do + device_name="$(echo "$device" | cut -d ' ' -f 3-)" + mac="$(echo "$device" | cut -d ' ' -f 2)" + icon="" + + if device_connected "$mac" && [[ -n $connected_icon ]]; then + icon=" $connected_icon" + fi + + echo "$device_name${icon}" + done)" + else + devices="$(bluetoothctl devices | grep -F Device | cut -d ' ' -f 3-)" + fi + + # Get controller flags + scan="$(scan_on)" + pairable="$(pairable_on)" + discoverable="$(discoverable_on)" + + # Options passed to dmenu + [[ -n $devices ]] && devices_part="$devices\n$divider\n" + options="$devices_part$power\n$scan\n$pairable\n$discoverable\n$exit" + else + power="Power: off" + options="$power\n$exit" + fi + + # Open dmenu menu, read chosen option + chosen="$(echo -e "$options" | run_dmenu "Bluetooth")" + + # Match chosen option to command + case $chosen in + "" | "$divider") + echo "No option chosen." + ;; + "$power") + toggle_power + ;; + "$scan") + toggle_scan + ;; + "$discoverable") + toggle_discoverable + ;; + "$pairable") + toggle_pairable + ;; + *) + if [[ -n "$connected_icon" ]]; then + chosen="${chosen%% ${connected_icon}}" + fi + device="$(bluetoothctl devices | grep -F "$chosen")" + # Open a submenu if a device is selected + if [[ -n "$device" ]]; then device_menu "$device"; fi + ;; + esac +} + +# dmenu command to pipe into. Extra arguments to dmenu-bluetooth are passed through to dmenu. This +# allows the user to set fonts, sizes, colours, etc. +DMENU_BLUETOOTH_LAUNCHER="${DMENU_BLUETOOTH_LAUNCHER:-dmenu}" +run_dmenu() { + case "$DMENU_BLUETOOTH_LAUNCHER" in + rofi) + DMENU_BLUETOOTH_LAUNCHER="rofi -dmenu" + ;; + fuzzel) + DMENU_BLUETOOTH_LAUNCHER="fuzzel --dmenu" + ;; + esac + $DMENU_BLUETOOTH_LAUNCHER -i -p "$DMENU_BLUETOOTH_PROMPT" "${dmenu_args[@]}" +} + +print_help() { + echo "usage: $0 [--help] [--status] [--connected-icon [ICON]] [PROMPT] DMENU_ARGS..." + echo "" + echo "A script that generates a dmenu menu that uses bluetoothctl to connect to bluetooth devices and display status info." + echo "" + echo "positional arguments:" + echo " PROMPT dmenu prompt" + echo " DMENU_ARGS... arguments passed to dmenu" + echo "" + echo "options:" + echo "--help show this help message and exit" + echo "--status print a short string about current bluetooth status and exit" + echo "--connected-icon [ICON] add icon on device list next to connected devices" + echo "" + echo "environment variables:" + echo " DMENU_BLUETOOTH_PROMPT dmenu prompt" + echo " DMENU_BLUETOOTH_LAUNCHER command to use instead of 'dmenu'" + echo "" + echo "Positional arguments have to be placed after all other arguments." + echo "A PROMPT positional argument will be interpreted as part of DMENU_ARGS if it starts with '-'. It won't be parsed if the DMENU_BLUETOOTH_PROMPT environment variable is set." + echo "Use the DMENU_BLUETOOTH_LAUNCHER environment variable to use launchers other than dmenu. Rofi, fuzzel, and any dmenu-compatible launchers are supported." +} + +command_present() { + command -v "$1" >/dev/null 2>&1 +} + +error() { + echo "$1. $2." >&2 + command_present notify-send && notify-send "$1" "$2." +} + +# Check if bluetooth daemon is running. Start it if possible. +if command_present systemctl; then + systemctl is-active --quiet bluetooth + case $? in + 3) + error "Bluetooth daemon is not running" "Start it to use this script" + systemctl start bluetooth || exit 3 + ;; + 4) + error "Bluetooth daemon is not present" "On Arch Linux install bluez and bluez-utils packages" + exit 4 + ;; + esac +fi + +dmenu_args=("$@") +case "$1" in + --help) + print_help + exit + ;; + --status) + print_status + exit + ;; + --connected-icon) + if [[ "$2" == "--" ]]; then + connected_icon="" + else + connected_icon="$2" + fi + dmenu_args=("${dmenu_args[@]:2}") + ;; +esac +case "${dmenu_args[0]}" in + -*) + ;; + *) + if [[ -z "$DMENU_BLUETOOTH_PROMPT" ]]; then + DMENU_BLUETOOTH_PROMPT="${dmenu_args[0]}" + dmenu_args=("${dmenu_args[@]:1}") + fi + ;; +esac + +show_menu