mirror of
https://github.com/Astatin3/dotfiles.git
synced 2026-06-09 00:07:59 -06:00
Keep things up-to-date
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,231 @@
|
||||
set $mod Mod4
|
||||
set $left h
|
||||
set $down j
|
||||
set $up k
|
||||
set $right l
|
||||
set $term foot
|
||||
|
||||
set $fb thunar
|
||||
set $wb firefox
|
||||
|
||||
#xwayland enable
|
||||
|
||||
#set $menu dmenu_path | dmenu | xargs swaymsg exec --
|
||||
|
||||
include /etc/sway/config-vars.d/*
|
||||
|
||||
#exec_always python3 ~/.config/sway/neofetch.py
|
||||
#exec waybar
|
||||
|
||||
set $configdir /home/astatin3/.config/sway/
|
||||
|
||||
|
||||
exec_always pkill -f swaybg
|
||||
exec_always python3 ~/.config/sway/neofetch.py
|
||||
exec_always dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK &
|
||||
exec_always pkill -f waybar
|
||||
exec_always waybar
|
||||
|
||||
exec swayidle -w \
|
||||
timeout 300 "/bin/bash $configdir/lock.sh ss" \
|
||||
before-sleep "/bin/bash $configdir/lock.sh lock"
|
||||
|
||||
for_window [app_id="^launcher$"] floating enable, sticky enable, resize set 30 ppt 60 ppt, border pixel none
|
||||
set $menu exec $term -a launcher -e env ~/.config/sway/sway-launcher-desktop.sh
|
||||
|
||||
for_window [title="Picture-in-Picture"] floating enable, sticky enable
|
||||
for_window [title="Application Finder"] floating enable, sticky enable, resize set 30 ppt 60 ppt, border pixel none
|
||||
set $menug exec xfce4-appfinder
|
||||
|
||||
bindsym Print exec 'date="$(date '+%T')" && grim /tmp/$date.png && swaynag -m "Took screenshot, saved at $date"'
|
||||
|
||||
for_window [title="xfce4-notifyd"] floating enable, sticky enable, move position 0 0
|
||||
|
||||
#default_floating_border csd
|
||||
default_border normal pixel 2
|
||||
#gaps outer 5
|
||||
|
||||
focus_follows_mouse always
|
||||
|
||||
client.focused #373e48aa #1C1F24FF #D0D0D0FF #373e48aa #373e48aa
|
||||
client.unfocused #1C1F2400 #1C1F24FF #D0D0D0FF #1C1F2400 #1C1F2400
|
||||
client.focused_inactive #373e48aa #1C1F24FF #D0D0D0FF #373e48aa #373e48aa
|
||||
floating_maximum_size 1920 x 1080
|
||||
|
||||
#exec_always ~/.config/sway/startapps.sh
|
||||
|
||||
# Start a terminal
|
||||
bindsym $mod+Return exec $term
|
||||
|
||||
# Kill focused window
|
||||
bindsym $mod+Shift+q kill
|
||||
|
||||
# Keybind to launch file browser
|
||||
bindsym $mod+Shift+s exec $fb ~
|
||||
|
||||
# Keybind to launch web browser
|
||||
bindsym $mod+Shift+a exec $wb ~
|
||||
|
||||
# Start your launcher
|
||||
bindsym $mod+d exec $menu
|
||||
bindsym $mod+Shift+d exec $menug
|
||||
|
||||
bindsym $mod+l exec "/bin/bash $configdir/lock.sh lock"
|
||||
bindsym $mod+Shift+l exec "/bin/bash $configdir/lock.sh ss"
|
||||
|
||||
|
||||
# Drag floating windows by holding down $mod and left mouse button.
|
||||
# Resize them with right mouse button + $mod.
|
||||
# Despite the name, also works for non-floating windows.
|
||||
# Change normal to inverse to use left mouse button for resizing and right
|
||||
# mouse button for dragging.
|
||||
floating_modifier $mod normal
|
||||
|
||||
# Reload the configuration file
|
||||
bindsym $mod+Shift+c reload
|
||||
|
||||
# Exit sway (logs you out of your Wayland session)
|
||||
bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit'
|
||||
#
|
||||
# Moving around:
|
||||
#
|
||||
# Move your focus around
|
||||
bindsym $mod+$left focus left
|
||||
bindsym $mod+$down focus down
|
||||
bindsym $mod+$up focus up
|
||||
#bindsym $mod+$right focus right
|
||||
## Or use $mod+[up|down|left|right]
|
||||
bindsym $mod+Left focus left
|
||||
bindsym $mod+Down focus down
|
||||
bindsym $mod+Up focus up
|
||||
bindsym $mod+Right focus right
|
||||
|
||||
# Move the focused window with the same, but add Shift
|
||||
#bindsym $mod+Shift+$left move left
|
||||
#bindsym $mod+Shift+$down move down
|
||||
#bindsym $mod+Shift+$up move up
|
||||
#bindsym $mod+Shift+$right move right
|
||||
# Ditto, with arrow keys
|
||||
bindsym $mod+Shift+Left move left
|
||||
bindsym $mod+Shift+Down move down
|
||||
bindsym $mod+Shift+Up move up
|
||||
bindsym $mod+Shift+Right move right
|
||||
#
|
||||
# Workspaces:
|
||||
#
|
||||
# Switch to workspace
|
||||
bindsym $mod+1 workspace number 1
|
||||
bindsym $mod+2 workspace number 2
|
||||
bindsym $mod+3 workspace number 3
|
||||
bindsym $mod+4 workspace number 4
|
||||
bindsym $mod+5 workspace number 5
|
||||
bindsym $mod+6 workspace number 6
|
||||
bindsym $mod+7 workspace number 7
|
||||
bindsym $mod+8 workspace number 8
|
||||
bindsym $mod+9 workspace number 9
|
||||
bindsym $mod+0 workspace number 10
|
||||
|
||||
# Switch to workspace(with numpad)
|
||||
bindsym $mod+KP_End workspace number 1
|
||||
bindsym $mod+KP_Down workspace number 2
|
||||
bindsym $mod+KP_Next workspace number 3
|
||||
bindsym $mod+KP_Left workspace number 4
|
||||
bindsym $mod+KP_Begin workspace number 5
|
||||
bindsym $mod+KP_Right workspace number 6
|
||||
bindsym $mod+KP_Home workspace number 7
|
||||
bindsym $mod+KP_Up workspace number 8
|
||||
bindsym $mod+KP_Prior workspace number 9
|
||||
bindsym $mod+KP_Insert workspace number 10
|
||||
|
||||
# Move focused container to workspace
|
||||
bindsym $mod+Shift+1 move container to workspace number 1
|
||||
bindsym $mod+Shift+2 move container to workspace number 2
|
||||
bindsym $mod+Shift+3 move container to workspace number 3
|
||||
bindsym $mod+Shift+4 move container to workspace number 4
|
||||
bindsym $mod+Shift+5 move container to workspace number 5
|
||||
bindsym $mod+Shift+6 move container to workspace number 6
|
||||
bindsym $mod+Shift+7 move container to workspace number 7
|
||||
bindsym $mod+Shift+8 move container to workspace number 8
|
||||
bindsym $mod+Shift+9 move container to workspace number 9
|
||||
bindsym $mod+Shift+0 move container to workspace number 10
|
||||
|
||||
# move focused container to workspace (with numpad)
|
||||
bindsym $mod+Shift+KP_End move container to workspace 1
|
||||
bindsym $mod+Shift+KP_Down move container to workspace 2
|
||||
bindsym $mod+Shift+KP_Next move container to workspace 3
|
||||
bindsym $mod+Shift+KP_Left move container to workspace 4
|
||||
bindsym $mod+Shift+KP_Begin move container to workspace 5
|
||||
bindsym $mod+Shift+KP_Right move container to workspace 6
|
||||
bindsym $mod+Shift+KP_Home move container to workspace 7
|
||||
bindsym $mod+Shift+KP_Up move container to workspace 8
|
||||
bindsym $mod+Shift+KP_Prior move container to workspace 9
|
||||
bindsym $mod+Shift+KP_Insert move container to workspace 10
|
||||
|
||||
# Note: workspaces can have any name you want, not just numbers.
|
||||
# We just use 1-10 as the default.
|
||||
#
|
||||
# Layout stuff:
|
||||
#
|
||||
# You can "split" the current object of your focus with
|
||||
# $mod+b or $mod+v, for horizontal and vertical splits
|
||||
# respectively.
|
||||
bindsym $mod+b splith
|
||||
bindsym $mod+v splitv
|
||||
|
||||
# Switch the current container between different layout styles
|
||||
bindsym $mod+s layout stacking
|
||||
bindsym $mod+w layout tabbed
|
||||
bindsym $mod+e layout toggle split
|
||||
|
||||
# Make the current focus fullscreen
|
||||
bindsym $mod+f fullscreen
|
||||
|
||||
# Toggle the current focus between tiling and floating mode
|
||||
bindsym $mod+Shift+space floating toggle
|
||||
|
||||
# Swap focus between the tiling area and the floating area
|
||||
bindsym $mod+space focus mode_toggle
|
||||
|
||||
# Move focus to the parent container
|
||||
bindsym $mod+a focus parent
|
||||
#
|
||||
# Scratchpad:
|
||||
#
|
||||
# Sway has a "scratchpad", which is a bag of holding for windows.
|
||||
# You can send windows there and get them back later.
|
||||
|
||||
# Move the currently focused window to the scratchpad
|
||||
bindsym $mod+Shift+minus move scratchpad
|
||||
|
||||
# Show the next scratchpad window or hide the focused scratchpad window.
|
||||
# If there are multiple scratchpad windows, this command cycles through them.
|
||||
bindsym $mod+minus scratchpad show
|
||||
#
|
||||
# Resizing containers:
|
||||
#
|
||||
mode "resize" {
|
||||
# left will shrink the containers width
|
||||
# right will grow the containers width
|
||||
# up will shrink the containers height
|
||||
# down will grow the containers height
|
||||
bindsym $left resize shrink width 10px
|
||||
bindsym $down resize grow height 10px
|
||||
bindsym $up resize shrink height 10px
|
||||
bindsym $right resize grow width 10px
|
||||
|
||||
# Ditto, with arrow keys
|
||||
bindsym Left resize shrink width 10px
|
||||
bindsym Down resize grow height 10px
|
||||
bindsym Up resize shrink height 10px
|
||||
bindsym Right resize grow width 10px
|
||||
|
||||
# Return to default mode
|
||||
bindsym Return mode "default"
|
||||
bindsym Escape mode "default"
|
||||
}
|
||||
bindsym $mod+r mode "resize"
|
||||
|
||||
include /etc/sway/config.d/*
|
||||
|
||||
bindsym XF86MonBrightnessUp exec brightnessctl s +5%
|
||||
bindsym XF86MonBrightnessDown exec brightnessctl s 5%-
|
||||
@@ -0,0 +1,9 @@
|
||||
# import variables into system-user enviroment
|
||||
# based on the instructions in the sway wiki
|
||||
# see also https://github.com/swaywm/sway/issues/5732
|
||||
# and https://github.com/systemd/systemd/blob/dfc637d0ff756889e8e5b7cb4ec991eb06069aa1/xorg/50-systemd-user.sh
|
||||
|
||||
exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK
|
||||
|
||||
exec hash dbus-update-activation-environment 2>/dev/null && \
|
||||
dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,17 @@
|
||||
_,met$$$$$gg.
|
||||
,g$$$$$$$$$$$$$$$P.
|
||||
,g$$P" """Y$$.".
|
||||
,$$P' `$$$.
|
||||
',$$P ,ggs. `$$b:
|
||||
`d$$' ,$P"' . $$$
|
||||
$$P d$' , $$P
|
||||
$$: $$. - ,d$$'
|
||||
$$; Y$b._ _,d$P'
|
||||
Y$$. `.`"Y$$$$P"'
|
||||
`$$b "-.__
|
||||
`Y$$
|
||||
`Y$$.
|
||||
`$$b.
|
||||
`Y$$b.
|
||||
`"Y$b._
|
||||
`"""
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
screenshotloc=/tmp/screensaver.png
|
||||
sscommand="btop"
|
||||
terminal="foot"
|
||||
|
||||
lockscreensaverdelay=30
|
||||
termopendelay=0.2
|
||||
|
||||
curworkspace=$(swaymsg -pt get_workspaces | grep -o -P '(?<=Workspace\s).*(?=\s\(focused\))')
|
||||
brightness=$(brightnessctl g)
|
||||
|
||||
function start {
|
||||
#Create screenshot and blur
|
||||
grim $screenshotloc
|
||||
convert $screenshotloc -filter Gaussian -blur 0x8 $screenshotloc
|
||||
|
||||
#Open screensaver program for quick-change
|
||||
swaymsg workspace "screensaver"
|
||||
sleep 0.1
|
||||
swaymsg exec $terminal $sscommand &
|
||||
sleep "$termopendelay"
|
||||
swaymsg fullscreen toggle
|
||||
}
|
||||
|
||||
function stop {
|
||||
swaymsg workspace $curworkspace
|
||||
pkill -fn $sscommand
|
||||
rm $screenshotloc
|
||||
}
|
||||
|
||||
function doscreensaver {
|
||||
swayidle timeout 1 "" resume "pkill -n swayidle"
|
||||
dolock
|
||||
}
|
||||
|
||||
function dolock {
|
||||
pkill swaylock
|
||||
swaymsg exec "swaylock -i $screenshotloc && pkill -n swayidle" &
|
||||
swayidle timeout "$lockscreensaverdelay" "pkill -n swayidle"
|
||||
if [[ "$(pidof 'swaylock')" != "" ]]; then
|
||||
pkill swaylock
|
||||
doscreensaver
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ $1 == "lock" ]]; then
|
||||
start
|
||||
dolock
|
||||
stop
|
||||
elif [[ $1 == "ss" ]]; then
|
||||
start
|
||||
doscreensaver
|
||||
stop
|
||||
else
|
||||
echo "invalid command, try 'ss' or 'lock'"
|
||||
fi
|
||||
@@ -0,0 +1,62 @@
|
||||
import subprocess
|
||||
import datetime
|
||||
import os
|
||||
|
||||
from PIL import Image
|
||||
from PIL import ImageFont
|
||||
from PIL import ImageDraw
|
||||
|
||||
try:
|
||||
os.ulink("/tmp/wallpaper.png")
|
||||
except:
|
||||
x = None # Do nothing
|
||||
|
||||
#file = open("/home/astatin3/.config/sway/icon.txt","r")
|
||||
#lines = file.readlines()
|
||||
#file.close()
|
||||
|
||||
output = (subprocess.run(['neofetch', '--stdout'], capture_output=True, text=True).stdout).split("\n")
|
||||
|
||||
screenX = 0
|
||||
screenY = 0
|
||||
|
||||
for i in range(0, len(output)-2, 1):
|
||||
#lines[i] = lines[i][:-1] + output[i]
|
||||
|
||||
#print(lines[i])
|
||||
|
||||
if i == 0:
|
||||
output[0] += f"at ({datetime.datetime.now().strftime('%m-%d %H:%M:%S')})"
|
||||
|
||||
if i == 8:
|
||||
res = output[i].split(" ")[1].split("x")
|
||||
screenX = int(res[0])
|
||||
screenY = int(res[1])
|
||||
|
||||
#neofetch = "\n".join(lines)
|
||||
|
||||
icon = Image.open("/home/astatin3/.config/sway/icon.png")
|
||||
iconsizeX, iconsizeY = icon.size
|
||||
|
||||
neofetch = "\n".join(output)
|
||||
|
||||
textSize = 0.01
|
||||
|
||||
iconscale = 0.0005
|
||||
|
||||
textoffsetX = 0.0 #Percentages
|
||||
textoffsetY = -0.16
|
||||
|
||||
iconoffsetX = -0.145
|
||||
iconoffsetY = -0.16
|
||||
|
||||
img = Image.new('RGB', (screenX, screenY), (31, 26, 32))
|
||||
draw = ImageDraw.Draw(img)
|
||||
font = ImageFont.truetype("/home/astatin3/.config/sway/UbuntuMonoNerdFontMono-Regular.ttf", textSize*screenX)
|
||||
draw.text((textoffsetX*screenX+screenX/2, textoffsetY*screenY+screenY/2),neofetch,(199,0,57),font=font)
|
||||
icon = icon.resize((round(iconscale*iconsizeX*screenY), round(iconscale*iconsizeY*screenY)), Image.Resampling.LANCZOS)
|
||||
img.paste(icon, (round(iconoffsetX*screenX+screenX/2), round(iconoffsetY*screenY+screenY/2)))
|
||||
img.save("/tmp/wallpaper.png")
|
||||
#img.show()
|
||||
|
||||
subprocess.run(["swaybg", "-m", "fill", "-i", "/tmp/wallpaper.png"])
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
if [[ "$(pgrep -f 'lock')" != '' ]]
|
||||
then
|
||||
exit
|
||||
fi
|
||||
|
||||
#cmd[0]="cmatrix"
|
||||
#cmd[1]="hollywood"
|
||||
#cmd[2]="termsaver sysmon"
|
||||
#cmd[3]="termsaver wttr"
|
||||
#cmd=${cmd[$[$RANDOM % ${#cmd[@]}]]}
|
||||
|
||||
cmd="hollywood"
|
||||
term="foot"
|
||||
|
||||
grim "/tmp/swaylock.png"
|
||||
convert "/tmp/swaylock.png" -filter Gaussian -blur 0x8 "/tmp/swaylock-blur.png"
|
||||
|
||||
rm "/tmp/swaylock.png"
|
||||
|
||||
workspace="$(swaymsg -t get_workspaces -p | grep -oP '(?<=Workspace\s).*?(?=\s\(focused\))')"
|
||||
swaymsg workspace "screensaver"
|
||||
swaymsg exec $term $cmd
|
||||
|
||||
sleep 0.5
|
||||
|
||||
swaymsg fullscreen
|
||||
|
||||
swayidle -w timeout 1 "" resume "pkill -n 'swayidle'"
|
||||
|
||||
swaylock -f -i "/tmp/swaylock-blur.png"
|
||||
|
||||
pkill -n -f "$term $cmd" &
|
||||
swaymsg workspace $workspace &
|
||||
rm "/tmp/swaylock-blur.png" &
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK &
|
||||
pkill -f waybar &
|
||||
pkill -f swaybg &
|
||||
python3 ~/.config/sway/neofetch.py &
|
||||
waybar &
|
||||
Executable
+368
@@ -0,0 +1,368 @@
|
||||
#!/usr/bin/env bash
|
||||
# terminal application launcher for sway, using fzf
|
||||
# Based on: https://gitlab.com/FlyingWombat/my-scripts/blob/master/sway-launcher
|
||||
# https://gist.github.com/Biont/40ef59652acf3673520c7a03c9f22d2a
|
||||
shopt -s nullglob globstar
|
||||
set -o pipefail
|
||||
if ! { exec 0>&3; } 1>/dev/null 2>&1; then
|
||||
exec 3>/dev/null # If file descriptor 3 is unused in parent shell, output to /dev/null
|
||||
fi
|
||||
# shellcheck disable=SC2154
|
||||
trap 's=$?; echo "$0: Error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR
|
||||
IFS=$'\n\t'
|
||||
DEL=$'\34'
|
||||
|
||||
TERMINAL_COMMAND="${TERMINAL_COMMAND:="$TERMINAL"}"
|
||||
GLYPH_COMMAND="${GLYPH_COMMAND- }"
|
||||
GLYPH_DESKTOP="${GLYPH_DESKTOP- }"
|
||||
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/sway-launcher-desktop"
|
||||
PROVIDERS_FILE="${PROVIDERS_FILE:=providers.conf}"
|
||||
if [[ "${PROVIDERS_FILE#/}" == "${PROVIDERS_FILE}" ]]; then
|
||||
# $PROVIDERS_FILE is a relative path, prepend $CONFIG_DIR
|
||||
PROVIDERS_FILE="${CONFIG_DIR}/${PROVIDERS_FILE}"
|
||||
fi
|
||||
|
||||
# Provider config entries are separated by the field separator \034 and have the following structure:
|
||||
# list_cmd,preview_cmd,launch_cmd,purge_cmd
|
||||
declare -A PROVIDERS
|
||||
if [ -f "${PROVIDERS_FILE}" ]; then
|
||||
eval "$(awk -F= '
|
||||
BEGINFILE{ provider=""; }
|
||||
/^\[.*\]/{sub("^\\[", "");sub("\\]$", "");provider=$0}
|
||||
/^(launch|list|preview|purge)_cmd/{st = index($0,"=");providers[provider][$1] = substr($0,st+1)}
|
||||
ENDFILE{
|
||||
for (key in providers){
|
||||
if(!("list_cmd" in providers[key])){continue;}
|
||||
if(!("launch_cmd" in providers[key])){continue;}
|
||||
if(!("preview_cmd" in providers[key])){continue;}
|
||||
if(!("purge_cmd" in providers[key])){providers[key]["purge_cmd"] = "exit 0";}
|
||||
for (entry in providers[key]){
|
||||
gsub(/[\x27,\047]/,"\x27\"\x27\"\x27", providers[key][entry])
|
||||
}
|
||||
print "PROVIDERS[\x27" key "\x27]=\x27" providers[key]["list_cmd"] "\034" providers[key]["preview_cmd"] "\034" providers[key]["launch_cmd"] "\034" providers[key]["purge_cmd"] "\x27\n"
|
||||
}
|
||||
}' "${PROVIDERS_FILE}")"
|
||||
if [[ ! -v HIST_FILE ]]; then
|
||||
HIST_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/${0##*/}-${PROVIDERS_FILE##*/}-history.txt"
|
||||
fi
|
||||
else
|
||||
PROVIDERS['desktop']="${0} list-entries${DEL}${0} describe-desktop \"{1}\"${DEL}${0} run-desktop '{1}' {2}${DEL}test -f '{1}' || exit 43"
|
||||
PROVIDERS['command']="${0} list-commands${DEL}${0} describe-command \"{1}\"${DEL}${TERMINAL_COMMAND} {1}${DEL}command -v '{1}' || exit 43"
|
||||
if [[ ! -v HIST_FILE ]]; then
|
||||
HIST_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/${0##*/}-history.txt"
|
||||
fi
|
||||
fi
|
||||
PROVIDERS['user']="exit${DEL}exit${DEL}{1}" # Fallback provider that simply executes the exact command if there were no matches
|
||||
|
||||
if [[ -n "${HIST_FILE}" ]]; then
|
||||
mkdir -p "${HIST_FILE%/*}" && touch "$HIST_FILE"
|
||||
readarray HIST_LINES <"$HIST_FILE"
|
||||
fi
|
||||
|
||||
function describe() {
|
||||
# shellcheck disable=SC2086
|
||||
readarray -d ${DEL} -t PROVIDER_ARGS <<<${PROVIDERS[${1}]}
|
||||
# shellcheck disable=SC2086
|
||||
[ -n "${PROVIDER_ARGS[1]}" ] && eval "${PROVIDER_ARGS[1]//\{1\}/${2}}"
|
||||
}
|
||||
function describe-desktop() {
|
||||
description=$(sed -ne '/^Comment=/{s/^Comment=//;p;q}' "$1")
|
||||
echo -e "\033[33m$(sed -ne '/^Name=/{s/^Name=//;p;q}' "$1")\033[0m"
|
||||
echo "${description:-No description}"
|
||||
}
|
||||
function describe-command() {
|
||||
readarray arr < <(whatis -l "$1" 2>/dev/null)
|
||||
description="${arr[0]}"
|
||||
description="${description#* - }"
|
||||
echo -e "\033[33m${1}\033[0m"
|
||||
echo "${description:-No description}"
|
||||
}
|
||||
|
||||
function provide() {
|
||||
# shellcheck disable=SC2086
|
||||
readarray -d ${DEL} -t PROVIDER_ARGS <<<${PROVIDERS[$1]}
|
||||
eval "${PROVIDER_ARGS[0]}"
|
||||
}
|
||||
function list-commands() {
|
||||
IFS=: read -ra path <<<"$PATH"
|
||||
for dir in "${path[@]}"; do
|
||||
printf '%s\n' "$dir/"* |
|
||||
awk -F / -v pre="$GLYPH_COMMAND" '{print $NF "\034command\034\033[31m" pre "\033[0m" $NF;}'
|
||||
done | sort -u
|
||||
}
|
||||
function list-entries() {
|
||||
# Get locations of desktop application folders according to spec
|
||||
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
IFS=':' read -ra DIRS <<<"${XDG_DATA_HOME-${HOME}/.local/share}:${XDG_DATA_DIRS-/usr/local/share:/usr/share}"
|
||||
for i in "${!DIRS[@]}"; do
|
||||
if [[ ! -d "${DIRS[i]}" ]]; then
|
||||
unset -v 'DIRS[$i]'
|
||||
else
|
||||
DIRS[$i]="${DIRS[i]}/applications/**/*.desktop"
|
||||
fi
|
||||
done
|
||||
# shellcheck disable=SC2068
|
||||
entries ${DIRS[@]}
|
||||
}
|
||||
function entries() {
|
||||
# shellcheck disable=SC2068
|
||||
awk -v pre="$GLYPH_DESKTOP" -F= '
|
||||
function desktopFileID(filename){
|
||||
sub("^.*applications/", "", filename);
|
||||
sub("/", "-", filename);
|
||||
return filename
|
||||
}
|
||||
BEGINFILE{
|
||||
application=0;
|
||||
hidden=0;
|
||||
block="";
|
||||
a=0
|
||||
|
||||
id=desktopFileID(FILENAME)
|
||||
if(id in fileIds){
|
||||
nextfile;
|
||||
}else{
|
||||
fileIds[id]=0
|
||||
}
|
||||
}
|
||||
/^\[Desktop Entry\]/{block="entry"}
|
||||
/^Type=Application/{application=1}
|
||||
/^\[Desktop Action/{
|
||||
sub("^\\[Desktop Action ", "");
|
||||
sub("\\]$", "");
|
||||
block="action";
|
||||
a++;
|
||||
actions[a,"key"]=$0
|
||||
}
|
||||
/^\[X-/{
|
||||
sub("^\\[X-", "");
|
||||
sub("\\]$", "");
|
||||
block="action";
|
||||
a++;
|
||||
actions[a,"key"]=$0
|
||||
}
|
||||
/^Name=/{ (block=="action")? actions[a,"name"]=$2 : name=$2 }
|
||||
/^NoDisplay=true/{ (block=="action")? actions[a,"hidden"]=1 : hidden=1 }
|
||||
ENDFILE{
|
||||
if (application){
|
||||
if (!hidden)
|
||||
print FILENAME "\034desktop\034\033[33m" pre name "\033[0m";
|
||||
if (a>0)
|
||||
for (i=1; i<=a; i++)
|
||||
if (!actions[i, "hidden"])
|
||||
print FILENAME "\034desktop\034\033[33m" pre name "\033[0m (" actions[i, "name"] ")\034" actions[i, "key"]
|
||||
}
|
||||
}' \
|
||||
$@ </dev/null
|
||||
# the empty stdin is needed in case no *.desktop files
|
||||
}
|
||||
function run-desktop() {
|
||||
CMD="$("${0}" generate-command "$@" 2>&3)"
|
||||
echo "Generated Launch command from .desktop file: ${CMD}" >&3
|
||||
eval "${CMD}"
|
||||
}
|
||||
function generate-command() {
|
||||
# Define the search pattern that specifies the block to search for within the .desktop file
|
||||
PATTERN="^\\\\[Desktop Entry\\\\]"
|
||||
if [[ -n $2 ]]; then
|
||||
PATTERN="^\\\\[Desktop Action ${2}\\\\]"
|
||||
fi
|
||||
echo "Searching for pattern: ${PATTERN}" >&3
|
||||
# 1. We see a line starting [Desktop, but we're already searching: deactivate search again
|
||||
# 2. We see the specified pattern: start search
|
||||
# 3. We see an Exec= line during search: remove field codes and set variable
|
||||
# 3. We see a Path= line during search: set variable
|
||||
# 4. Finally, build command line
|
||||
awk -v pattern="${PATTERN}" -v terminal_cmd="${TERMINAL_COMMAND}" -F= '
|
||||
BEGIN{a=0;exec=0;path=0}
|
||||
/^\[Desktop/{
|
||||
if(a){ a=0 }
|
||||
}
|
||||
$0 ~ pattern{ a=1 }
|
||||
/^Terminal=/{
|
||||
sub("^Terminal=", "");
|
||||
if ($0 == "true") { terminal=1 }
|
||||
}
|
||||
/^Exec=/{
|
||||
if(a && !exec){
|
||||
sub("^Exec=", "");
|
||||
gsub(" ?%[cDdFfikmNnUuv]", "");
|
||||
exec=$0;
|
||||
}
|
||||
}
|
||||
/^Path=/{
|
||||
if(a && !path){ path=$2 }
|
||||
}
|
||||
END{
|
||||
if(path){ printf "cd " path " && " }
|
||||
printf "exec "
|
||||
if (terminal){ printf terminal_cmd " " }
|
||||
print exec
|
||||
}' "$1"
|
||||
}
|
||||
|
||||
function shouldAutostart() {
|
||||
local condition="$(cat $1 | grep "AutostartCondition" | cut -d'=' -f2)"
|
||||
local filename="${XDG_CONFIG_HOME-${HOME}/.config}/${condition#* }"
|
||||
case $condition in
|
||||
if-exists*)
|
||||
[[ -e $filename ]]
|
||||
;;
|
||||
unless-exists*)
|
||||
[[ ! -e $filename ]]
|
||||
;;
|
||||
*)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
function autostart() {
|
||||
for application in $(list-autostart); do
|
||||
if shouldAutostart "$application" ; then
|
||||
(exec setsid /bin/sh -c "$(run-desktop "${application}")" &>/dev/null &)
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function list-autostart() {
|
||||
# Get locations of desktop application folders according to spec
|
||||
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
IFS=':' read -ra DIRS <<<"${XDG_CONFIG_HOME-${HOME}/.config}:${XDG_CONFIG_DIRS-/etc/xdg}"
|
||||
for i in "${!DIRS[@]}"; do
|
||||
if [[ ! -d "${DIRS[i]}" ]]; then
|
||||
unset -v 'DIRS[$i]'
|
||||
else
|
||||
DIRS[$i]="${DIRS[i]}/autostart/*.desktop"
|
||||
fi
|
||||
done
|
||||
|
||||
# shellcheck disable=SC2068
|
||||
awk -v pre="$GLYPH_DESKTOP" -F= '
|
||||
function desktopFileID(filename){
|
||||
sub("^.*autostart/", "", filename);
|
||||
sub("/", "-", filename);
|
||||
return filename
|
||||
}
|
||||
BEGINFILE{
|
||||
application=0;
|
||||
block="";
|
||||
disabled=0;
|
||||
a=0
|
||||
|
||||
id=desktopFileID(FILENAME)
|
||||
if(id in fileIds){
|
||||
nextfile;
|
||||
}else{
|
||||
fileIds[id]=0
|
||||
}
|
||||
}
|
||||
/^\[Desktop Entry\]/{block="entry"}
|
||||
/^Type=Application/{application=1}
|
||||
/^Name=/{ iname=$2 }
|
||||
/^Hidden=true/{disabled=1}
|
||||
ENDFILE{
|
||||
if (application && !disabled){
|
||||
print FILENAME;
|
||||
}
|
||||
}' \
|
||||
${DIRS[@]} </dev/null
|
||||
}
|
||||
|
||||
purge() {
|
||||
# shellcheck disable=SC2188
|
||||
> "${HIST_FILE}"
|
||||
declare -A PURGE_CMDS
|
||||
for PROVIDER_NAME in "${!PROVIDERS[@]}"; do
|
||||
readarray -td ${DEL} PROVIDER_ARGS <<<${PROVIDERS[${PROVIDER_NAME}]}
|
||||
PURGE_CMD=${PROVIDER_ARGS[3]}
|
||||
[ -z "${PURGE_CMD}" ] && PURGE_CMD='test -f "{1}" || exit 43'
|
||||
PURGE_CMDS[$PROVIDER_NAME]="${PURGE_CMD%$'\n'}"
|
||||
done
|
||||
for HIST_LINE in "${HIST_LINES[@]#*' '}"; do
|
||||
readarray -td $'\034' HIST_ENTRY <<<${HIST_LINE}
|
||||
ENTRY=${HIST_ENTRY[1]}
|
||||
readarray -td ' ' FILTER <<<${PURGE_CMDS[$ENTRY]//\{1\}/${HIST_ENTRY[0]}}
|
||||
(eval "${FILTER[@]}" 1>/dev/null) # Run filter command discarding output. We only want the exit status
|
||||
if [[ $? -ne 43 ]]; then
|
||||
echo "1 ${HIST_LINE[@]%$'\n'}" >> "${HIST_FILE}"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
describe | describe-desktop | describe-command | entries | list-entries | list-commands | list-autostart | generate-command | autostart | run-desktop | provide | purge)
|
||||
"$@"
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
echo "Starting launcher instance with the following providers:" "${!PROVIDERS[@]}" >&3
|
||||
|
||||
FZFPIPE=$(mktemp -u)
|
||||
mkfifo "$FZFPIPE"
|
||||
trap 'rm "$FZFPIPE"' EXIT INT
|
||||
|
||||
# Append Launcher History, removing usage count
|
||||
(printf '%s' "${HIST_LINES[@]#* }" >>"$FZFPIPE") &
|
||||
|
||||
# Iterate over providers and run their list-command
|
||||
for PROVIDER_NAME in "${!PROVIDERS[@]}"; do
|
||||
(bash -c "${0} provide ${PROVIDER_NAME}" >>"$FZFPIPE") &
|
||||
done
|
||||
|
||||
readarray -t COMMAND_STR <<<$(
|
||||
fzf --ansi +s -x -d '\034' --nth ..3 --with-nth 3 \
|
||||
--print-query \
|
||||
--preview "$0 describe {2} {1}" \
|
||||
--preview-window=up:2:noborder \
|
||||
--no-multi --cycle \
|
||||
--prompt="${GLYPH_PROMPT-# }" \
|
||||
--header='' --no-info --margin='1,2' \
|
||||
--color='16,gutter:-1' \
|
||||
<"$FZFPIPE"
|
||||
) || exit 1
|
||||
# Get the last line of the fzf output. If there were no matches, it contains the query which we'll treat as a custom command
|
||||
# If there were matches, it contains the selected item
|
||||
COMMAND_STR=$(printf '%s\n' "${COMMAND_STR[@]: -1}")
|
||||
# We still need to format the query to conform to our fallback provider.
|
||||
# We check for the presence of field separator character to determine if we're dealing with a custom command
|
||||
if [[ $COMMAND_STR != *$'\034'* ]]; then
|
||||
COMMAND_STR="${COMMAND_STR}"$'\034user\034'"${COMMAND_STR}"$'\034'
|
||||
SKIP_HIST=1 # I chose not to include custom commands in the history. If this is a bad idea, open an issue please
|
||||
fi
|
||||
|
||||
[ -z "$COMMAND_STR" ] && exit 1
|
||||
|
||||
if [[ -n "${HIST_FILE}" && ! "$SKIP_HIST" ]]; then
|
||||
# update history
|
||||
for i in "${!HIST_LINES[@]}"; do
|
||||
if [[ "${HIST_LINES[i]}" == *" $COMMAND_STR"$'\n' ]]; then
|
||||
HIST_COUNT=${HIST_LINES[i]%% *}
|
||||
HIST_LINES[$i]="$((HIST_COUNT + 1)) $COMMAND_STR"$'\n'
|
||||
match=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
if ! ((match)); then
|
||||
HIST_LINES+=("1 $COMMAND_STR"$'\n')
|
||||
fi
|
||||
|
||||
printf '%s' "${HIST_LINES[@]}" | sort -nr >"$HIST_FILE"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
readarray -d $'\034' -t PARAMS <<<${COMMAND_STR}
|
||||
# shellcheck disable=SC2086
|
||||
readarray -d ${DEL} -t PROVIDER_ARGS <<<${PROVIDERS[${PARAMS[1]}]}
|
||||
# Substitute {1}, {2} etc with the correct values
|
||||
COMMAND=${PROVIDER_ARGS[2]//\{1\}/${PARAMS[0]}}
|
||||
COMMAND=${COMMAND//\{2\}/${PARAMS[3]}}
|
||||
COMMAND=${COMMAND%%[[:space:]]}
|
||||
|
||||
if [ -t 1 ]; then
|
||||
echo "Launching command: ${COMMAND}" >&3
|
||||
setsid /bin/sh -c "${COMMAND}" >&/dev/null </dev/null &
|
||||
sleep 0.01
|
||||
else
|
||||
echo "${COMMAND}"
|
||||
fi
|
||||
Reference in New Issue
Block a user