From 29eed372ff0c01d39009cca7645ea62dbd2ab785 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 4 May 2022 18:55:48 +0200 Subject: [PATCH] chore: cleanup --- configs/nvim/lua/configs/lsp.lua | 4 + configs/rofi/rofi-audio-menu | 39 --- configs/rofi/rofi-power-menu | 246 --------------- configs/sway/config | 83 +++--- configs/sway/config_editor.sh | 2 - .../create-floating} | 0 .../{debug_window.sh => scripts/debug-window} | 0 .../sway/{grimshot.sh => scripts/grimshot} | 0 .../{lock_screen.sh => scripts/lock-screen} | 0 .../select-window} | 1 - .../{toggle_bar.sh => scripts/toggle-bar} | 0 .../{toggle_gaps.sh => scripts/toggle-gaps} | 0 .../toggle-layout} | 0 configs/waybar/capture_mp3.sh | 20 -- configs/waybar/config | 281 ++++++------------ configs/waybar/cpu_speed.sh | 14 - configs/waybar/dev.sh | 13 - configs/waybar/mediaplayer.py | 130 -------- configs/waybar/mediaplayer_old.py | 146 --------- configs/waybar/output.mp3 | Bin 65200 -> 0 bytes configs/waybar/powermode.sh | 3 - configs/waybar/recognize-song.sh | 2 - .../{dark-mode.sh => scripts/set-theme} | 0 configs/waybar/scripts/toggle-hdpi | 22 ++ .../waybar/{theme.sh => scripts/toggle-theme} | 11 +- configs/wofi/config | 1 + configs/wofi/{ => scripts}/open-localhost | 0 .../power-menu} | 4 +- .../wofi/{wofi-emoji => scripts/select-emoji} | 0 .../{select-vpn.sh => scripts/select-vpn} | 0 .../{select-wifi.sh => scripts/select-wifi} | 0 .../{web-search.sh => scripts/web-search} | 0 configs/wofi/sway-select-window.sh | 25 -- configs/wofi/swytcher.sh | 122 -------- configs/wofi/wofi-emoji-new | 3 - configs/wofi/wofi-emoji-old-2 | 138 --------- 36 files changed, 172 insertions(+), 1138 deletions(-) delete mode 100755 configs/rofi/rofi-audio-menu delete mode 100755 configs/rofi/rofi-power-menu delete mode 100755 configs/sway/config_editor.sh rename configs/sway/{create_floating.sh => scripts/create-floating} (100%) rename configs/sway/{debug_window.sh => scripts/debug-window} (100%) rename configs/sway/{grimshot.sh => scripts/grimshot} (100%) rename configs/sway/{lock_screen.sh => scripts/lock-screen} (100%) rename configs/sway/{select_window.sh => scripts/select-window} (99%) rename configs/sway/{toggle_bar.sh => scripts/toggle-bar} (100%) rename configs/sway/{toggle_gaps.sh => scripts/toggle-gaps} (100%) rename configs/sway/{toggle_layout.sh => scripts/toggle-layout} (100%) delete mode 100755 configs/waybar/capture_mp3.sh delete mode 100755 configs/waybar/cpu_speed.sh delete mode 100755 configs/waybar/dev.sh delete mode 100755 configs/waybar/mediaplayer.py delete mode 100755 configs/waybar/mediaplayer_old.py delete mode 100644 configs/waybar/output.mp3 delete mode 100644 configs/waybar/powermode.sh delete mode 100644 configs/waybar/recognize-song.sh rename configs/waybar/{dark-mode.sh => scripts/set-theme} (100%) create mode 100755 configs/waybar/scripts/toggle-hdpi rename configs/waybar/{theme.sh => scripts/toggle-theme} (64%) rename configs/wofi/{ => scripts}/open-localhost (100%) rename configs/wofi/{wofi-power-menu.sh => scripts/power-menu} (65%) rename configs/wofi/{wofi-emoji => scripts/select-emoji} (100%) rename configs/wofi/{select-vpn.sh => scripts/select-vpn} (100%) rename configs/wofi/{select-wifi.sh => scripts/select-wifi} (100%) rename configs/wofi/{web-search.sh => scripts/web-search} (100%) delete mode 100755 configs/wofi/sway-select-window.sh delete mode 100755 configs/wofi/swytcher.sh delete mode 100755 configs/wofi/wofi-emoji-new delete mode 100755 configs/wofi/wofi-emoji-old-2 diff --git a/configs/nvim/lua/configs/lsp.lua b/configs/nvim/lua/configs/lsp.lua index 042d660..a9e713f 100644 --- a/configs/nvim/lua/configs/lsp.lua +++ b/configs/nvim/lua/configs/lsp.lua @@ -62,6 +62,10 @@ lsp.jsonls.setup { } } +lsp.svelte.setup {} + +lsp.tsserver.setup {} + lsp.ltex.setup { cmd = { os.getenv("HOME") .. '/.local/share/nvim/lsp_servers/ltex/ltex-ls/bin/ltex-ls' }, settings = { diff --git a/configs/rofi/rofi-audio-menu b/configs/rofi/rofi-audio-menu deleted file mode 100755 index 9d1b9fe..0000000 --- a/configs/rofi/rofi-audio-menu +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -set -e - -# FEATURES -# - Doesn't show the sink that is already the default -# - Automatically switches all running input sinks when switching the default sink - -# Get the current default sink -SINK_DEFAULT=$(pactl info | ag "Default Sink" | ag -o "(?!.*:)[^\s].*") -# Get the audio sink names -SINK_NAMES=$(pactl list sinks | ag Name | cut --complement -c 1-7) - -# Get the index of the default sink -DEFAULT_INDEX=$(printf "%s" "$SINK_NAMES" | ag --number "$SINK_DEFAULT" | sed 's/:.*//' ) - -# Get the audio sink descriptions -SINK_DESCRIPTIONS=$(pactl list sinks | ag Description | cut --complement -c 1-13 | sed 's/^ \+//' | sed 's/ \+$//') -# Get all the programs that revieve the audio from the sinks -SINK_INPUTS=$(pactl list sink-inputs | ag "Sink Input #") - -# Get the descriptions from the sinks without the default sink to display to the user and have the user pick a sink -SINK_DESCRIPTION=$(printf "%s" "$SINK_DESCRIPTIONS" | sed "${DEFAULT_INDEX}d" | dmenu -i -fn "Roboto Mono for Powerline-11" -p "Select sink:") -SINK_DESCRIPTION=$(printf "%s" "$SINK_DESCRIPTION" | sed 's/(/\\(/' | sed 's/)/\\)/') - -# Get the index for the answer that the user wrote -DESCRIPTION_INDEX=$(printf "%s\n" "$SINK_DESCRIPTIONS" | ag --number "$SINK_DESCRIPTION" | sed 's/:.*//') -DESCRIPTION_INDEX=$((DESCRIPTION_INDEX - 1)) # Correct the index hihi - -# Set the default sink -pactl set-default-sink $DESCRIPTION_INDEX - -# Change all the ouputs for the programs that are using the default sink -printf "%s\n" "$SINK_INPUTS" | while read -r SINK_INPUT -do - # Get the index for the program - SINK_INPUT_INDEX=$(printf "%s" "$SINK_INPUT" | ag -o "(?!Sink Input#)[0-9]+") - pactl move-sink-input "$SINK_INPUT_INDEX" "$DESCRIPTION_INDEX" -done diff --git a/configs/rofi/rofi-power-menu b/configs/rofi/rofi-power-menu deleted file mode 100755 index 0d08c82..0000000 --- a/configs/rofi/rofi-power-menu +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env bash - -# This script defines just a mode for rofi instead of being a self-contained -# executable that launches rofi by itself. This makes it more flexible than -# running rofi inside this script as now the user can call rofi as one pleases. -# For instance: -# -# rofi -show powermenu -modi powermenu:./rofi-power-menu -# -# See README.md for more information. - -set -e -set -u - -# All supported choices -all=(shutdown reboot suspend hibernate logout lockscreen) - -# By default, show all (i.e., just copy the array) -show=("${all[@]}") - -declare -A texts -texts[lockscreen]="lock screen" -texts[switchuser]="switch user" -texts[logout]="log out" -texts[suspend]="suspend" -texts[hibernate]="hibernate" -texts[reboot]="reboot" -texts[shutdown]="shut down" - -declare -A icons -icons[lockscreen]="\uf023" -icons[switchuser]="\uf518" -icons[logout]="\uf842" -icons[suspend]="\uf9b1" -icons[hibernate]="\uf7c9" -icons[reboot]="\ufc07" -icons[shutdown]="\uf011" -icons[cancel]="\u00d7" - -declare -A actions -actions[lockscreen]="loginctl lock-session ${XDG_SESSION_ID-}" -#actions[switchuser]="???" -actions[logout]="loginctl terminate-session ${XDG_SESSION_ID-}" -actions[suspend]="systemctl suspend" -actions[hibernate]="systemctl hibernate" -actions[reboot]="systemctl reboot" -actions[shutdown]="systemctl poweroff" - -# By default, ask for confirmation for actions that are irreversible -confirmations=(reboot shutdown logout) - -# By default, no dry run -dryrun=false -showsymbols=true - -function check_valid { - option="$1" - shift 1 - for entry in "${@}" - do - if [ -z "${actions[$entry]+x}" ] - then - echo "Invalid choice in $1: $entry" >&2 - exit 1 - fi - done -} - -# Parse command-line options -parsed=$(getopt --options=h --longoptions=help,dry-run,confirm:,choices:,choose:,symbols,no-symbols --name "$0" -- "$@") -if [ $? -ne 0 ]; then - echo 'Terminating...' >&2 - exit 1 -fi -eval set -- "$parsed" -unset parsed -while true; do - case "$1" in - "-h"|"--help") - echo "rofi-power-menu - a power menu mode for Rofi" - echo - echo "Usage: rofi-power-menu [--choices CHOICES] [--confirm CHOICES]" - echo " [--choose CHOICE] [--dry-run] [--symbols|--no-symbols]" - echo - echo "Use with Rofi in script mode. For instance, to ask for shutdown or reboot:" - echo - echo " rofi -show menu -modi \"menu:rofi-power-menu --choices=shutdown/reboot\"" - echo - echo "Available options:" - echo " --dry-run Don't perform the selected action but print it to stderr." - echo " --choices CHOICES Show only the selected choices in the given order. Use / " - echo " as the separator. Available choices are lockscreen, logout," - echo " suspend, hibernate, reboot and shutdown. By default, all" - echo " available choices are shown." - echo " --confirm CHOICES Require confirmation for the gives choices only. Use / as" - echo " the separator. Available choices are lockscreen, logout," - echo " suspend, hibernate, reboot and shutdown. By default, only" - echo " irreversible actions logout, reboot and shutdown require" - echo " confirmation." - echo " --choose CHOICE Preselect the given choice and only ask for a confirmation" - echo " (if confirmation is set to be requested). It is strongly" - echo " recommended to combine this option with --confirm=CHOICE" - echo " if the choice wouldn't require confirmation by default." - echo " Available choices are lockscreen, logout, suspend," - echo " hibernate, reboot and shutdown." - echo " --[no-]symbols Show Unicode symbols or not. Requires a font with support" - echo " for the symbols. Use, for instance, fonts from the" - echo " Nerdfonts collection. By default, they are shown" - echo " -h,--help Show this help text." - exit 0 - ;; - "--dry-run") - dryrun=true - shift 1 - ;; - "--confirm") - IFS='/' read -ra confirmations <<< "$2" - check_valid "$1" "${confirmations[@]}" - shift 2 - ;; - "--choices") - IFS='/' read -ra show <<< "$2" - check_valid "$1" "${show[@]}" - shift 2 - ;; - "--choose") - # Check that the choice is valid - check_valid "$1" "$2" - selectionID="$2" - shift 2 - ;; - "--symbols") - showsymbols=true - shift 1 - ;; - "--no-symbols") - showsymbols=false - shift 1 - ;; - "--") - shift - break - ;; - *) - echo "Internal error" >&2 - exit 1 - ;; - esac -done - -# Define the messages after parsing the CLI options so that it is possible to -# configure them in the future. - -function write_message { - icon="$1" - text="$2" - if [ "$showsymbols" = "true" ] - then - echo -n "\u200e$icon \u2068$text\u2069" - else - echo -n "$text" - fi -} - -function print_selection { - echo -e "$1" | $(read -r -d '' entry; echo "echo $entry") -} - -declare -A messages -declare -A confirmationMessages -for entry in "${all[@]}" -do - messages[$entry]=$(write_message "${icons[$entry]}" "${texts[$entry]^}") -done -for entry in "${all[@]}" -do - confirmationMessages[$entry]=$(write_message "${icons[$entry]}" "Yes, ${texts[$entry]}") -done -confirmationMessages[cancel]=$(write_message "${icons[cancel]}" "No, cancel") - -if [ $# -gt 0 ] -then - # If arguments given, use those as the selection - selection="${@}" -else - # Otherwise, use the CLI passed choice if given - if [ -n "${selectionID+x}" ] - then - selection="${messages[$selectionID]}" - fi -fi - -# Don't allow custom entries -echo -e "\0no-custom\x1ftrue" -# Use markup -echo -e "\0markup-rows\x1ftrue" - -if [ -z "${selection+x}" ] -then - echo -e "\0prompt\x1fPower menu" - for entry in "${show[@]}" - do - echo -e "${messages[$entry]}\0icon\x1f${icons[$entry]}" - done -else - for entry in "${show[@]}" - do - if [ "$selection" = "$(print_selection "${messages[$entry]}")" ] - then - # Check if the selected entry is listed in confirmation requirements - for confirmation in "${confirmations[@]}" - do - if [ "$entry" = "$confirmation" ] - then - # Ask for confirmation - echo -e "\0prompt\x1fAre you sure" - echo -e "${confirmationMessages[$entry]}\0icon\x1f${icons[$entry]}" - echo -e "${confirmationMessages[cancel]}\0icon\x1f${icons[cancel]}" - exit 0 - fi - done - # If not, then no confirmation is required, so mark confirmed - selection=$(print_selection "${confirmationMessages[$entry]}") - fi - if [ "$selection" = "$(print_selection "${confirmationMessages[$entry]}")" ] - then - if [ $dryrun = true ] - then - # Tell what would have been done - echo "Selected: $entry" >&2 - else - # Perform the action - ${actions[$entry]} - fi - exit 0 - fi - if [ "$selection" = "$(print_selection "${confirmationMessages[cancel]}")" ] - then - # Do nothing - exit 0 - fi - done - # The selection didn't match anything, so raise an error - echo "Invalid selection: $selection" >&2 - exit 1 -fi diff --git a/configs/sway/config b/configs/sway/config index 74a50d4..8099b27 100644 --- a/configs/sway/config +++ b/configs/sway/config @@ -20,12 +20,11 @@ set $up k set $right l # Some menus -set $wofi_scripts ~/.config/wofi set $quickmenu wofi --show drun # Screenshot section set $screenshot_dir ~/Pictures/Screenshots/ -set $grimshot ~/.config/sway/grimshot.sh +set $grimshot $sway_scripts/grimshot set $screenclip wl-copy < "$($grimshot --notify save area $screenshot_dir/scrn-$(date +"%Y-%m-%d-%H-%M-%S").png)" set $screenshot wl-copy < "$($grimshot --notify save screen $screenshot_dir/scrn-$(date +"%Y-%m-%d-%H-%M-%S").png)" set $windowshot wl-copy < "$($grimshot --notify save window $screenshot_dir/scrn-$(date +"%Y-%m-%d-%H-%M-%S").png)" @@ -41,20 +40,23 @@ set $bluetooth_mngr blueman-manager set $calculator flatpak run io.github.Qalculate set $photo_editor gtk-launch ~/.local/share/applications/photopea.desktop set $translator com.github.gi_lom.dialect +set $settings gnome-control-center # Scripts -set $config_editor ~/.config/sway/config_editor.sh -set $debug_window ~/.config/sway/debug_window.sh -set $settings gnome-control-center -set $toggle_layout ~/.config/sway/toggle_layout.sh -set $create_floating ~/.config/sway/create_floating.sh -set $toggle_gaps ~/.config/sway/toggle_gaps.sh -set $toggle_bar ~/.config/sway/toggle_bar.sh -set $web_search $wofi_scripts/web-search.sh -set $select_window ~/.config/sway/select_window.sh -set $lock_screen ~/.config/sway/lock_screen.sh -set $select_emoji $wofi_scripts/wofi-emoji + +set $wofi_scripts ~/.config/wofi/scripts/ +set $sway_scripts ~/.config/sway/scripts/ + +set $debug_window $sway_scripts/debug-window +set $toggle_layout $sway_scripts/toggle-layout +set $create_floating $sway_scripts/create-floating +set $toggle_gaps $sway_scripts/toggle-gaps +set $toggle_bar $sway_scripts/toggle-bar +set $select_window $sway_scripts/select-window +set $lock_screen $sway_scripts/lock-screen +set $select_emoji $wofi_scripts/select-emoji set $open_localhost $wofi_scripts/open-localhost +set $select_wifi $wofi_scripts/select-wifi # Input configuration input * { @@ -76,7 +78,7 @@ output * bg `find $wallpapers_path -type f | shuf -n 1` fill # # Example configuration: # -# output HDMI-A-1 resolution 1920x1080 position 1920,0 +# output eDP-1 resolution 1920x1080 # # You can get the names of your outputs by running: swaymsg -t get_outputs @@ -89,8 +91,7 @@ exec swayidle -w \ timeout 600 'swaymsg "output * dpms off"' \ timeout 660 'systemctl suspend' \ resume 'swaymsg "output * dpms on"' \ - before-sleep '~/.config/sway/lock_screen.sh' - + before-sleep $lock_screen # # This will lock your screen after 300 seconds of inactivity, then turn off @@ -118,12 +119,13 @@ input "1739:24385:Synaptics_TM2438-005" { bindsym $mod+d exec $quickmenu bindsym $mod+t exec $translator bindsym $mod+q kill - bindsym $mod+Shift+q exec $wofi_scripts/wofi-power-menu.sh + bindsym $mod+Shift+q exec $wofi_scripts/power-menu bindsym $mod+Return exec $term bindsym $mod+Shift+Return exec $create_floating $term bindsym $mod+e exec $explorer bindsym $mod+Comma exec $settings bindsym $mod+b exec $browser + bindsym $mod+Shift+w exec $select_wifi bindsym $mod+Shift+b exec $bluetooth_mngr bindsym $mod+Shift+Comma exec $config_editor bindsym $mod+a exec $web_search @@ -136,20 +138,20 @@ input "1739:24385:Synaptics_TM2438-005" { # Reload the configuration file bindsym $mod+Shift+c reload - # Multimedia Audio Keys + # Multimedia Audio Keys bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle bindsym --locked XF86AudioNext exec playerctl next bindsym --locked XF86AudioPrev exec playerctl previous bindsym --locked XF86AudioPlay exec playerctl play-pause - bindsym --locked XF86AudioLowerVolume exec "pactl -- set-sink-volume @DEFAULT_SINK@ -10%" - bindsym --locked XF86AudioRaiseVolume exec "pactl -- set-sink-volume @DEFAULT_SINK@ +10%" + bindsym --locked XF86AudioLowerVolume exec "pactl -- set-sink-volume @DEFAULT_SINK@ -10%" + bindsym --locked XF86AudioRaiseVolume exec "pactl -- set-sink-volume @DEFAULT_SINK@ +10%" - #Increase brightness - bindsym XF86MonBrightnessUp exec brightnessctl -d intel_backlight set +20 - bindsym XF86MonBrightnessDown exec brightnessctl -d intel_backlight set 20- + #Increase brightness + bindsym XF86MonBrightnessUp exec brightnessctl -d intel_backlight set +20 + bindsym XF86MonBrightnessDown exec brightnessctl -d intel_backlight set 20- - # Exit sway (logs you out of your Wayland session) - bindsym $mod+Shift+e exec swaynag -t warning -m 'Do you really want to exit your Wayland session?' -B 'Yes, exit sway' 'swaymsg exit' + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'Do you really want to exit your Wayland session?' -B 'Yes, exit sway' 'swaymsg exit' # # Moving around: # @@ -187,7 +189,6 @@ input "1739:24385:Synaptics_TM2438-005" { for_window [title="Zoom Meeting.*"] inhibit_idle visible for_window [app_id="firefox" title="^Picture-in-Picture$"] floating enable, move position 1300 600, sticky enable, resize set 600 450 - set $ws1 "1:  Code" assign [app_id="Alacritty"] $ws1 assign [app_id="Kitty"] $ws1 @@ -198,11 +199,11 @@ input "1739:24385:Synaptics_TM2438-005" { assign [app_id="google-chrome-beta"] $ws2 assign [class="Google-chrome"] $ws2 assign [app_id="google-chrome"] $ws2 - set $ws3 "3:  Music" - assign [class="Spotify"] $ws3 - assign [class="spotify"] $ws3 - assign [app_id="dev.alextren.Spot"] $ws3 - set $ws4 "4:  Chat" + set $ws3 "3:  Music" + assign [class="Spotify"] $ws3 + assign [class="spotify"] $ws3 + assign [app_id="dev.alextren.Spot"] $ws3 + set $ws4 "4:  Chat" # Switch to workspace bindsym $mod+1 workspace $ws1 @@ -258,8 +259,8 @@ input "1739:24385:Synaptics_TM2438-005" { # bindsym $mod+a focus parent # Screenshots - # -- Entire Screen - bindsym $mod+s exec $screenshot + # -- Entire Screen + bindsym $mod+s exec $screenshot # -- Area Screenshot bindsym $mod+Shift+s exec $screenclip # -- Select Window @@ -268,9 +269,9 @@ input "1739:24385:Synaptics_TM2438-005" { bindsym $mod+i exec $select_emoji bindsym $mod+Shift+i exec $debug_window bindsym $mod+o exec $open_localhost - bindsym $mod+Control+l exec $lock_screen - bindsym $mod+c exec $calculator - bindsym Alt+Tab exec $select_window + bindsym $mod+Control+l exec $lock_screen + bindsym $mod+c exec $calculator + bindsym $mod+Tab exec $select_window bindsym $mod+m exec $mail # # Scratchpad: @@ -315,8 +316,6 @@ mode "resize" { } bindsym $mod+r mode "resize" -# Do we need that? - # Handles notifications exec_always mako # Start Audio @@ -331,13 +330,11 @@ exec wl-paste -t text --watch clipman store --no-persist # # Status Bar: # -# Read `man 5 sway-bar` for more information about this section. bar { - swaybar_command waybar - mode dock - position top + swaybar_command waybar + mode dock + position top } -include @sysconfdir@/sway/config.d/* exec "systemctl --user import-environment SWAYSOCK XDG_CURRENT_DESKTOP WAYLAND_DISPLAY"; diff --git a/configs/sway/config_editor.sh b/configs/sway/config_editor.sh deleted file mode 100755 index f1429fc..0000000 --- a/configs/sway/config_editor.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/zsh -alacritty -e zsh -c "/home/jim/.asdf/shims/nvim ~/.dotfiles" diff --git a/configs/sway/create_floating.sh b/configs/sway/scripts/create-floating similarity index 100% rename from configs/sway/create_floating.sh rename to configs/sway/scripts/create-floating diff --git a/configs/sway/debug_window.sh b/configs/sway/scripts/debug-window similarity index 100% rename from configs/sway/debug_window.sh rename to configs/sway/scripts/debug-window diff --git a/configs/sway/grimshot.sh b/configs/sway/scripts/grimshot similarity index 100% rename from configs/sway/grimshot.sh rename to configs/sway/scripts/grimshot diff --git a/configs/sway/lock_screen.sh b/configs/sway/scripts/lock-screen similarity index 100% rename from configs/sway/lock_screen.sh rename to configs/sway/scripts/lock-screen diff --git a/configs/sway/select_window.sh b/configs/sway/scripts/select-window similarity index 99% rename from configs/sway/select_window.sh rename to configs/sway/scripts/select-window index 7b77d50..1d8cb24 100755 --- a/configs/sway/select_window.sh +++ b/configs/sway/scripts/select-window @@ -1,4 +1,3 @@ - #!/bin/sh # ------Get available windows: diff --git a/configs/sway/toggle_bar.sh b/configs/sway/scripts/toggle-bar similarity index 100% rename from configs/sway/toggle_bar.sh rename to configs/sway/scripts/toggle-bar diff --git a/configs/sway/toggle_gaps.sh b/configs/sway/scripts/toggle-gaps similarity index 100% rename from configs/sway/toggle_gaps.sh rename to configs/sway/scripts/toggle-gaps diff --git a/configs/sway/toggle_layout.sh b/configs/sway/scripts/toggle-layout similarity index 100% rename from configs/sway/toggle_layout.sh rename to configs/sway/scripts/toggle-layout diff --git a/configs/waybar/capture_mp3.sh b/configs/waybar/capture_mp3.sh deleted file mode 100755 index dd486a8..0000000 --- a/configs/waybar/capture_mp3.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -cd "$(dirname "$0")" - -arecord -f cd -t raw -d 4 -q | lame -r -q - output.mp3 2>/dev/null - -if [ ! -f "./output.mp3" ]; then - exit 0 -fi - -JSON=$(songrec audio-file-to-recognized-song output.mp3) - -RETRYMS=$(echo $JSON | jq '.retryms') - -if [ $RETRYMS != null ]; then - echo $(expr $RETRYMS / 1000) -else - SONG=$(echo $JSON | tr '\r\n' ' ' | jq '.track.share.subject') - echo $SONG - rm -rf output.mp3 -fi diff --git a/configs/waybar/config b/configs/waybar/config index f072893..9597fbc 100644 --- a/configs/waybar/config +++ b/configs/waybar/config @@ -1,192 +1,109 @@ { - "height": 20, - "spacing": 4, - "bar_id":"bar-0", - "ipc": true, - "mode": "hide", - "hidden_state": "show", - "modules-left": ["custom/clock", "custom/waybar-mpris"], - "modules-center": ["sway/workspaces", "sway/mode"], - "modules-right": ["custom/theme","pulseaudio", "network", "battery"], - "sway/workspaces": { - "disable-scroll": true, - "all-outputs": false, - "format": "{name}", - "format-icons": { - "urgent": "", - "focused": "", - "default": "" - } - }, - "keyboard-state": { - "numlock": true, - "capslock": true, - "format": "{name} {icon}", - "format-icons": { - "locked": "", - "unlocked": "" - } - }, - "custom/theme":{ - "exec": "~/.config/waybar/theme.sh", - "on-click": "~/.config/waybar/theme.sh --toggle", - "restart-interval": 1, - }, - "custom/spotify": { - "exec": "/usr/bin/python3 /home/jim/.config/waybar/mediaplayer.py --player spotify", - "format": "{} ", - "return-type": "json", - "on-click": "playerctl play-pause", - "on-scroll-up": "playerctl next", - "on-scroll-down": "playerctl previous" - }, - "sway/mode": { - "format": "{}" - }, - "mpd": { - "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ", - "format-disconnected": "", - "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ", - "unknown-tag": "N/A", - "interval": 2, - "consume-icons": { - "on": " " - }, - "random-icons": { - "off": " ", - "on": " " - }, - "repeat-icons": { - "on": " " - }, - "single-icons": { - "on": "1 " - }, - "state-icons": { - "paused": "", - "playing": "" - }, - "tooltip-format": "MPD (connected)", - "tooltip-format-disconnected": "MPD (disconnected)" - }, - "idle_inhibitor": { - "format": "{icon}", - "format-icons": { - "activated": "", - "deactivated": "" - } - }, - "tray": { - "spacing": 10 - }, - "clock": { - "interval": 60, - "format": "{:%H:%M}", - "max-length": 25 - }, - "custom/clock": { - "exec": "date +'%H:%M'", - "interval": 10, - "on-click": "nm-applet" - }, - "cpu": { - "format": "{usage}% ", - "tooltip": false - }, - "memory": { - "format": "{}% " - }, - "temperature": { - // "thermal-zone": 2,media - // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", - "critical-threshold": 80, - // "format-critical": "{temperatureC}°C {icon}", - "format": "{temperatureC}°C {icon}", - "format-icons": ["", "", ""] - }, - "backlight": { - // "device": "acpi_video1", - "format": "{percent}% {icon}", - "format-icons": ["", ""] - }, - "battery": { - "states": { - "warning": 30, - "critical": 15 - }, - "format": "{capacity}% {icon}", - "format-charging": "{capacity}% ", - "format-plugged": "{capacity}% ", - "format-alt": "{time} {icon}", - // "format-good": "", // An empty format will hide the module - // "format-full": "", - "format-icons": ["", "", "", "", ""] - }, - "battery#bat2": { - "bat": "BAT2" - }, - "network": { - // "interface": "wlp2*", // (Optional) To force the use of this interface - "format-wifi": "{essid} ({signalStrength}%) ", - "format-ethernet": "{ipaddr}/{cidr} ", - "tooltip-format": "{ifname} via {gwaddr} ", - "format-linked": "{ifname} (No IP) ", - "format-disconnected": "Disconnected ⚠", - "format-alt": "{ifname}: {ipaddr}/{cidr}" - }, - "pulseaudio": { - // "scroll-step": 1, // %, can be a float - "format": "{volume}% {icon} {format_source}", - "format-bluetooth": "{volume}% {icon} {format_source}", - "format-bluetooth-muted": " {icon} {format_source}", - "format-muted": " {format_source}", - "format-source": "{volume}% ", - "format-source-muted": "", - "format-icons": { - "headphone": "", - "hands-free": "", - "headset": "", - "phone": "", - "portable": "", - "car": "", - "default": ["", "", ""] - }, - "on-click": "pavucontrol" - }, - "custom/cpu_speed": { - "interval": 10, - "return-type": "json", - "exec": "~/.config/waybar/cpu_speed.sh", - "format": "{icon} {}", - "format-icons": [""], - "escape": true, - "on-click": "kitty -e htop" -}, -"custom/waybar-mpris": { + "height": 20, + "spacing": 4, + "bar_id": "bar-0", + "ipc": true, + "mode": "hide", + "hidden_state": "show", + "modules-left": [ + "clock", + "custom/waybar-mpris" + ], + "modules-center": [ + "sway/workspaces", + "sway/mode" + ], + "modules-right": [ + "custom/dpi", + "custom/theme", + "pulseaudio", + "network", + "battery" + ], + "sway/workspaces": { + "disable-scroll": true, + "all-outputs": false, + "format": "{name}" + }, + "custom/theme": { + "exec": "~/.config/waybar/scripts/toggle-theme", + "on-click": "~/.config/waybar/scripts/toggle-theme --toggle", + "restart-interval": 1 + }, + "custom/dpi": { + "exec": "~/.config/waybar/scripts/toggle-hdpi", + "on-click": "~/.config/waybar/scripts/toggle-hdpi --toggle", + "restart-interval": 1 + }, + "sway/mode": { + "format": "{}" + }, + "clock": { + "interval": 60, + "format": "{:%H:%M}", + "max-length": 25 + }, + "battery": { + "states": { + "warning": 30, + "critical": 15 + }, + "format": "{capacity}% {icon}", + "format-charging": "{capacity}% ", + "format-plugged": "{capacity}% ", + "format-alt": "{time} {icon}", + "format-icons": [ + "", + "", + "", + "", + "" + ] + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "{essid} ({signalStrength}%) ", + "format-ethernet": "{ipaddr}/{cidr} ", + "tooltip-format": "{ifname} via {gwaddr} ", + "format-linked": "{ifname} (No IP) ", + "format-disconnected": "Disconnected ⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}" + }, + "pulseaudio": { + "format": "{volume}% {icon} {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": [ + "", + "", + "" + ] + }, + "on-click": "pavucontrol" + }, + "custom/waybar-mpris": { "max-length": 30, "return-type": "json", "exec": "waybar-mpris --position --autofocus", "on-click": "waybar-mpris --send toggle", // This option will switch between players on right click. - "on-click-right": "waybar-mpris --send player-next", + "on-click-right": "waybar-mpris --send player-next", // The options below will switch the selected player on scroll - // "on-scroll-up": "waybar-mpris --send player-next", - // "on-scroll-down": "waybar-mpris --send player-prev", + // "on-scroll-up": "waybar-mpris --send player-next", + // "on-scroll-down": "waybar-mpris --send player-prev", // The options below will go to next/previous track on scroll - // "on-scroll-up": "waybar-mpris --send next", - // "on-scroll-down": "waybar-mpris --send prev", + // "on-scroll-up": "waybar-mpris --send next", + // "on-scroll-down": "waybar-mpris --send prev", "escape": true -}, - "custom/media": { - "format": "{icon} {}", - "return-type": "json", - "max-length": 40, - "format-icons": { - "spotify": "", - "default": "🎜" - }, - "escape": true, - "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder - } + } } - diff --git a/configs/waybar/cpu_speed.sh b/configs/waybar/cpu_speed.sh deleted file mode 100755 index f22dda0..0000000 --- a/configs/waybar/cpu_speed.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -class=cpu_speed -speed_mhz=$(lscpu | grep "CPU MHz" | sed --expression "s/CPU MHz:[[:space:]]*//g" | xargs printf "%.*f\n" 0) - - - -# speed_ghz=`echo $(($speed_mhz / 1000))` - -speed_ghz=`bc -l <<< "$speed_mhz / 1000"` - -info=$(echo $speed_ghz | xargs printf "%.*f\n" 2) - -echo -e "{\"text\":\""$info GHz"\", \"class\":\""$class"\"}" diff --git a/configs/waybar/dev.sh b/configs/waybar/dev.sh deleted file mode 100755 index 470a704..0000000 --- a/configs/waybar/dev.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -CONFIG_FILES="$HOME/.config/waybar/config $HOME/.config/waybar/*.css $HOME/.config/waybar/*.sh" - -killall waybar; - -trap "killall waybar" EXIT - -while true; do - waybar & - inotifywait -e create,modify $CONFIG_FILES - killall waybar -done diff --git a/configs/waybar/mediaplayer.py b/configs/waybar/mediaplayer.py deleted file mode 100755 index 4206759..0000000 --- a/configs/waybar/mediaplayer.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import logging -import sys -import signal -import gi -import json -from os.path import expanduser -gi.require_version('Playerctl', '2.0') -from gi.repository import Playerctl, GLib - -logger = logging.getLogger(__name__) - - -def write_output(text, player): - logger.info('Writing output') - - output = {'text': text.replace("\n", " ").strip(), - 'class': 'custom-' + player.props.player_name, - 'alt': player.props.player_name} - - sys.stdout.write(json.dumps(output) + '\n') - sys.stdout.flush() - - -def on_play(player, _, manager): - logger.info('Received new playback status') - on_metadata(player, player.props.metadata, manager) - - -def on_metadata(player, metadata, _): - logger.info('Received new metadata') - track_info = '' - - if player.props.player_name == 'spotify' and \ - 'mpris:trackid' in metadata.keys() and \ - ':ad:' in player.props.metadata['mpris:trackid']: - track_info = 'AD PLAYING' - elif player.get_artist() != '' and player.get_title() != '': - track_info = '{artist} - {title}'.format(artist=player.get_artist(), - title=player.get_title()) - else: - track_info = player.get_title() - - if player.props.status != 'Playing' and track_info: - track_info = ' ' + track_info - write_output(track_info, player) - - -def on_player_appeared(manager, player, selected_player=None): - if player is not None and (selected_player is None or player.name == selected_player): - init_player(manager, player) - else: - logger.debug("New player appeared, but it's not the selected player, skipping") - - -def on_player_vanished(manager, player): - logger.info('Player has vanished') - sys.stdout.write('\n') - sys.stdout.flush() - - -def init_player(manager, name): - logger.debug('Initialize player: {player}'.format(player=name.name)) - player = Playerctl.Player.new_from_name(name) - player.connect('playback-status', on_play, manager) - player.connect('metadata', on_metadata, manager) - manager.manage_player(player) - on_metadata(player, player.props.metadata, manager) - - -def signal_handler(sig, frame): - logger.debug('Received signal to stop, exiting') - sys.stdout.write('\n') - sys.stdout.flush() - # loop.quit() - sys.exit(0) - - -def parse_arguments(): - parser = argparse.ArgumentParser() - - # Increase verbosity with every occurrence of -v - parser.add_argument('-v', '--verbose', action='count', default=0) - - # Define for which player we're listening - parser.add_argument('--player') - - return parser.parse_args() - - -def main(): - arguments = parse_arguments() - - # Initialize logging - # LOG=expanduser("~")+"/.dotfiles/configs/waybar/media.log" - # logging.basicConfig(level=logging.DEBUG, filename=LOG, - # format='%(name)s %(levelname)s %(message)s') - - # Logging is set by default to WARN and higher. - # With every occurrence of -v it's lowered by one - logger.setLevel(max((3 - arguments.verbose) * 10, 0)) - logger.setLevel(0) - - # Log the sent command line arguments - logger.debug('Arguments received {}'.format(vars(arguments))) - - manager = Playerctl.PlayerManager() - loop = GLib.MainLoop() - - manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player)) - manager.connect('player-vanished', on_player_vanished) - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - - for player in manager.props.player_names: - if arguments.player is not None and arguments.player != player.name: - logger.debug('{player} is not the filtered player, skipping it' - .format(player=player.name) - ) - continue - - init_player(manager, player) - - loop.run() - - -if __name__ == '__main__': - main() diff --git a/configs/waybar/mediaplayer_old.py b/configs/waybar/mediaplayer_old.py deleted file mode 100755 index 53c3748..0000000 --- a/configs/waybar/mediaplayer_old.py +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import logging -import sys -import signal -import time -import gi -import json -gi.require_version('Playerctl', '2.0') -from gi.repository import Playerctl, GLib -import subprocess -from os.path import expanduser -home = expanduser("~") - -logger = logging.getLogger(__name__) - -playerVisible = False - -def write_output(text, player_name): - logger.info('Writing output') - - output = {'text': text.replace("&", "&"), - 'class': 'custom-' + player_name, - 'alt': player_name} - - sys.stdout.write(json.dumps(output) + '\n') - sys.stdout.flush() - - -def on_play(player, status, manager): - logger.info('Received new playback status') - on_metadata(player, player.props.metadata, manager) - -def on_metadata(player, metadata, manager): - logger.info('Received new metadata') - track_info = '' - - if player.props.player_name == 'spotify' and \ - 'mpris:trackid' in metadata.keys() and \ - ':ad:' in player.props.metadata['mpris:trackid']: - track_info = 'AD PLAYING' - elif player.get_artist() != '' and player.get_title() != '': - track_info = '{artist} - {title}'.format(artist=player.get_artist(), - title=player.get_title()) - else: - track_info = player.get_title() - - if player.props.status != 'Playing' and track_info: - track_info = ' ' + track_info - write_output(track_info, player.props.player_name) - - -def update_song(): - global playerVisible - while not playerVisible: - result = subprocess.run("./capture_mp3.sh",stdout=subprocess.PIPE) - resultString = result.stdout.decode("utf-8") - logger.debug(resultString); - write_output(resultString, "Spotify") - time.sleep(6) - -def on_player_appeared(manager, player, selected_player=None): - global playerVisible - if player is not None and (selected_player is None or player.name == selected_player): - playerVisible = True - init_player(manager, player) - else: - logger.debug("New player appeared, but it's not the selected player, skipping") - - -def on_player_vanished(manager, player): - global playerVisible - logger.info('Player has vanished') - playerVisible = False - update_song() - sys.stdout.write('\n') - sys.stdout.flush() - - -def init_player(manager, name): - logger.debug('Initialize player: {player}'.format(player=name.name)) - player = Playerctl.Player.new_from_name(name) - player.connect('playback-status', on_play, manager) - player.connect('metadata', on_metadata, manager) - update_song() - manager.manage_player(player) - on_metadata(player, player.props.metadata, manager) - - -def signal_handler(sig, frame): - logger.debug('Received signal to stop, exiting') - sys.stdout.write('\n') - sys.stdout.flush() - loop.quit() - sys.exit(0) - - -def parse_arguments(): - parser = argparse.ArgumentParser() - - # Increase verbosity with every occurrence of -v - parser.add_argument('-v', '--verbose', action='count', default=0) - - # Define for which player we're listening - parser.add_argument('--player') - - return parser.parse_args() - - -def main(): - - arguments = parse_arguments() - - # Initialize logging - LOG = home+"/.dotfiles/configs/waybar/media.log" logger.setLevel(max((3 - arguments.verbose) * 10, 0)) - logging.basicConfig(stream=sys.stderr, filename=LOG, level=logging.DEBUG, - format='%(name)s %(levelname)s %(message)s') - - logger.setLevel(0) - - # Log the sent command line arguments - logger.debug('Arguments received {}'.format(vars(arguments))) - - manager = Playerctl.PlayerManager() - loop = GLib.MainLoop() - - manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player)) - manager.connect('player-vanished', on_player_vanished) - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - - for player in manager.props.player_names: - if arguments.player is not None and arguments.player != player.name: - logger.debug('{player} is not the filtered player, skipping it' - .format(player=player.name) - ) - continue - - init_player(manager, player) - - update_song() - loop.run() - -if __name__ == '__main__': - main() diff --git a/configs/waybar/output.mp3 b/configs/waybar/output.mp3 deleted file mode 100644 index 2e5673377ff322de895f749df385dbe3a2542538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65200 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 diff --git a/configs/waybar/powermode.sh b/configs/waybar/powermode.sh deleted file mode 100644 index ea4324a..0000000 --- a/configs/waybar/powermode.sh +++ /dev/null @@ -1,3 +0,0 @@ -MAX_FREQ=$(lscpu | grep "CPU max MHz" | sed --expression "s/CPU max MHz:[[:space:]]*//g" | xargs printf "%.*f\n" 0) -CURRENT_MAX_FREG=$(cpufreq-info | grep "c") - diff --git a/configs/waybar/recognize-song.sh b/configs/waybar/recognize-song.sh deleted file mode 100644 index 05a7907..0000000 --- a/configs/waybar/recognize-song.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash - diff --git a/configs/waybar/dark-mode.sh b/configs/waybar/scripts/set-theme similarity index 100% rename from configs/waybar/dark-mode.sh rename to configs/waybar/scripts/set-theme diff --git a/configs/waybar/scripts/toggle-hdpi b/configs/waybar/scripts/toggle-hdpi new file mode 100755 index 0000000..e1aaf7e --- /dev/null +++ b/configs/waybar/scripts/toggle-hdpi @@ -0,0 +1,22 @@ +#!/bin/sh +CURRENT=$(swaymsg -t get_outputs --raw | jq '.[] | [.current_mode.width, .current_mode.height] | join("x")') + +HIGH="ﳍ" +STANDARD="ﳭ" + +if [ "$CURRENT" = '"3840x2160"' ]; then + if [ "$1" = "--toggle" ]; then + swaymsg "output eDP-1 mode --custom 1920x1080@60Hz" + killall waybar + nohup waybar + fi + echo $HIGH +elif [ "$CURRENT" = '"1920x1080"' ]; then + if [ "$1" = "--toggle" ]; then + swaymsg "output eDP-1 mode --custom 3840x2160@60Hz" + killall waybar + nohup waybar + fi + echo $STANDARD +fi + diff --git a/configs/waybar/theme.sh b/configs/waybar/scripts/toggle-theme similarity index 64% rename from configs/waybar/theme.sh rename to configs/waybar/scripts/toggle-theme index 6b4283e..c7f8b9d 100755 --- a/configs/waybar/theme.sh +++ b/configs/waybar/scripts/toggle-theme @@ -3,17 +3,14 @@ DARK_MODE_STATUS_FILE=~/.cache/dark-mode CURRENT_DARK_MODE=$( cat $DARK_MODE_STATUS_FILE ) -LIGHT="☀️" -DARK="🌙" - -echo "\$1 $1" -echo "MODE: $CURRENT_DARK_MODE" +LIGHT="盛" +DARK="" if [ "$1" == "--toggle" ]; then if [ $CURRENT_DARK_MODE == "light" ]; then - ~/.config/waybar/dark-mode.sh dark + ~/.config/waybar/scripts/set-theme dark else - ~/.config/waybar/dark-mode.sh light + ~/.config/waybar/scripts/set-theme light fi fi diff --git a/configs/wofi/config b/configs/wofi/config index 23c0d90..2296d28 100644 --- a/configs/wofi/config +++ b/configs/wofi/config @@ -4,3 +4,4 @@ width=500 dynamic_lines=true term=kitty insensitive=true +layer=overlay diff --git a/configs/wofi/open-localhost b/configs/wofi/scripts/open-localhost similarity index 100% rename from configs/wofi/open-localhost rename to configs/wofi/scripts/open-localhost diff --git a/configs/wofi/wofi-power-menu.sh b/configs/wofi/scripts/power-menu similarity index 65% rename from configs/wofi/wofi-power-menu.sh rename to configs/wofi/scripts/power-menu index 1055a6f..0d7e3c4 100755 --- a/configs/wofi/wofi-power-menu.sh +++ b/configs/wofi/scripts/power-menu @@ -1,8 +1,8 @@ #!/bin/bash -entries="⏻ Shutdown\n⭮ Reboot\n⇠ Logout\n⏾ Suspend" +entries="⏻ Shutdown\n↺ Reboot\n⇠ Logout\n⏾ Suspend" -selected=$(echo -e $entries|wofi --width 250 --height 210 --dmenu --cache-file /dev/null | awk '{print tolower($2)}') +selected=$(echo -e $entries|wofi --width 250 --height 150 --dmenu --cache-file /dev/null | awk '{print tolower($2)}') case $selected in logout) diff --git a/configs/wofi/wofi-emoji b/configs/wofi/scripts/select-emoji similarity index 100% rename from configs/wofi/wofi-emoji rename to configs/wofi/scripts/select-emoji diff --git a/configs/wofi/select-vpn.sh b/configs/wofi/scripts/select-vpn similarity index 100% rename from configs/wofi/select-vpn.sh rename to configs/wofi/scripts/select-vpn diff --git a/configs/wofi/select-wifi.sh b/configs/wofi/scripts/select-wifi similarity index 100% rename from configs/wofi/select-wifi.sh rename to configs/wofi/scripts/select-wifi diff --git a/configs/wofi/web-search.sh b/configs/wofi/scripts/web-search similarity index 100% rename from configs/wofi/web-search.sh rename to configs/wofi/scripts/web-search diff --git a/configs/wofi/sway-select-window.sh b/configs/wofi/sway-select-window.sh deleted file mode 100755 index a59fe02..0000000 --- a/configs/wofi/sway-select-window.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -swaymsg -t get_tree | jq -r ' - # descend to workspace or scratchpad - .nodes[].nodes[].nodes[] - # save workspace name as .w - | {"w": .name} + ( - if .nodes then # workspace - [recurse(.nodes[])] - else # scratchpad - [] - end - + .floating_nodes - | .[] - # select nodes with no children (windows) - | select(.nodes==[]) - ) - | ((.id | tostring) + "\t " - # remove markup and index from workspace name, replace scratch with "[S]" - + (.w | gsub("^[^:]*:|<[^>]*>"; "") | sub("__i3_scratch"; "[S]")) - + "\t " + .name) - ' | wofi --show dmenu| { - read -r id name - swaymsg "[con_id=$id]" focus -} diff --git a/configs/wofi/swytcher.sh b/configs/wofi/swytcher.sh deleted file mode 100755 index e573af2..0000000 --- a/configs/wofi/swytcher.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/bash - -# Swytch is a script providing a window switcher for sway using rofi, awk and jq. -# The script is based on: -# https://www.reddit.com/r/swaywm/comments/aolf3u/quick_script_for_rofi_alttabbing_window_switcher/ -# Copyright (C) 2019 Björn Sonnenschein -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - - -# todo: first, query all existing workspaces from sway and build color dict, so that -# all workspaces always get the same color, even if no windows at some workspace in between exists. - -# obtain command to execute with swaymsg for selected window -if [ -z "$1" ] -then - command_=focus -else - command_=$1 -fi - -# Obtain the avaliable windows' workspaces, names and IDs as strings -mapfile -t windows < <( -swaymsg -t get_tree | jq -r '[ - recurse(.nodes[]?) - |recurse(.floating_nodes[]?) - |select(.type=="workspace") - | . as $workspace | recurse(.nodes[]?) - |select(.type=="con" and .name!=null) - |{workspace: $workspace.name, name: .name, id: .id, focused: .focused, app_id: .app_id}] - |sort_by(.workspace, .name)[] - |.workspace + if .focused then "* " else " " end + .app_id + " - " + .name + " " + (.id|tostring)' -) -rm $HOME/.cache/wofi-dmenu - -windows_separators=() -colors=(blue green orange red magenta) -workspace_previous='' -index_workspace_active=0 -num_separators=0 -index_color=0 -bold=-1 -for index_window in "${!windows[@]}" -do - window="${windows[$index_window]}" - # todo: consider arbitraty workspace name length by separating by space instead of simply taking first argument. - workspace=${window:0:1} - # obtain index of the active window - if [ "${window:1:1}" == "*" ] - then - index_workspace_active=$(($index_window)) - fi - - # if window has different workspace than previous, use next color. Cycle through colors - if [ "$workspace" != "$workspace_previous" ] && [ ! -z "$workspace_previous" ] - then - index_color=$index_color+1 - fi - - if (($index_color == ${#colors[@]})) - then - index_color=0 - fi - if (( $bold == 1)) - then - windows_separators+=("[${workspace}]${window:1}") - else - windows_separators+=("[${workspace}]${window:1}") - fi - workspace_previous=$workspace -done - -HEIGHT=$(( $(printf '%s\n' "${windows_separators[@]}" | wc -l) * 30 )) - -echo $HEIGHT -# Select window with rofi, obtaining ID of selected window -idx_selected=$(printf '%s\n' "${windows_separators[@]}" | wofi -d -p "$command_" -m -H $HEIGHT ) -selected=${windows[$idx_selected]} -id_selected=$(echo $selected | awk '{print $NF}') -workspace_selected=${selected:0:1} - - -### unmaximize all maximized windows on the workspace of the selected window -# Obtain the avaliable windows' workspaces, names and IDs as strings -mapfile -t ids_windows_maximized < <( -swaymsg -t get_tree | jq -r '[ - recurse(.nodes[]?) - |recurse(.floating_nodes[]?) - |select(.type=="workspace") - | . as $workspace | recurse(.nodes[]?) - |select(.type=="con" and .name!=null and .fullscreen_mode==1 and $workspace.name=="'"$workspace_selected"'") - |{workspace: $workspace.name, name: .name, id: .id, focused: .focused, app_id: .app_id}] - |sort_by(.workspace, .name)[] - |(.id|tostring)' -) - -# unmaximize the maximized windows that are not the selected one -for id_window_maximized in "${ids_windows_maximized[@]}" -do - if [ "$id_window_maximized" != "$id_selected" ] - then - swaymsg "[con_id=$id_window_maximized] fullscreen disable" - fi -done - -# Tell sway to focus said window -# todo: do not execute if selected is the separator -if [ ! -z "$id_selected" ] -then - swaymsg "[con_id=$id_selected] $command_" -fi diff --git a/configs/wofi/wofi-emoji-new b/configs/wofi/wofi-emoji-new deleted file mode 100755 index 48fd03d..0000000 --- a/configs/wofi/wofi-emoji-new +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rofimoji diff --git a/configs/wofi/wofi-emoji-old-2 b/configs/wofi/wofi-emoji-old-2 deleted file mode 100755 index ee6b6f8..0000000 --- a/configs/wofi/wofi-emoji-old-2 +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env bash - -# Source: https://gist.github.com/NearHuscarl/5d366e1a3b788814bcbea62c1f66241d -# -# Use wofi to pick emoji because that's what this -# century is about apparently... -# -# Requirements: -# wofi, wlroots based compositor -# -# Usage: -# 1. Download all emoji -# $ wofi-emoji --download -# -# 2. Run it! -# $ wofi-emoji -# -# Notes: -# * You'll need a emoji font like "Noto Emoji" or "EmojiOne". -# * Confirming an item will automatically paste it WITHOUT -# writing it to your clipboard. -# * Ctrl+C will copy it to your clipboard WITHOUT pasting it. -# - -# Where to save the emojis file. -EMOJI_FILE="$HOME/.cache/emojis.txt" - -# Urls of emoji to download. -# You can remove what you don't need. -URLS=( -'https://emojipedia.org/people/' -'https://emojipedia.org/nature/' -'https://emojipedia.org/food-drink/' -'https://emojipedia.org/activity/' -'https://emojipedia.org/travel-places/' -'https://emojipedia.org/objects/' -'https://emojipedia.org/symbols/' -'https://emojipedia.org/flags/' -) - - -function notify() { - if [ "$(command -v notify-send)" ]; then - notify-send "$1" "$2" - fi -} - - -function download() { - notify "$(basename "$0")" 'Downloading all emoji for your pleasure' - - echo "" > "$EMOJI_FILE" - - for url in "${URLS[@]}"; do - echo "Downloading: $url" - - # Download the list of emoji and remove all the junk around it - emojis=$(curl -s "$url" | \ - xmllint --html \ - --xpath '//ul[@class="emoji-list"]' - 2>/dev/null) - - # Get rid of starting/closing ul tags - emojis=$(echo "$emojis" | head -n -1 | tail -n +1) - - # Extract the emoji and its description - emojis=$(echo "$emojis" | \ - sed -rn 's/.*(.*)<\/span> (.*)<\/a><\/li>/\1 \2/p') - - echo "$emojis" >> "$EMOJI_FILE" - done - - notify "$(basename "$0")" "We're all set!" -} - -function wofi_menu() { # {{{ - wofi -width 25 -lines 7 -dmenu -i -p 'emoji: ' \ - -kb-row-tab '' \ - -kb-row-select Tab \ - -kb-custom-1 Ctrl+c -} -# }}} - -function repeat() { # {{{ - local rplc str="$1" count="$2" - rplc="$(printf "%${count}s")" - echo "${rplc// /"$str"}" -} -# }}} - -function toclipboard() { # {{{ - wl-copy -} -# }}} - -function pastedirectly() { #{{{ - wtype - -} -# }}} - -function display() { - local emoji line exit_code quantifier - - emoji=$(cat "$EMOJI_FILE" | grep -v '#' | grep -v '^[[:space:]]*$') - line="$(echo "$emoji" | wofi_menu)" - exit_code=$? - - line=($line) - last=${line[${#line[@]}-1]} - quantifier="${last:${#last}-1:1}" - if [[ ! "$quantifier" =~ [0-9] ]]; then - quantifier=1 - fi - emoijs="$(repeat "${line[0]}" "$quantifier")" - - if [ $exit_code == 0 ]; then - echo -n "$emoijs" | pastedirectly - elif [ $exit_code == 10 ]; then - echo -n "$emoijs" | toclipboard - fi -} - - -# Some simple argparsing -if [[ "$1" =~ -D|--download ]]; then - download - exit 0 -elif [[ "$1" =~ -h|--help ]]; then - echo "usage: $0 [-D|--download]" - exit 0 -fi - -# Download all emoji if they don't exist yet -if [ ! -f "$EMOJI_FILE" ]; then - download -fi - -# display displays :) -display