From: Tucker Johnson Date: Sun, 1 Jun 2025 15:23:00 +0000 (-0400) Subject: re-struct 2 X-Git-Url: https://git.newer.systems/?a=commitdiff_plain;h=f10ab6e7811dac85cc67162b3ca3812d58417e92;p=dmenu.git re-struct 2 --- diff --git a/Makefile b/Makefile index 4522e49..5ae2dcc 100644 --- a/Makefile +++ b/Makefile @@ -42,18 +42,24 @@ dist: clean install: all mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run stest dmenu-scripts/* $(DESTDIR)$(PREFIX)/bin + cp -f dmenu stest extras/dmenu-scripts/* $(DESTDIR)$(PREFIX)/bin + cp -fr extras/chars $(DESTDIR)$(LIBPREFIX)/TuCLS/ chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run chmod 755 $(DESTDIR)$(PREFIX)/bin/stest chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-displayselect chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-handler + chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-kampv + chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-maimpick chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-mountcifs + chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-mounter + chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-umounter chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-pass - chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-unicode - chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-kampv + chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-record chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-streamselect + chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-sysact + chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-unicode mkdir -p $(DESTDIR)$(MANPREFIX)/man1 sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1 diff --git a/config.mk b/config.mk index 8531fb9..d24f9d0 100644 --- a/config.mk +++ b/config.mk @@ -4,6 +4,7 @@ VERSION = 5.0 # paths PREFIX = /usr/local MANPREFIX = $(PREFIX)/share/man +LIBPREFIX = /usr/lib X11INC = /usr/X11R6/include X11LIB = /usr/X11R6/lib diff --git a/dmenu b/dmenu deleted file mode 100755 index ef88f8b..0000000 Binary files a/dmenu and /dev/null differ diff --git a/dmenu-scripts/dm-displayselect b/dmenu-scripts/dm-displayselect deleted file mode 100755 index 0227a32..0000000 --- a/dmenu-scripts/dm-displayselect +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh - -# A UI for detecting and selecting all displays. Probes xrandr for connected -# displays and lets user select one to use. User may also select "manual -# selection" which opens arandr. - -twoscreen() { # If multi-monitor is selected and there are two screens. - - mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?") - # Mirror displays using native resolution of external display and a scaled - # version for the internal display - if [ "$mirror" = "yes" ]; then - external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:") - internal=$(echo "$screens" | grep -v "$external") - - res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \ - tail -n 1 | awk '{print $1}') - res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \ - tail -n 1 | awk '{print $1}') - - res_ext_x=$(echo "$res_external" | sed 's/x.*//') - res_ext_y=$(echo "$res_external" | sed 's/.*x//') - res_int_x=$(echo "$res_internal" | sed 's/x.*//') - res_int_y=$(echo "$res_internal" | sed 's/.*x//') - - scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l) - scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l) - - xrandr --output "$external" --auto --scale 1.0x1.0 \ - --output "$internal" --auto --same-as "$external" \ - --scale "$scale_x"x"$scale_y" - else - - primary=$(echo "$screens" | dmenu -i -p "Select primary display:") - secondary=$(echo "$screens" | grep -v "$primary") - direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") - xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0 - fi - } - -morescreen() { # If multi-monitor is selected and there are more than two screens. - primary=$(echo "$screens" | dmenu -i -p "Select primary display:") - secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:") - direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") - tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:") - xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto - } - -multimon() { # Multi-monitor handler. - case "$(echo "$screens" | wc -l)" in - 2) twoscreen ;; - *) morescreen ;; - esac ;} - -onescreen() { # If only one output available or chosen. - xrandr --output "$1" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "\b$1" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -) - } - -postrun() { # Stuff to run to clean up. - setbg # Fix background if screen size/arangement has changed. - { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen - } - -# Get all possible displays -allposs=$(xrandr -q | grep "connected") - -# Get all connected screens. -screens=$(echo "$allposs" | awk '/ connected/ {print $1}') - -# If there's only one screen -[ "$(echo "$screens" | wc -l)" -lt 2 ] && - { onescreen "$screens"; postrun; notify-send "💻 Only one screen detected." "Using it in its optimal settings..."; exit ;} - -# Get user choice including multi-monitor and manual selection: -chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") && -case "$chosen" in - "manual selection") arandr ; exit ;; - "multi-monitor") multimon ;; - *) onescreen "$chosen" ;; -esac - -postrun diff --git a/dmenu-scripts/dm-handler b/dmenu-scripts/dm-handler deleted file mode 100755 index e50178a..0000000 --- a/dmenu-scripts/dm-handler +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -# Feed this script a link and it will give dmenu -# some choice programs to use to open it. -feed="${1:-$(true | dmenu -p 'Paste URL or file path')}" - -case "$(printf "copy url\\nnsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | dmenu -i -p "Open it with?")" in - "copy url") echo "$feed" | xclip -selection clipboard ;; - mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;; - "mpv loop") setsid -f mpv -quiet --loop "$feed" >/dev/null 2>&1 ;; - "mpv float") setsid -f "$TERMINAL" -e mpv --geometry=+0-0 --autofit=30% --title="mpvfloat" "$feed" >/dev/null 2>&1 ;; - "queue yt-dlp") qndl "$feed" >/dev/null 2>&1 ;; - "queue yt-dlp audio") qndl "$feed" 'yt-dlp -o "%(title)s.%(ext)s" -f bestaudio --embed-metadata --restrict-filenames' ;; - "queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;; - PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; - nsxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && nsxiv -a "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; - vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; - setbg) curl -L "$feed" > $XDG_CACHE_HOME/pic ; xwallpaper --zoom $XDG_CACHE_HOME/pic >/dev/null 2>&1 ;; - browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;; - lynx) lynx "$feed" >/dev/null 2>&1 ;; -esac diff --git a/dmenu-scripts/dm-kampv b/dmenu-scripts/dm-kampv deleted file mode 100755 index e7fd782..0000000 --- a/dmenu-scripts/dm-kampv +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -killall mpv diff --git a/dmenu-scripts/dm-maimpick b/dmenu-scripts/dm-maimpick deleted file mode 100755 index 5de26c1..0000000 --- a/dmenu-scripts/dm-maimpick +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -# This is bound to Shift+PrintScreen by default, requires maim. It lets you -# choose the kind of screenshot to take, including copying the image or even -# highlighting an area to copy. scrotcucks on suicidewatch right now. - -# variables -output="$(date '+%y%m%d-%H%M-%S').png" -xclip_cmd="xclip -sel clip -t image/png" - -case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in - "a selected area") maim -u -s pic-selected-"${output}" ;; - "current window") maim -q -d 0.2 -i "$(xdotool getactivewindow)" pic-window-"${output}" ;; - "full screen") maim -q -d 0.2 pic-full-"${output}" ;; - "a selected area (copy)") maim -u -s | ${xclip_cmd} ;; - "current window (copy)") maim -q -d 0.2 -i "$(xdotool getactivewindow)" | ${xclip_cmd} ;; - "full screen (copy)") maim -q -d 0.2 | ${xclip_cmd} ;; -esac diff --git a/dmenu-scripts/dm-mountcifs b/dmenu-scripts/dm-mountcifs deleted file mode 100755 index 46c2b57..0000000 --- a/dmenu-scripts/dm-mountcifs +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -# Gives a dmenu prompt to mount unmounted local NAS shares for read/write. -# Requirements - "%wheel ALL=(ALL) NOPASSWD: ALL" -# -# Browse for mDNS/DNS-SD services using the Avahi daemon... -srvname=$(avahi-browse _smb._tcp -t | awk '{print $4}' | dmenu -i -p "Which NAS?") || exit 1 -notify-send "Searching for network shares..." "Please wait..." -# Choose share disk... -share=$(smbclient -L "$srvname" -N | grep Disk | awk '{print $1}' | dmenu -i -p "Mount which share?") || exit 1 -# Format URL... -share2mnt=//"$srvname".local/"$share" - -sharemount() { - mounted=$(mount -v | grep "$share2mnt") || ([ ! -d /mnt/"$share" ] && sudo mkdir /mnt/"$share") - [ -z "$mounted" ] && sudo mount -t cifs "$share2mnt" -o user=nobody,password="",noperm /mnt/"$share" && notify-send "Netshare $share mounted" && exit 0 - notify-send "Netshare $share already mounted"; exit 1 -} - -sharemount diff --git a/dmenu-scripts/dm-mounter b/dmenu-scripts/dm-mounter deleted file mode 100755 index 3459b1a..0000000 --- a/dmenu-scripts/dm-mounter +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash - -# Mounts Android Phones and USB drives (encrypted or not). - -IFS=' -' -# Function for escaping cell-phone names. -escape(){ echo "$@" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g" ;} - -# Check for phones. -phones="$(simple-mtpfs -l 2>/dev/null | sed "s/^/📱/")" -mountedphones="$(grep "simple-mtpfs" /etc/mtab)" -# If there are already mounted phones, remove them from the list of mountables. -[ -n "$mountedphones" ] && phones="$(for phone in $phones; do - for mounted in $mountedphones; do - escphone="$(escape "$phone")" - [[ "$mounted" =~ "$escphone" ]] && break 1 - done && continue 1 - echo "$phone" -done)" - -# Check for drives. -lsblkoutput="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,fstype")" -# Get all LUKS drives -allluks="$(echo "$lsblkoutput" | grep crypto_LUKS)" -# Get a list of the LUKS drive UUIDs already decrypted. -decrypted="$(find /dev/disk/by-id/dm-uuid-CRYPT-LUKS2-* | sed "s|.*LUKS2-||;s|-.*||")" -# Functioning for formatting drives correctly for dmenu: -filter() { sed "s/ /:/g" | awk -F':' '$7==""{printf "%s%s (%s) %s\n",$1,$3,$5,$6}' ; } - -# Get only LUKS drives that are not decrypted. -unopenedluks="$(for drive in $allluks; do - uuid="${drive%% *}" - uuid="${uuid//-}" # This is a bashism. - [ -n "$decrypted" ] && for open in $decrypted; do - [ "$uuid" = "$open" ] && break 1 - done && continue 1 - echo "🔒 $drive" -done | filter)" - -# Get all normal, non-encrypted or decrypted partitions that are not mounted. -normalparts="$(echo "$lsblkoutput"| grep -v crypto_LUKS | grep 'part\|rom\|crypt' | sed "s/^/💾 /" | filter )" - -# Add all to one variable. If no mountable drives found, exit. -alldrives="$(echo "$phones -$unopenedluks -$normalparts" | sed "/^$/d;s/ *$//")" - -# Quit the script if a sequential command fails. -set -e - -test -n "$alldrives" - -# Feed all found drives to dmenu and get user choice. -chosen="$(echo "$alldrives" | dmenu -p "Mount which drive?" -i)" - -# Function for prompting user for a mountpoint. -getmount(){ - mp="$(find /mnt /media /mount /home -maxdepth 1 -type d 2>/dev/null | dmenu -i -p "Mount this drive where?")" - test -n "$mp" - if [ ! -d "$mp" ]; then - mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") - [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp") - fi -} - -attemptmount(){ - # Attempt to mount without a mountpoint, to see if drive is in fstab. - sudo -A mount "$chosen" || return 1 - notify-send "💾Drive Mounted." "$chosen mounted." - exit -} - -case "$chosen" in - 💾*) - chosen="${chosen%% *}" - chosen="${chosen:1}" # This is a bashism. - parttype="$(echo "$lsblkoutput" | grep "$chosen")" - attemptmount || getmount - case "${parttype##* }" in - vfat) sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000 ;; - btrfs) sudo -A mount "$chosen" "$mp" ;; - *) sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)" ;; - esac - notify-send "💾Drive Mounted." "$chosen mounted to $mp." - ;; - - 🔒*) - chosen="${chosen%% *}" - chosen="${chosen:1}" # This is a bashism. - # Number the drive. - while true; do - [ -f "/dev/mapper/usb$num" ] || break - num="$(printf "%02d" "$((num +1))")" - done - - # Decrypt in a terminal window - ${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$chosen" "usb$num" - # Check if now decrypted. - test -b "/dev/mapper/usb$num" - - attemptmount || getmount - sudo -A mount "/dev/mapper/usb$num" "$mp" -o uid="$(id -u)",gid="$(id -g)" - notify-send "🔓Decrypted drive Mounted." "$chosen decrypted and mounted to $mp." - ;; - - 📱*) - notify-send "❗Note" "Remember to allow file access on your phone now." - getmount - number="${chosen%%:*}" - number="${chosen:1}" # This is a bashism. - sudo -A simple-mtpfs -o allow_other -o fsname="simple-mtpfs-$(escape "$chosen")" --device "$number" "$mp" - notify-send "🤖 Android Mounted." "Android device mounted to $mp." - ;; -esac diff --git a/dmenu-scripts/dm-pass b/dmenu-scripts/dm-pass deleted file mode 100755 index 2c14e6f..0000000 --- a/dmenu-scripts/dm-pass +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -# This script is the SUDO_ASKPASS variable, meaning that it will be used as a -# password prompt if needed. - -dmenu -fn Monospace-18 -P -p "$1" <&- && echo diff --git a/dmenu-scripts/dm-record b/dmenu-scripts/dm-record deleted file mode 100755 index ca6b011..0000000 --- a/dmenu-scripts/dm-record +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/sh - -# Usage: -# `$0`: Ask for recording type via dmenu -# `$0 screencast`: Record both audio and screen -# `$0 video`: Record only screen -# `$0 audio`: Record only audio -# `$0 kill`: Kill existing recording -# -# If there is already a running instance, user will be prompted to end it. - -getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' ' ;} - -updateicon() { \ - echo "$1" > /tmp/recordingicon - pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" - } - -killrecording() { - recpid="$(cat /tmp/recordingpid)" - kill -15 "$recpid" - rm -f /tmp/recordingpid - updateicon "" - pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" - } - -screencast() { \ - ffmpeg -y \ - -f x11grab \ - -framerate 30 \ - -s "$(getdim)" \ - -i "$DISPLAY" \ - -r 24 \ - -use_wallclock_as_timestamps 1 \ - -f alsa -thread_queue_size 1024 -i default \ - -c:v h264 \ - -crf 0 -preset ultrafast -c:a aac \ - "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" & - echo $! > /tmp/recordingpid - updateicon "⏺️🎙️" - } - -video() { ffmpeg \ - -f x11grab \ - -framerate 30 \ - -s "$(getdim)" \ - -i "$DISPLAY" \ - -c:v libx264 -qp 0 -r 30 \ - "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" & - echo $! > /tmp/recordingpid - updateicon "⏺️" - } - -webcamhidef() { ffmpeg \ - -f v4l2 \ - -i /dev/video0 \ - -video_size 1920x1080 \ - "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & - echo $! > /tmp/recordingpid - updateicon "🎥" - } - -webcam() { ffmpeg \ - -f v4l2 \ - -i /dev/video0 \ - -video_size 640x480 \ - "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & - echo $! > /tmp/recordingpid - updateicon "🎥" - } - - -audio() { \ - ffmpeg \ - -f alsa -i default \ - -c:a flac \ - "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" & - echo $! > /tmp/recordingpid - updateicon "🎙️" - } - -askrecording() { \ - choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:") - case "$choice" in - screencast) screencast;; - audio) audio;; - video) video;; - *selected) videoselected;; - webcam) webcam;; - "webcam (hi-def)") webcamhidef;; - esac - } - -asktoend() { \ - response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") && - [ "$response" = "Yes" ] && killrecording - } - -videoselected() -{ - slop -f "%x %y %w %h" > /tmp/slop - read -r X Y W H < /tmp/slop - rm /tmp/slop - - ffmpeg \ - -f x11grab \ - -framerate 30 \ - -video_size "$W"x"$H" \ - -i :0.0+"$X,$Y" \ - -c:v libx264 -qp 0 -r 30 \ - "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" & - echo $! > /tmp/recordingpid - updateicon "⏺️" -} - -case "$1" in - screencast) screencast;; - audio) audio;; - video) video;; - *selected) videoselected;; - kill) killrecording;; - *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;; -esac diff --git a/dmenu-scripts/dm-streamselect b/dmenu-scripts/dm-streamselect deleted file mode 100755 index ee78286..0000000 --- a/dmenu-scripts/dm-streamselect +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -streamList=" -WXXI Classical (Rochester Classical Radio) link:https://22213.live.streamtheworld.com/WXXIFM.mp3 -Classical WSMR (Tampa Classical Radio) https://worldradiomap.com/us-fl/play/wsmr_live -" - -selected=$(echo "$streamList" | grep -P "^$(echo "$streamList" | grep "https:" | sed 's/link:.*//g' | dmenu -i -p "Select a Stream" -l 20 | awk '{print $1}')\s") - -echo "$selected" | sed 's/.*link://' | xargs -r mpv --no-video --terminal=no diff --git a/dmenu-scripts/dm-sysact b/dmenu-scripts/dm-sysact deleted file mode 100755 index 148c1e6..0000000 --- a/dmenu-scripts/dm-sysact +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -# A dmenu wrapper script for system functions. -export WM="dwm" -case "$(readlink -f /sbin/init)" in - *systemd*) ctl='systemctl' ;; - *) ctl='loginctl' ;; -esac - -wmpid(){ # This function is needed if there are multiple instances of the window manager. - tree="$(pstree -ps $$)" - tree="${tree#*$WM(}" - echo "${tree%%)*}" -} - -case "$(printf " lock\n leave $WM\n renew $WM\n hibernate\n reboot\n shutdown\n sleep\n display off" | dmenu -i -p 'Action: ')" in - ' lock') slock ;; - " leave $WM") kill -TERM "$(wmpid)" ;; - " renew $WM") kill -HUP "$(wmpid)" ;; - ' hibernate') slock $ctl hibernate -i ;; - ' sleep') slock $ctl suspend -i ;; - ' reboot') $ctl reboot -i ;; - ' shutdown') $ctl poweroff -i ;; - ' display off') xset dpms force off ;; - *) exit 1 ;; -esac diff --git a/dmenu-scripts/dm-umounter b/dmenu-scripts/dm-umounter deleted file mode 100755 index 7f1dbf5..0000000 --- a/dmenu-scripts/dm-umounter +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# Unmount USB drives or Android phones. Replaces the older `dmenuumount`. Fewer -# prompt and also de-decrypts LUKS drives that are unmounted. - -set -e - -mounteddroids="$(grep simple-mtpfs /etc/mtab | awk '{print "📱" $2}')" -lsblkoutput="$(lsblk -nrpo "name,type,size,mountpoint")" -mounteddrives="$(echo "$lsblkoutput" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "💾%s (%s)\n",$4,$3}')" - -allunmountable="$(echo "$mounteddroids -$mounteddrives" | sed "/^$/d;s/ *$//")" -test -n "$allunmountable" - -chosen="$(echo "$allunmountable" | dmenu -i -p "Unmount which drive?")" -chosen="${chosen%% *}" -test -n "$chosen" - -sudo -A umount -l "/${chosen#*/}" -notify-send "Device unmounted." "$chosen has been unmounted." - -# Close the chosen drive if decrypted. -cryptid="$(echo "$lsblkoutput" | grep "/${chosen#*/}$")" -cryptid="${cryptid%% *}" -test -b /dev/mapper/"${cryptid##*/}" -sudo -A cryptsetup close "$cryptid" -notify-send "🔒Device dencryption closed." "Drive is now securely locked again." diff --git a/dmenu-scripts/dm-unicode b/dmenu-scripts/dm-unicode deleted file mode 100755 index 9ae9245..0000000 --- a/dmenu-scripts/dm-unicode +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -# Get user selection via dmenu from emoji file. -chosen=$(cut -d ';' -f1 ~/.local/share/larbs/chars/* | dmenu -i -l 30 | sed "s/ .*//") - -# Exit if none chosen. -[ -z "$chosen" ] && exit - -# If you run this command with an argument, it will automatically insert the -# character. Otherwise, show a message that the emoji has been copied. -if [ -n "$1" ]; then - xdotool type "$chosen" -else - printf "%s" "$chosen" | xclip -selection clipboard - notify-send "'$chosen' copied to clipboard." & -fi diff --git a/dmenu.o b/dmenu.o deleted file mode 100644 index c63a80d..0000000 Binary files a/dmenu.o and /dev/null differ diff --git a/dmenu_path b/dmenu_path deleted file mode 100755 index 3a7cda7..0000000 --- a/dmenu_path +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" -cache="$cachedir/dmenu_run" - -[ ! -e "$cachedir" ] && mkdir -p "$cachedir" - -IFS=: -if stest -dqr -n "$cache" $PATH; then - stest -flx $PATH | sort -u | tee "$cache" -else - cat "$cache" -fi diff --git a/dmenu_run b/dmenu_run deleted file mode 100755 index 834ede5..0000000 --- a/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/drw.o b/drw.o deleted file mode 100644 index 5e706f3..0000000 Binary files a/drw.o and /dev/null differ diff --git a/extras/chars/emoji b/extras/chars/emoji new file mode 100644 index 0000000..6803731 --- /dev/null +++ b/extras/chars/emoji @@ -0,0 +1,1630 @@ +😀 grinning face +😃 grinning face with big eyes +😄 grinning face with smiling eyes +😁 beaming face with smiling eyes +😆 grinning squinting face +😅 grinning face with sweat +🤣 rolling on the floor laughing +😂 face with tears of joy +🙂 slightly smiling face +🙃 upside-down face +🫠 melting face +😉 winking face +😊 smiling face with smiling eyes +😇 smiling face with halo +🥰 smiling face with hearts +😍 smiling face with heart-eyes +🤩 star-struck +😘 face blowing a kiss +😗 kissing face +☺️ smiling face +😚 kissing face with closed eyes +😙 kissing face with smiling eyes +🥲 smiling face with tear +😋 face savoring food +😛 face with tongue +😜 winking face with tongue +🤪 zany face +😝 squinting face with tongue +🤑 money-mouth face +🤗 smiling face with open hands +🤭 face with hand over mouth +🫢 face with open eyes and hand over mouth +🫣 face with peeking eye +🤫 shushing face +🤔 thinking face +🫡 saluting face +🤐 zipper-mouth face +🤨 face with raised eyebrow +😐 neutral face +😑 expressionless face +😶 face without mouth +🫥 dotted line face +😏 smirking face +😒 unamused face +🙄 face with rolling eyes +😬 grimacing face +🤥 lying face +😌 relieved face +😔 pensive face +😪 sleepy face +🤤 drooling face +😴 sleeping face +😷 face with medical mask +🤒 face with thermometer +🤕 face with head-bandage +🤢 nauseated face +🤮 face vomiting +🤧 sneezing face +🥵 hot face +🥶 cold face +🥴 woozy face +😵 face with crossed-out eyes +🤯 exploding head +🤠 cowboy hat face +🥳 partying face +🥸 disguised face +😎 smiling face with sunglasses +🤓 nerd face +🧐 face with monocle +😕 confused face +🫤 face with diagonal mouth +😟 worried face +🙁 slightly frowning face +☹️ frowning face +😮 face with open mouth +😯 hushed face +😲 astonished face +😳 flushed face +🥺 pleading face +🥹 face holding back tears +😦 frowning face with open mouth +😧 anguished face +😨 fearful face +😰 anxious face with sweat +😥 sad but relieved face +😢 crying face +😭 loudly crying face +😱 face screaming in fear +😖 confounded face +😣 persevering face +😞 disappointed face +😓 downcast face with sweat +😩 weary face +😫 tired face +🥱 yawning face +😤 face with steam from nose +😡 pouting face +😠 angry face +🤬 face with symbols on mouth +😈 smiling face with horns +👿 angry face with horns +💀 skull +☠️ skull and crossbones +💩 pile of poo +🤡 clown face +👹 ogre +👺 goblin +👻 ghost +👽 alien +👾 alien monster +🤖 robot +😺 grinning cat +😸 grinning cat with smiling eyes +😹 cat with tears of joy +😻 smiling cat with heart-eyes +😼 cat with wry smile +😽 kissing cat +🙀 weary cat +😿 crying cat +😾 pouting cat +🙈 see-no-evil monkey +🙉 hear-no-evil monkey +🙊 speak-no-evil monkey +💋 kiss mark +💌 love letter +💘 heart with arrow +💝 heart with ribbon +💖 sparkling heart +💗 growing heart +💓 beating heart +💞 revolving hearts +💕 two hearts +💟 heart decoration +❣️ heart exclamation +💔 broken heart +❤️ red heart +🧡 orange heart +💛 yellow heart +💚 green heart +💙 blue heart +💜 purple heart +🤎 brown heart +🖤 black heart +🤍 white heart +💯 hundred points +💢 anger symbol +💥 collision +💫 dizzy +💦 sweat droplets +💨 dashing away +🕳️ hole +💣 bomb +💬 speech balloon +🗨️ left speech bubble +🗯️ right anger bubble +💭 thought balloon +💤 zzz +👋 waving hand +🤚 raised back of hand +🖐️ hand with fingers splayed +✋ raised hand +🖖 vulcan salute +🫱 rightwards hand +🫲 leftwards hand +🫳 palm down hand +🫴 palm up hand +👌 OK hand +🤌 pinched fingers +🤏 pinching hand +✌️ victory hand +🤞 crossed fingers +🫰 hand with index finger and thumb crossed +🤟 love-you gesture +🤘 sign of the horns +🤙 call me hand +👈 backhand index pointing left +👉 backhand index pointing right +👆 backhand index pointing up +🖕 middle finger +👇 backhand index pointing down +☝️ index pointing up +🫵 index pointing at the viewer +👍 thumbs up +👎 thumbs down +✊ raised fist +👊 oncoming fist +🤛 left-facing fist +🤜 right-facing fist +👏 clapping hands +🙌 raising hands +🫶 heart hands +👐 open hands +🤲 palms up together +🤝 handshake +🙏 folded hands +✍️ writing hand +💅 nail polish +🤳 selfie +💪 flexed biceps +🦾 mechanical arm +🦿 mechanical leg +🦵 leg +🦶 foot +👂 ear +🦻 ear with hearing aid +👃 nose +🧠 brain +🫀 anatomical heart +🫁 lungs +🦷 tooth +🦴 bone +👀 eyes +👁️ eye +👅 tongue +👄 mouth +🫦 biting lip +👶 baby +🧒 child +👦 boy +👧 girl +🧑 person +👱 person: blond hair +👨 man +🧔 person: beard +👩 woman +🧓 older person +👴 old man +👵 old woman +🙍 person frowning +🙎 person pouting +🙅 person gesturing NO +🙆 person gesturing OK +💁 person tipping hand +🙋 person raising hand +🧏 deaf person +🙇 person bowing +🤦 person facepalming +🤷 person shrugging +👮 police officer +🕵️ detective +💂 guard +🥷 ninja +👷 construction worker +🫅 person with crown +🤴 prince +👸 princess +👳 person wearing turban +👲 person with skullcap +🧕 woman with headscarf +🤵 person in tuxedo +👰 person with veil +🤰 pregnant woman +🫃 pregnant man +🫄 pregnant person +🤱 breast-feeding +👼 baby angel +🎅 Santa Claus +🤶 Mrs. Claus +🦸 superhero +🦹 supervillain +🧙 mage +🧚 fairy +🧛 vampire +🧜 merperson +🧝 elf +🧞 genie +🧟 zombie +🧌 troll +💆 person getting massage +💇 person getting haircut +🚶 person walking +🧍 person standing +🧎 person kneeling +🏃 person running +💃 woman dancing +🕺 man dancing +🕴️ person in suit levitating +👯 people with bunny ears +🧖 person in steamy room +🧗 person climbing +🤺 person fencing +🏇 horse racing +⛷️ skier +🏂 snowboarder +🏌️ person golfing +🏄 person surfing +🚣 person rowing boat +🏊 person swimming +⛹️ person bouncing ball +🏋️ person lifting weights +🚴 person biking +🚵 person mountain biking +🤸 person cartwheeling +🤼 people wrestling +🤽 person playing water polo +🤾 person playing handball +🤹 person juggling +🧘 person in lotus position +🛀 person taking bath +🛌 person in bed +👭 women holding hands +👫 woman and man holding hands +👬 men holding hands +💏 kiss +💑 couple with heart +👪 family +🗣️ speaking head +👤 bust in silhouette +👥 busts in silhouette +🫂 people hugging +👣 footprints +🐵 monkey face +🐒 monkey +🦍 gorilla +🦧 orangutan +🐶 dog face +🐕 dog +🦮 guide dog +🐩 poodle +🐺 wolf +🦊 fox +🦝 raccoon +🐱 cat face +🐈 cat +🦁 lion +🐯 tiger face +🐅 tiger +🐆 leopard +🐴 horse face +🐎 horse +🦄 unicorn +🦓 zebra +🦌 deer +🦬 bison +🐮 cow face +🐂 ox +🐃 water buffalo +🐄 cow +🐷 pig face +🐖 pig +🐗 boar +🐽 pig nose +🐏 ram +🐑 ewe +🐐 goat +🐪 camel +🐫 two-hump camel +🦙 llama +🦒 giraffe +🐘 elephant +🦣 mammoth +🦏 rhinoceros +🦛 hippopotamus +🐭 mouse face +🐁 mouse +🐀 rat +🐹 hamster +🐰 rabbit face +🐇 rabbit +🐿️ chipmunk +🦫 beaver +🦔 hedgehog +🦇 bat +🐻 bear +🐨 koala +🐼 panda +🦥 sloth +🦦 otter +🦨 skunk +🦘 kangaroo +🦡 badger +🐾 paw prints +🦃 turkey +🐔 chicken +🐓 rooster +🐣 hatching chick +🐤 baby chick +🐥 front-facing baby chick +🐦 bird +🐧 penguin +🕊️ dove +🦅 eagle +🦆 duck +🦢 swan +🦉 owl +🦤 dodo +🪶 feather +🦩 flamingo +🦚 peacock +🦜 parrot +🐸 frog +🐊 crocodile +🐢 turtle +🦎 lizard +🐍 snake +🐲 dragon face +🐉 dragon +🦕 sauropod +🦖 T-Rex +🐳 spouting whale +🐋 whale +🐬 dolphin +🦭 seal +🐟 fish +🐠 tropical fish +🐡 blowfish +🦈 shark +🐙 octopus +🐚 spiral shell +🪸 coral +🐌 snail +🦋 butterfly +🐛 bug +🐜 ant +🐝 honeybee +🪲 beetle +🐞 lady beetle +🦗 cricket +🪳 cockroach +🕷️ spider +🕸️ spider web +🦂 scorpion +🦟 mosquito +🪰 fly +🪱 worm +🦠 microbe +💐 bouquet +🌸 cherry blossom +💮 white flower +🪷 lotus +🏵️ rosette +🌹 rose +🥀 wilted flower +🌺 hibiscus +🌻 sunflower +🌼 blossom +🌷 tulip +🌱 seedling +🪴 potted plant +🌲 evergreen tree +🌳 deciduous tree +🌴 palm tree +🌵 cactus +🌾 sheaf of rice +🌿 herb +☘️ shamrock +🍀 four leaf clover +🍁 maple leaf +🍂 fallen leaf +🍃 leaf fluttering in wind +🪹 empty nest +🪺 nest with eggs +🍇 grapes +🍈 melon +🍉 watermelon +🍊 tangerine +🍋 lemon +🍌 banana +🍍 pineapple +🥭 mango +🍎 red apple +🍏 green apple +🍐 pear +🍑 peach +🍒 cherries +🍓 strawberry +🫐 blueberries +🥝 kiwi fruit +🍅 tomato +🫒 olive +🥥 coconut +🥑 avocado +🍆 eggplant +🥔 potato +🥕 carrot +🌽 ear of corn +🌶️ hot pepper +🫑 bell pepper +🥒 cucumber +🥬 leafy green +🥦 broccoli +🧄 garlic +🧅 onion +🍄 mushroom +🥜 peanuts +🫘 beans +🌰 chestnut +🍞 bread +🥐 croissant +🥖 baguette bread +🫓 flatbread +🥨 pretzel +🥯 bagel +🥞 pancakes +🧇 waffle +🧀 cheese wedge +🍖 meat on bone +🍗 poultry leg +🥩 cut of meat +🥓 bacon +🍔 hamburger +🍟 french fries +🍕 pizza +🌭 hot dog +🥪 sandwich +🌮 taco +🌯 burrito +🫔 tamale +🥙 stuffed flatbread +🧆 falafel +🥚 egg +🍳 cooking +🥘 shallow pan of food +🍲 pot of food +🫕 fondue +🥣 bowl with spoon +🥗 green salad +🍿 popcorn +🧈 butter +🧂 salt +🥫 canned food +🍱 bento box +🍘 rice cracker +🍙 rice ball +🍚 cooked rice +🍛 curry rice +🍜 steaming bowl +🍝 spaghetti +🍠 roasted sweet potato +🍢 oden +🍣 sushi +🍤 fried shrimp +🍥 fish cake with swirl +🥮 moon cake +🍡 dango +🥟 dumpling +🥠 fortune cookie +🥡 takeout box +🦀 crab +🦞 lobster +🦐 shrimp +🦑 squid +🦪 oyster +🍦 soft ice cream +🍧 shaved ice +🍨 ice cream +🍩 doughnut +🍪 cookie +🎂 birthday cake +🍰 shortcake +🧁 cupcake +🥧 pie +🍫 chocolate bar +🍬 candy +🍭 lollipop +🍮 custard +🍯 honey pot +🍼 baby bottle +🥛 glass of milk +☕ hot beverage +🫖 teapot +🍵 teacup without handle +🍶 sake +🍾 bottle with popping cork +🍷 wine glass +🍸 cocktail glass +🍹 tropical drink +🍺 beer mug +🍻 clinking beer mugs +🥂 clinking glasses +🥃 tumbler glass +🫗 pouring liquid +🥤 cup with straw +🧋 bubble tea +🧃 beverage box +🧉 mate +🧊 ice +🥢 chopsticks +🍽️ fork and knife with plate +🍴 fork and knife +🥄 spoon +🔪 kitchen knife +🫙 jar +🏺 amphora +🌍 globe showing Europe-Africa +🌎 globe showing Americas +🌏 globe showing Asia-Australia +🌐 globe with meridians +🗺️ world map +🗾 map of Japan +🧭 compass +🏔️ snow-capped mountain +⛰️ mountain +🌋 volcano +🗻 mount fuji +🏕️ camping +🏖️ beach with umbrella +🏜️ desert +🏝️ desert island +🏞️ national park +🏟️ stadium +🏛️ classical building +🏗️ building construction +🧱 brick +🪨 rock +🪵 wood +🛖 hut +🏘️ houses +🏚️ derelict house +🏠 house +🏡 house with garden +🏢 office building +🏣 Japanese post office +🏤 post office +🏥 hospital +🏦 bank +🏨 hotel +🏩 love hotel +🏪 convenience store +🏫 school +🏬 department store +🏭 factory +🏯 Japanese castle +🏰 castle +💒 wedding +🗼 Tokyo tower +🗽 Statue of Liberty +⛪ church +🕌 mosque +🛕 hindu temple +🕍 synagogue +⛩️ shinto shrine +🕋 kaaba +⛲ fountain +⛺ tent +🌁 foggy +🌃 night with stars +🏙️ cityscape +🌄 sunrise over mountains +🌅 sunrise +🌆 cityscape at dusk +🌇 sunset +🌉 bridge at night +♨️ hot springs +🎠 carousel horse +🛝 playground slide +🎡 ferris wheel +🎢 roller coaster +💈 barber pole +🎪 circus tent +🚂 locomotive +🚃 railway car +🚄 high-speed train +🚅 bullet train +🚆 train +🚇 metro +🚈 light rail +🚉 station +🚊 tram +🚝 monorail +🚞 mountain railway +🚋 tram car +🚌 bus +🚍 oncoming bus +🚎 trolleybus +🚐 minibus +🚑 ambulance +🚒 fire engine +🚓 police car +🚔 oncoming police car +🚕 taxi +🚖 oncoming taxi +🚗 automobile +🚘 oncoming automobile +🚙 sport utility vehicle +🛻 pickup truck +🚚 delivery truck +🚛 articulated lorry +🚜 tractor +🏎️ racing car +🏍️ motorcycle +🛵 motor scooter +🦽 manual wheelchair +🦼 motorized wheelchair +🛺 auto rickshaw +🚲 bicycle +🛴 kick scooter +🛹 skateboard +🛼 roller skate +🚏 bus stop +🛣️ motorway +🛤️ railway track +🛢️ oil drum +⛽ fuel pump +🛞 wheel +🚨 police car light +🚥 horizontal traffic light +🚦 vertical traffic light +🛑 stop sign +🚧 construction +⚓ anchor +🛟 ring buoy +⛵ sailboat +🛶 canoe +🚤 speedboat +🛳️ passenger ship +⛴️ ferry +🛥️ motor boat +🚢 ship +✈️ airplane +🛩️ small airplane +🛫 airplane departure +🛬 airplane arrival +🪂 parachute +💺 seat +🚁 helicopter +🚟 suspension railway +🚠 mountain cableway +🚡 aerial tramway +🛰️ satellite +🚀 rocket +🛸 flying saucer +🛎️ bellhop bell +🧳 luggage +⌛ hourglass done +⏳ hourglass not done +⌚ watch +⏰ alarm clock +⏱️ stopwatch +⏲️ timer clock +🕰️ mantelpiece clock +🕛 twelve o’clock +🕧 twelve-thirty +🕐 one o’clock +🕜 one-thirty +🕑 two o’clock +🕝 two-thirty +🕒 three o’clock +🕞 three-thirty +🕓 four o’clock +🕟 four-thirty +🕔 five o’clock +🕠 five-thirty +🕕 six o’clock +🕡 six-thirty +🕖 seven o’clock +🕢 seven-thirty +🕗 eight o’clock +🕣 eight-thirty +🕘 nine o’clock +🕤 nine-thirty +🕙 ten o’clock +🕥 ten-thirty +🕚 eleven o’clock +🕦 eleven-thirty +🌑 new moon +🌒 waxing crescent moon +🌓 first quarter moon +🌔 waxing gibbous moon +🌕 full moon +🌖 waning gibbous moon +🌗 last quarter moon +🌘 waning crescent moon +🌙 crescent moon +🌚 new moon face +🌛 first quarter moon face +🌜 last quarter moon face +🌡️ thermometer +☀️ sun +🌝 full moon face +🌞 sun with face +🪐 ringed planet +⭐ star +🌟 glowing star +🌠 shooting star +🌌 milky way +☁️ cloud +⛅ sun behind cloud +⛈️ cloud with lightning and rain +🌤️ sun behind small cloud +🌥️ sun behind large cloud +🌦️ sun behind rain cloud +🌧️ cloud with rain +🌨️ cloud with snow +🌩️ cloud with lightning +🌪️ tornado +🌫️ fog +🌬️ wind face +🌀 cyclone +🌈 rainbow +🌂 closed umbrella +☂️ umbrella +☔ umbrella with rain drops +⛱️ umbrella on ground +⚡ high voltage +❄️ snowflake +☃️ snowman +⛄ snowman without snow +☄️ comet +🔥 fire +💧 droplet +🌊 water wave +🎃 jack-o-lantern +🎄 Christmas tree +🎆 fireworks +🎇 sparkler +🧨 firecracker +✨ sparkles +🎈 balloon +🎉 party popper +🎊 confetti ball +🎋 tanabata tree +🎍 pine decoration +🎎 Japanese dolls +🎏 carp streamer +🎐 wind chime +🎑 moon viewing ceremony +🧧 red envelope +🎀 ribbon +🎁 wrapped gift +🎗️ reminder ribbon +🎟️ admission tickets +🎫 ticket +🎖️ military medal +🏆 trophy +🏅 sports medal +🥇 1st place medal +🥈 2nd place medal +🥉 3rd place medal +⚽ soccer ball +⚾ baseball +🥎 softball +🏀 basketball +🏐 volleyball +🏈 american football +🏉 rugby football +🎾 tennis +🥏 flying disc +🎳 bowling +🏏 cricket game +🏑 field hockey +🏒 ice hockey +🥍 lacrosse +🏓 ping pong +🏸 badminton +🥊 boxing glove +🥋 martial arts uniform +🥅 goal net +⛳ flag in hole +⛸️ ice skate +🎣 fishing pole +🤿 diving mask +🎽 running shirt +🎿 skis +🛷 sled +🥌 curling stone +🎯 bullseye +🪀 yo-yo +🪁 kite +🎱 pool 8 ball +🔮 crystal ball +🪄 magic wand +🧿 nazar amulet +🪬 hamsa +🎮 video game +🕹️ joystick +🎰 slot machine +🎲 game die +🧩 puzzle piece +🧸 teddy bear +🪅 piñata +🪩 mirror ball +🪆 nesting dolls +♠️ spade suit +♥️ heart suit +♦️ diamond suit +♣️ club suit +♟️ chess pawn +🃏 joker +🀄 mahjong red dragon +🎴 flower playing cards +🎭 performing arts +🖼️ framed picture +🎨 artist palette +🧵 thread +🪡 sewing needle +🧶 yarn +🪢 knot +👓 glasses +🕶️ sunglasses +🥽 goggles +🥼 lab coat +🦺 safety vest +👔 necktie +👕 t-shirt +👖 jeans +🧣 scarf +🧤 gloves +🧥 coat +🧦 socks +👗 dress +👘 kimono +🥻 sari +🩱 one-piece swimsuit +🩲 briefs +🩳 shorts +👙 bikini +👚 woman’s clothes +👛 purse +👜 handbag +👝 clutch bag +🛍️ shopping bags +🎒 backpack +🩴 thong sandal +👞 man’s shoe +👟 running shoe +🥾 hiking boot +🥿 flat shoe +👠 high-heeled shoe +👡 woman’s sandal +🩰 ballet shoes +👢 woman’s boot +👑 crown +👒 woman’s hat +🎩 top hat +🎓 graduation cap +🧢 billed cap +🪖 military helmet +⛑️ rescue worker’s helmet +📿 prayer beads +💄 lipstick +💍 ring +💎 gem stone +🔇 muted speaker +🔈 speaker low volume +🔉 speaker medium volume +🔊 speaker high volume +📢 loudspeaker +📣 megaphone +📯 postal horn +🔔 bell +🔕 bell with slash +🎼 musical score +🎵 musical note +🎶 musical notes +🎙️ studio microphone +🎚️ level slider +🎛️ control knobs +🎤 microphone +🎧 headphone +📻 radio +🎷 saxophone +🪗 accordion +🎸 guitar +🎹 musical keyboard +🎺 trumpet +🎻 violin +🪕 banjo +🥁 drum +🪘 long drum +📱 mobile phone +📲 mobile phone with arrow +☎️ telephone +📞 telephone receiver +📟 pager +📠 fax machine +🔋 battery +🪫 low battery +🔌 electric plug +💻 laptop +🖥️ desktop computer +🖨️ printer +⌨️ keyboard +🖱️ computer mouse +🖲️ trackball +💽 computer disk +💾 floppy disk +💿 optical disk +📀 dvd +🧮 abacus +🎥 movie camera +🎞️ film frames +📽️ film projector +🎬 clapper board +📺 television +📷 camera +📸 camera with flash +📹 video camera +📼 videocassette +🔍 magnifying glass tilted left +🔎 magnifying glass tilted right +🕯️ candle +💡 light bulb +🔦 flashlight +🏮 red paper lantern +🪔 diya lamp +📔 notebook with decorative cover +📕 closed book +📖 open book +📗 green book +📘 blue book +📙 orange book +📚 books +📓 notebook +📒 ledger +📃 page with curl +📜 scroll +📄 page facing up +📰 newspaper +🗞️ rolled-up newspaper +📑 bookmark tabs +🔖 bookmark +🏷️ label +💰 money bag +🪙 coin +💴 yen banknote +💵 dollar banknote +💶 euro banknote +💷 pound banknote +💸 money with wings +💳 credit card +🧾 receipt +💹 chart increasing with yen +✉️ envelope +📧 e-mail +📨 incoming envelope +📩 envelope with arrow +📤 outbox tray +📥 inbox tray +📦 package +📫 closed mailbox with raised flag +📪 closed mailbox with lowered flag +📬 open mailbox with raised flag +📭 open mailbox with lowered flag +📮 postbox +🗳️ ballot box with ballot +✏️ pencil +✒️ black nib +🖋️ fountain pen +🖊️ pen +🖌️ paintbrush +🖍️ crayon +📝 memo +💼 briefcase +📁 file folder +📂 open file folder +🗂️ card index dividers +📅 calendar +📆 tear-off calendar +🗒️ spiral notepad +🗓️ spiral calendar +📇 card index +📈 chart increasing +📉 chart decreasing +📊 bar chart +📋 clipboard +📌 pushpin +📍 round pushpin +📎 paperclip +🖇️ linked paperclips +📏 straight ruler +📐 triangular ruler +✂️ scissors +🗃️ card file box +🗄️ file cabinet +🗑️ wastebasket +🔒 locked +🔓 unlocked +🔏 locked with pen +🔐 locked with key +🔑 key +🗝️ old key +🔨 hammer +🪓 axe +⛏️ pick +⚒️ hammer and pick +🛠️ hammer and wrench +🗡️ dagger +⚔️ crossed swords +🔫 water pistol +🪃 boomerang +🏹 bow and arrow +🛡️ shield +🪚 carpentry saw +🔧 wrench +🪛 screwdriver +🔩 nut and bolt +⚙️ gear +🗜️ clamp +⚖️ balance scale +🦯 white cane +🔗 link +⛓️ chains +🪝 hook +🧰 toolbox +🧲 magnet +🪜 ladder +⚗️ alembic +🧪 test tube +🧫 petri dish +🧬 dna +🔬 microscope +🔭 telescope +📡 satellite antenna +💉 syringe +🩸 drop of blood +💊 pill +🩹 adhesive bandage +🩼 crutch +🩺 stethoscope +🩻 x-ray +🚪 door +🛗 elevator +🪞 mirror +🪟 window +🛏️ bed +🛋️ couch and lamp +🪑 chair +🚽 toilet +🪠 plunger +🚿 shower +🛁 bathtub +🪤 mouse trap +🪒 razor +🧴 lotion bottle +🧷 safety pin +🧹 broom +🧺 basket +🧻 roll of paper +🪣 bucket +🧼 soap +🫧 bubbles +🪥 toothbrush +🧽 sponge +🧯 fire extinguisher +🛒 shopping cart +🚬 cigarette +⚰️ coffin +🪦 headstone +⚱️ funeral urn +🗿 moai +🪧 placard +🪪 identification card +🏧 ATM sign +🚮 litter in bin sign +🚰 potable water +♿ wheelchair symbol +🚹 men’s room +🚺 women’s room +🚻 restroom +🚼 baby symbol +🚾 water closet +🛂 passport control +🛃 customs +🛄 baggage claim +🛅 left luggage +⚠️ warning +🚸 children crossing +⛔ no entry +🚫 prohibited +🚳 no bicycles +🚭 no smoking +🚯 no littering +🚱 non-potable water +🚷 no pedestrians +📵 no mobile phones +🔞 no one under eighteen +☢️ radioactive +☣️ biohazard +⬆️ up arrow +↗️ up-right arrow +➡️ right arrow +↘️ down-right arrow +⬇️ down arrow +↙️ down-left arrow +⬅️ left arrow +↖️ up-left arrow +↕️ up-down arrow +↔️ left-right arrow +↩️ right arrow curving left +↪️ left arrow curving right +⤴️ right arrow curving up +⤵️ right arrow curving down +🔃 clockwise vertical arrows +🔄 counterclockwise arrows button +🔙 BACK arrow +🔚 END arrow +🔛 ON! arrow +🔜 SOON arrow +🔝 TOP arrow +🛐 place of worship +⚛️ atom symbol +🕉️ om +✡️ star of David +☸️ wheel of dharma +☯️ yin yang +✝️ latin cross +☦️ orthodox cross +☪️ star and crescent +☮️ peace symbol +🕎 menorah +🔯 dotted six-pointed star +♈ Aries +♉ Taurus +♊ Gemini +♋ Cancer +♌ Leo +♍ Virgo +♎ Libra +♏ Scorpio +♐ Sagittarius +♑ Capricorn +♒ Aquarius +♓ Pisces +⛎ Ophiuchus +🔀 shuffle tracks button +🔁 repeat button +🔂 repeat single button +▶️ play button +⏩ fast-forward button +⏭️ next track button +⏯️ play or pause button +◀️ reverse button +⏪ fast reverse button +⏮️ last track button +🔼 upwards button +⏫ fast up button +🔽 downwards button +⏬ fast down button +⏸️ pause button +⏹️ stop button +⏺️ record button +⏏️ eject button +🎦 cinema +🔅 dim button +🔆 bright button +📶 antenna bars +📳 vibration mode +📴 mobile phone off +♀️ female sign +♂️ male sign +⚧️ transgender symbol +✖️ multiply +➕ plus +➖ minus +➗ divide +🟰 heavy equals sign +♾️ infinity +‼️ double exclamation mark +⁉️ exclamation question mark +❓ red question mark +❔ white question mark +❕ white exclamation mark +❗ red exclamation mark +〰️ wavy dash +💱 currency exchange +💲 heavy dollar sign +⚕️ medical symbol +♻️ recycling symbol +⚜️ fleur-de-lis +🔱 trident emblem +📛 name badge +🔰 Japanese symbol for beginner +⭕ hollow red circle +✅ check mark button +☑️ check box with check +✔️ check mark +❌ cross mark +❎ cross mark button +➰ curly loop +➿ double curly loop +〽️ part alternation mark +✳️ eight-spoked asterisk +✴️ eight-pointed star +❇️ sparkle +©️ copyright +®️ registered +™️ trade mark +#️⃣ keycap: # +*️⃣ keycap: * +0️⃣ keycap: 0 +1️⃣ keycap: 1 +2️⃣ keycap: 2 +3️⃣ keycap: 3 +4️⃣ keycap: 4 +5️⃣ keycap: 5 +6️⃣ keycap: 6 +7️⃣ keycap: 7 +8️⃣ keycap: 8 +9️⃣ keycap: 9 +🔟 keycap: 10 +🔠 input latin uppercase +🔡 input latin lowercase +🔢 input numbers +🔣 input symbols +🔤 input latin letters +🅰️ A button (blood type) +🆎 AB button (blood type) +🅱️ B button (blood type) +🆑 CL button +🆒 COOL button +🆓 FREE button +ℹ️ information +🆔 ID button +Ⓜ️ circled M +🆕 NEW button +🆖 NG button +🅾️ O button (blood type) +🆗 OK button +🅿️ P button +🆘 SOS button +🆙 UP! button +🆚 VS button +🈁 Japanese “here” button +🈂️ Japanese “service charge” button +🈷️ Japanese “monthly amount” button +🈶 Japanese “not free of charge” button +🈯 Japanese “reserved” button +🉐 Japanese “bargain” button +🈹 Japanese “discount” button +🈚 Japanese “free of charge” button +🈲 Japanese “prohibited” button +🉑 Japanese “acceptable” button +🈸 Japanese “application” button +🈴 Japanese “passing grade” button +🈳 Japanese “vacancy” button +㊗️ Japanese “congratulations” button +㊙️ Japanese “secret” button +🈺 Japanese “open for business” button +🈵 Japanese “no vacancy” button +🔴 red circle +🟠 orange circle +🟡 yellow circle +🟢 green circle +🔵 blue circle +🟣 purple circle +🟤 brown circle +⚫ black circle +⚪ white circle +🟥 red square +🟧 orange square +🟨 yellow square +🟩 green square +🟦 blue square +🟪 purple square +🟫 brown square +⬛ black large square +⬜ white large square +◼️ black medium square +◻️ white medium square +◾ black medium-small square +◽ white medium-small square +▪️ black small square +▫️ white small square +🔶 large orange diamond +🔷 large blue diamond +🔸 small orange diamond +🔹 small blue diamond +🔺 red triangle pointed up +🔻 red triangle pointed down +💠 diamond with a dot +🔘 radio button +🔳 white square button +🔲 black square button +🏁 chequered flag +🚩 triangular flag +🎌 crossed flags +🏴 black flag +🏳️ white flag +🇦🇨 flag: Ascension Island +🇦🇩 flag: Andorra +🇦🇪 flag: United Arab Emirates +🇦🇫 flag: Afghanistan +🇦🇬 flag: Antigua & Barbuda +🇦🇮 flag: Anguilla +🇦🇱 flag: Albania +🇦🇲 flag: Armenia +🇦🇴 flag: Angola +🇦🇶 flag: Antarctica +🇦🇷 flag: Argentina +🇦🇸 flag: American Samoa +🇦🇹 flag: Austria +🇦🇺 flag: Australia +🇦🇼 flag: Aruba +🇦🇽 flag: Åland Islands +🇦🇿 flag: Azerbaijan +🇧🇦 flag: Bosnia & Herzegovina +🇧🇧 flag: Barbados +🇧🇩 flag: Bangladesh +🇧🇪 flag: Belgium +🇧🇫 flag: Burkina Faso +🇧🇬 flag: Bulgaria +🇧🇭 flag: Bahrain +🇧🇮 flag: Burundi +🇧🇯 flag: Benin +🇧🇱 flag: St. Barthélemy +🇧🇲 flag: Bermuda +🇧🇳 flag: Brunei +🇧🇴 flag: Bolivia +🇧🇶 flag: Caribbean Netherlands +🇧🇷 flag: Brazil +🇧🇸 flag: Bahamas +🇧🇹 flag: Bhutan +🇧🇻 flag: Bouvet Island +🇧🇼 flag: Botswana +🇧🇾 flag: Belarus +🇧🇿 flag: Belize +🇨🇦 flag: Canada +🇨🇨 flag: Cocos (Keeling) Islands +🇨🇩 flag: Congo - Kinshasa +🇨🇫 flag: Central African Republic +🇨🇬 flag: Congo - Brazzaville +🇨🇭 flag: Switzerland +🇨🇮 flag: Côte d’Ivoire +🇨🇰 flag: Cook Islands +🇨🇱 flag: Chile +🇨🇲 flag: Cameroon +🇨🇳 flag: China +🇨🇴 flag: Colombia +🇨🇵 flag: Clipperton Island +🇨🇷 flag: Costa Rica +🇨🇺 flag: Cuba +🇨🇻 flag: Cape Verde +🇨🇼 flag: Curaçao +🇨🇽 flag: Christmas Island +🇨🇾 flag: Cyprus +🇨🇿 flag: Czechia +🇩🇪 flag: Germany +🇩🇬 flag: Diego Garcia +🇩🇯 flag: Djibouti +🇩🇰 flag: Denmark +🇩🇲 flag: Dominica +🇩🇴 flag: Dominican Republic +🇩🇿 flag: Algeria +🇪🇦 flag: Ceuta & Melilla +🇪🇨 flag: Ecuador +🇪🇪 flag: Estonia +🇪🇬 flag: Egypt +🇪🇭 flag: Western Sahara +🇪🇷 flag: Eritrea +🇪🇸 flag: Spain +🇪🇹 flag: Ethiopia +🇪🇺 flag: European Union +🇫🇮 flag: Finland +🇫🇯 flag: Fiji +🇫🇰 flag: Falkland Islands +🇫🇲 flag: Micronesia +🇫🇴 flag: Faroe Islands +🇫🇷 flag: France +🇬🇦 flag: Gabon +🇬🇧 flag: United Kingdom +🇬🇩 flag: Grenada +🇬🇪 flag: Georgia +🇬🇫 flag: French Guiana +🇬🇬 flag: Guernsey +🇬🇭 flag: Ghana +🇬🇮 flag: Gibraltar +🇬🇱 flag: Greenland +🇬🇲 flag: Gambia +🇬🇳 flag: Guinea +🇬🇵 flag: Guadeloupe +🇬🇶 flag: Equatorial Guinea +🇬🇷 flag: Greece +🇬🇸 flag: South Georgia & South Sandwich Islands +🇬🇹 flag: Guatemala +🇬🇺 flag: Guam +🇬🇼 flag: Guinea-Bissau +🇬🇾 flag: Guyana +🇭🇰 flag: Hong Kong SAR China +🇭🇲 flag: Heard & McDonald Islands +🇭🇳 flag: Honduras +🇭🇷 flag: Croatia +🇭🇹 flag: Haiti +🇭🇺 flag: Hungary +🇮🇨 flag: Canary Islands +🇮🇩 flag: Indonesia +🇮🇪 flag: Ireland +🇮🇱 flag: Israel +🇮🇲 flag: Isle of Man +🇮🇳 flag: India +🇮🇴 flag: British Indian Ocean Territory +🇮🇶 flag: Iraq +🇮🇷 flag: Iran +🇮🇸 flag: Iceland +🇮🇹 flag: Italy +🇯🇪 flag: Jersey +🇯🇲 flag: Jamaica +🇯🇴 flag: Jordan +🇯🇵 flag: Japan +🇰🇪 flag: Kenya +🇰🇬 flag: Kyrgyzstan +🇰🇭 flag: Cambodia +🇰🇮 flag: Kiribati +🇰🇲 flag: Comoros +🇰🇳 flag: St. Kitts & Nevis +🇰🇵 flag: North Korea +🇰🇷 flag: South Korea +🇰🇼 flag: Kuwait +🇰🇾 flag: Cayman Islands +🇰🇿 flag: Kazakhstan +🇱🇦 flag: Laos +🇱🇧 flag: Lebanon +🇱🇨 flag: St. Lucia +🇱🇮 flag: Liechtenstein +🇱🇰 flag: Sri Lanka +🇱🇷 flag: Liberia +🇱🇸 flag: Lesotho +🇱🇹 flag: Lithuania +🇱🇺 flag: Luxembourg +🇱🇻 flag: Latvia +🇱🇾 flag: Libya +🇲🇦 flag: Morocco +🇲🇨 flag: Monaco +🇲🇩 flag: Moldova +🇲🇪 flag: Montenegro +🇲🇫 flag: St. Martin +🇲🇬 flag: Madagascar +🇲🇭 flag: Marshall Islands +🇲🇰 flag: North Macedonia +🇲🇱 flag: Mali +🇲🇲 flag: Myanmar (Burma) +🇲🇳 flag: Mongolia +🇲🇴 flag: Macao SAR China +🇲🇵 flag: Northern Mariana Islands +🇲🇶 flag: Martinique +🇲🇷 flag: Mauritania +🇲🇸 flag: Montserrat +🇲🇹 flag: Malta +🇲🇺 flag: Mauritius +🇲🇻 flag: Maldives +🇲🇼 flag: Malawi +🇲🇽 flag: Mexico +🇲🇾 flag: Malaysia +🇲🇿 flag: Mozambique +🇳🇦 flag: Namibia +🇳🇨 flag: New Caledonia +🇳🇪 flag: Niger +🇳🇫 flag: Norfolk Island +🇳🇬 flag: Nigeria +🇳🇮 flag: Nicaragua +🇳🇱 flag: Netherlands +🇳🇴 flag: Norway +🇳🇵 flag: Nepal +🇳🇷 flag: Nauru +🇳🇺 flag: Niue +🇳🇿 flag: New Zealand +🇴🇲 flag: Oman +🇵🇦 flag: Panama +🇵🇪 flag: Peru +🇵🇫 flag: French Polynesia +🇵🇬 flag: Papua New Guinea +🇵🇭 flag: Philippines +🇵🇰 flag: Pakistan +🇵🇱 flag: Poland +🇵🇲 flag: St. Pierre & Miquelon +🇵🇳 flag: Pitcairn Islands +🇵🇷 flag: Puerto Rico +🇵🇸 flag: Palestinian Territories +🇵🇹 flag: Portugal +🇵🇼 flag: Palau +🇵🇾 flag: Paraguay +🇶🇦 flag: Qatar +🇷🇪 flag: Réunion +🇷🇴 flag: Romania +🇷🇸 flag: Serbia +🇷🇺 flag: Russia +🇷🇼 flag: Rwanda +🇸🇦 flag: Saudi Arabia +🇸🇧 flag: Solomon Islands +🇸🇨 flag: Seychelles +🇸🇩 flag: Sudan +🇸🇪 flag: Sweden +🇸🇬 flag: Singapore +🇸🇭 flag: St. Helena +🇸🇮 flag: Slovenia +🇸🇯 flag: Svalbard & Jan Mayen +🇸🇰 flag: Slovakia +🇸🇱 flag: Sierra Leone +🇸🇲 flag: San Marino +🇸🇳 flag: Senegal +🇸🇴 flag: Somalia +🇸🇷 flag: Suriname +🇸🇸 flag: South Sudan +🇸🇹 flag: São Tomé & Príncipe +🇸🇻 flag: El Salvador +🇸🇽 flag: Sint Maarten +🇸🇾 flag: Syria +🇸🇿 flag: Eswatini +🇹🇦 flag: Tristan da Cunha +🇹🇨 flag: Turks & Caicos Islands +🇹🇩 flag: Chad +🇹🇫 flag: French Southern Territories +🇹🇬 flag: Togo +🇹🇭 flag: Thailand +🇹🇯 flag: Tajikistan +🇹🇰 flag: Tokelau +🇹🇱 flag: Timor-Leste +🇹🇲 flag: Turkmenistan +🇹🇳 flag: Tunisia +🇹🇴 flag: Tonga +🇹🇷 flag: Turkey +🇹🇹 flag: Trinidad & Tobago +🇹🇻 flag: Tuvalu +🇹🇼 flag: Taiwan +🇹🇿 flag: Tanzania +🇺🇦 flag: Ukraine +🇺🇬 flag: Uganda +🇺🇲 flag: U.S. Outlying Islands +🇺🇳 flag: United Nations +🇺🇸 flag: United States +🇺🇾 flag: Uruguay +🇺🇿 flag: Uzbekistan +🇻🇦 flag: Vatican City +🇻🇨 flag: St. Vincent & Grenadines +🇻🇪 flag: Venezuela +🇻🇬 flag: British Virgin Islands +🇻🇮 flag: U.S. Virgin Islands +🇻🇳 flag: Vietnam +🇻🇺 flag: Vanuatu +🇼🇫 flag: Wallis & Futuna +🇼🇸 flag: Samoa +🇽🇰 flag: Kosovo +🇾🇪 flag: Yemen +🇾🇹 flag: Mayotte +🇿🇦 flag: South Africa +🇿🇲 flag: Zambia +🇿🇼 flag: Zimbabwe +🏴󠁧󠁢󠁥󠁮󠁧󠁿 flag: England +🏴󠁧󠁢󠁳󠁣󠁴󠁿 flag: Scotland +🏴󠁧󠁢󠁷󠁬󠁳󠁿 flag: Wales diff --git a/extras/chars/font-awesome b/extras/chars/font-awesome new file mode 100644 index 0000000..3283be3 --- /dev/null +++ b/extras/chars/font-awesome @@ -0,0 +1,1456 @@ + 500px; f26e + accessible-icon; f368 + accusoft; f369 + acquisitions-incorporated; f6af + ad; f641 + address-book; f2b9 + address-card; f2bb + adjust; f042 + adn; f170 + adversal; f36a + affiliatetheme; f36b + air-freshener; f5d0 + airbnb; f834 + algolia; f36c + align-center; f037 + align-justify; f039 + align-left; f036 + align-right; f038 + alipay; f642 + allergies; f461 + amazon; f270 + amazon-pay; f42c + ambulance; f0f9 + american-sign-language-interpreting; f2a3 + amilia; f36d + anchor; f13d + android; f17b + angellist; f209 + angle-double-down; f103 + angle-double-left; f100 + angle-double-right; f101 + angle-double-up; f102 + angle-down; f107 + angle-left; f104 + angle-right; f105 + angle-up; f106 + angry; f556 + angrycreative; f36e + angular; f420 + ankh; f644 + app-store; f36f + app-store-ios; f370 + apper; f371 + apple; f179 + apple-alt; f5d1 + apple-pay; f415 + archive; f187 + archway; f557 + arrow-alt-circle-down; f358 + arrow-alt-circle-left; f359 + arrow-alt-circle-right; f35a + arrow-alt-circle-up; f35b + arrow-circle-down; f0ab + arrow-circle-left; f0a8 + arrow-circle-right; f0a9 + arrow-circle-up; f0aa + arrow-down; f063 + arrow-left; f060 + arrow-right; f061 + arrow-up; f062 + arrows-alt; f0b2 + arrows-alt-h; f337 + arrows-alt-v; f338 + artstation; f77a + assistive-listening-systems; f2a2 + asterisk; f069 + asymmetrik; f372 + at; f1fa + atlas; f558 + atlassian; f77b + atom; f5d2 + audible; f373 + audio-description; f29e + autoprefixer; f41c + avianex; f374 + aviato; f421 + award; f559 + aws; f375 + baby; f77c + baby-carriage; f77d + backspace; f55a + backward; f04a + bacon; f7e5 + bacteria e059 + bacterium e05a + bahai; f666 + balance-scale; f24e + balance-scale-left; f515 + balance-scale-right; f516 + ban; f05e + band-aid; f462 + bandcamp; f2d5 + barcode; f02a + bars; f0c9 + baseball-ball; f433 + basketball-ball; f434 + bath; f2cd + battery-empty; f244 + battery-full; f240 + battery-half; f242 + battery-quarter; f243 + battery-three-quarters; f241 + battle-net; f835 + bed; f236 + beer; f0fc + behance; f1b4 + behance-square; f1b5 + bell; f0f3 + bell-slash; f1f6 + bezier-curve; f55b + bible; f647 + bicycle; f206 + biking; f84a + bimobject; f378 + binoculars; f1e5 + biohazard; f780 + birthday-cake; f1fd + bitbucket; f171 + bitcoin; f379 + bity; f37a + black-tie; f27e + blackberry; f37b + blender; f517 + blender-phone; f6b6 + blind; f29d + blog; f781 + blogger; f37c + blogger-b; f37d + bluetooth; f293 + bluetooth-b; f294 + bold; f032 + bolt; f0e7 + bomb; f1e2 + bone; f5d7 + bong; f55c + book; f02d + book-dead; f6b7 + book-medical; f7e6 + book-open; f518 + book-reader; f5da + bookmark; f02e + bootstrap; f836 + border-all; f84c + border-none; f850 + border-style; f853 + bowling-ball; f436 + box; f466 + box-open; f49e + box-tissue e05b + boxes; f468 + braille; f2a1 + brain; f5dc + bread-slice; f7ec + briefcase; f0b1 + briefcase-medical; f469 + broadcast-tower; f519 + broom; f51a + brush; f55d + btc; f15a + buffer; f837 + bug; f188 + building; f1ad + bullhorn; f0a1 + bullseye; f140 + burn; f46a + buromobelexperte; f37f + bus; f207 + bus-alt; f55e + business-time; f64a + buy-n-large; f8a6 + calculator; f1ec + calendar; f133 + calendar-alt; f073 + calendar-check; f274 + calendar-day; f783 + calendar-minus; f272 + calendar-plus; f271 + calendar-times; f273 + calendar-week; f784 + camera; f030 + camera-retro; f083 + campground; f6bb + canadian-maple-leaf; f785 + candy-cane; f786 + cannabis; f55f + capsules; f46b + car; f1b9 + car-alt; f5de + car-battery; f5df + car-crash; f5e1 + car-side; f5e4 + caravan; f8ff + caret-down; f0d7 + caret-left; f0d9 + caret-right; f0da + caret-square-down; f150 + caret-square-left; f191 + caret-square-right; f152 + caret-square-up; f151 + caret-up; f0d8 + carrot; f787 + cart-arrow-down; f218 + cart-plus; f217 + cash-register; f788 + cat; f6be + cc-amazon-pay; f42d + cc-amex; f1f3 + cc-apple-pay; f416 + cc-diners-club; f24c + cc-discover; f1f2 + cc-jcb; f24b + cc-mastercard; f1f1 + cc-paypal; f1f4 + cc-stripe; f1f5 + cc-visa; f1f0 + centercode; f380 + centos; f789 + certificate; f0a3 + chair; f6c0 + chalkboard; f51b + chalkboard-teacher; f51c + charging-station; f5e7 + chart-area; f1fe + chart-bar; f080 + chart-line; f201 + chart-pie; f200 + check; f00c + check-circle; f058 + check-double; f560 + check-square; f14a + cheese; f7ef + chess; f439 + chess-bishop; f43a + chess-board; f43c + chess-king; f43f + chess-knight; f441 + chess-pawn; f443 + chess-queen; f445 + chess-rook; f447 + chevron-circle-down; f13a + chevron-circle-left; f137 + chevron-circle-right; f138 + chevron-circle-up; f139 + chevron-down; f078 + chevron-left; f053 + chevron-right; f054 + chevron-up; f077 + child; f1ae + chrome; f268 + chromecast; f838 + church; f51d + circle; f111 + circle-notch; f1ce + city; f64f + clinic-medical; f7f2 + clipboard; f328 + clipboard-check; f46c + clipboard-list; f46d + clock; f017 + clone; f24d + closed-captioning; f20a + cloud; f0c2 + cloud-download-alt; f381 + cloud-meatball; f73b + cloud-moon; f6c3 + cloud-moon-rain; f73c + cloud-rain; f73d + cloud-showers-heavy; f740 + cloud-sun; f6c4 + cloud-sun-rain; f743 + cloud-upload-alt; f382 + cloudflare e07d + cloudscale; f383 + cloudsmith; f384 + cloudversify; f385 + cocktail; f561 + code; f121 + code-branch; f126 + codepen; f1cb + codiepie; f284 + coffee; f0f4 + cog; f013 + cogs; f085 + coins; f51e + columns; f0db + comment; f075 + comment-alt; f27a + comment-dollar; f651 + comment-dots; f4ad + comment-medical; f7f5 + comment-slash; f4b3 + comments; f086 + comments-dollar; f653 + compact-disc; f51f + compass; f14e + compress; f066 + compress-alt; f422 + compress-arrows-alt; f78c + concierge-bell; f562 + confluence; f78d + connectdevelop; f20e + contao; f26d + cookie; f563 + cookie-bite; f564 + copy; f0c5 + copyright; f1f9 + cotton-bureau; f89e + couch; f4b8 + cpanel; f388 + creative-commons; f25e + creative-commons-by; f4e7 + creative-commons-nc; f4e8 + creative-commons-nc-eu; f4e9 + creative-commons-nc-jp; f4ea + creative-commons-nd; f4eb + creative-commons-pd; f4ec + creative-commons-pd-alt; f4ed + creative-commons-remix; f4ee + creative-commons-sa; f4ef + creative-commons-sampling; f4f0 + creative-commons-sampling-plus; f4f1 + creative-commons-share; f4f2 + creative-commons-zero; f4f3 + credit-card; f09d + critical-role; f6c9 + crop; f125 + crop-alt; f565 + cross; f654 + crosshairs; f05b + crow; f520 + crown; f521 + crutch; f7f7 + css3; f13c + css3-alt; f38b + cube; f1b2 + cubes; f1b3 + cut; f0c4 + cuttlefish; f38c + d-and-d; f38d + d-and-d-beyond; f6ca + dailymotion e052 + dashcube; f210 + database; f1c0 + deaf; f2a4 + deezer e077 + delicious; f1a5 + democrat; f747 + deploydog; f38e + deskpro; f38f + desktop; f108 + dev; f6cc + deviantart; f1bd + dharmachakra; f655 + dhl; f790 + diagnoses; f470 + diaspora; f791 + dice; f522 + dice-d20; f6cf + dice-d6; f6d1 + dice-five; f523 + dice-four; f524 + dice-one; f525 + dice-six; f526 + dice-three; f527 + dice-two; f528 + digg; f1a6 + digital-ocean; f391 + digital-tachograph; f566 + directions; f5eb + discord; f392 + discourse; f393 + disease; f7fa + divide; f529 + dizzy; f567 + dna; f471 + dochub; f394 + docker; f395 + dog; f6d3 + dollar-sign; f155 + dolly; f472 + dolly-flatbed; f474 + donate; f4b9 + door-closed; f52a + door-open; f52b + dot-circle; f192 + dove; f4ba + download; f019 + draft2digital; f396 + drafting-compass; f568 + dragon; f6d5 + draw-polygon; f5ee + dribbble; f17d + dribbble-square; f397 + dropbox; f16b + drum; f569 + drum-steelpan; f56a + drumstick-bite; f6d7 + drupal; f1a9 + dumbbell; f44b + dumpster; f793 + dumpster-fire; f794 + dungeon; f6d9 + dyalog; f399 + earlybirds; f39a + ebay; f4f4 + edge; f282 + edge-legacy e078 + edit; f044 + egg; f7fb + eject; f052 + elementor; f430 + ellipsis-h; f141 + ellipsis-v; f142 + ello; f5f1 + ember; f423 + empire; f1d1 + envelope; f0e0 + envelope-open; f2b6 + envelope-open-text; f658 + envelope-square; f199 + envira; f299 + equals; f52c + eraser; f12d + erlang; f39d + ethereum; f42e + ethernet; f796 + etsy; f2d7 + euro-sign; f153 + evernote; f839 + exchange-alt; f362 + exclamation; f12a + exclamation-circle; f06a + exclamation-triangle; f071 + expand; f065 + expand-alt; f424 + expand-arrows-alt; f31e + expeditedssl; f23e + external-link-alt; f35d + external-link-square-alt; f360 + eye; f06e + eye-dropper; f1fb + eye-slash; f070 + ; facebook; f09a + ; facebook-f; f39e + ; facebook-messenger; f39f + ; facebook-square; f082 + ; fan; f863 + ; fantasy-flight-games; f6dc + ; fast-backward; f049 + ; fast-forward; f050 + ; faucet e005 + ; fax; f1ac + ; feather; f52d + ; feather-alt; f56b + ; fedex; f797 + ; fedora; f798 + ; female; f182 + ; fighter-jet; f0fb + ; figma; f799 + ; file; f15b + ; file-alt; f15c + ; file-archive; f1c6 + ; file-audio; f1c7 + ; file-code; f1c9 + ; file-contract; f56c + ; file-csv; f6dd + ; file-download; f56d + ; file-excel; f1c3 + ; file-export; f56e + ; file-image; f1c5 + ; file-import; f56f + ; file-invoice; f570 + ; file-invoice-dollar; f571 + ; file-medical; f477 + ; file-medical-alt; f478 + ; file-pdf; f1c1 + ; file-powerpoint; f1c4 + ; file-prescription; f572 + ; file-signature; f573 + ; file-upload; f574 + ; file-video; f1c8 + ; file-word; f1c2 + ; fill; f575 + ; fill-drip; f576 + ; film; f008 + ; filter; f0b0 + ; fingerprint; f577 + ; fire; f06d + ; fire-alt; f7e4 + ; fire-extinguisher; f134 + ; firefox; f269 + ; firefox-browser e007 + ; first-aid; f479 + ; first-order; f2b0 + ; first-order-alt; f50a + ; firstdraft; f3a1 + ; fish; f578 + ; fist-raised; f6de + ; flag; f024 + ; flag-checkered; f11e + ; flag-usa; f74d + ; flask; f0c3 + ; flickr; f16e + ; flipboard; f44d + ; flushed; f579 + ; fly; f417 + ; folder; f07b + ; folder-minus; f65d + ; folder-open; f07c + ; folder-plus; f65e + ; font; f031 + ; font-awesome; f2b4 + ; font-awesome-alt; f35c + ; font-awesome-flag; f425 + ; fonticons; f280 + ; fonticons-fi; f3a2 + ; football-ball; f44e + ; fort-awesome; f286 + ; fort-awesome-alt; f3a3 + ; forumbee; f211 + ; forward; f04e + ; foursquare; f180 + ; free-code-camp; f2c5 + ; freebsd; f3a4 + ; frog; f52e + ; frown; f119 + ; frown-open; f57a + ; fulcrum; f50b + ; funnel-dollar; f662 + ; futbol; f1e3 + galactic-republic; f50c + galactic-senate; f50d + gamepad; f11b + gas-pump; f52f + gavel; f0e3 + gem; f3a5 + genderless; f22d + get-pocket; f265 + gg; f260 + gg-circle; f261 + ghost; f6e2 + gift; f06b + gifts; f79c + git; f1d3 + git-alt; f841 + git-square; f1d2 + github; f09b + github-alt; f113 + github-square; f092 + gitkraken; f3a6 + gitlab; f296 + gitter; f426 + glass-cheers; f79f + glass-martini; f000 + glass-martini-alt; f57b + glass-whiskey; f7a0 + glasses; f530 + glide; f2a5 + glide-g; f2a6 + globe; f0ac + globe-africa; f57c + globe-americas; f57d + globe-asia; f57e + globe-europe; f7a2 + gofore; f3a7 + golf-ball; f450 + goodreads; f3a8 + goodreads-g; f3a9 + google; f1a0 + google-drive; f3aa + google-pay e079 + google-play; f3ab + google-plus; f2b3 + google-plus-g; f0d5 + google-plus-square; f0d4 + google-wallet; f1ee + gopuram; f664 + graduation-cap; f19d + gratipay; f184 + grav; f2d6 + greater-than; f531 + greater-than-equal; f532 + grimace; f57f + grin; f580 + grin-alt; f581 + grin-beam; f582 + grin-beam-sweat; f583 + grin-hearts; f584 + grin-squint; f585 + grin-squint-tears; f586 + grin-stars; f587 + grin-tears; f588 + grin-tongue; f589 + grin-tongue-squint; f58a + grin-tongue-wink; f58b + grin-wink; f58c + grip-horizontal; f58d + grip-lines; f7a4 + grip-lines-vertical; f7a5 + grip-vertical; f58e + gripfire; f3ac + grunt; f3ad + guilded e07e + guitar; f7a6 + gulp; f3ae + h-square; f0fd + hacker-news; f1d4 + hacker-news-square; f3af + hackerrank; f5f7 + hamburger; f805 + hammer; f6e3 + hamsa; f665 + hand-holding; f4bd + hand-holding-heart; f4be + hand-holding-medical e05c + hand-holding-usd; f4c0 + hand-holding-water; f4c1 + hand-lizard; f258 + hand-middle-finger; f806 + hand-paper; f256 + hand-peace; f25b + hand-point-down; f0a7 + hand-point-left; f0a5 + hand-point-right; f0a4 + hand-point-up; f0a6 + hand-pointer; f25a + hand-rock; f255 + hand-scissors; f257 + hand-sparkles e05d + hand-spock; f259 + hands; f4c2 + hands-helping; f4c4 + hands-wash e05e + handshake; f2b5 + handshake-alt-slash e05f + handshake-slash e060 + hanukiah; f6e6 + hard-hat; f807 + hashtag; f292 + hat-cowboy; f8c0 + hat-cowboy-side; f8c1 + hat-wizard; f6e8 + hdd; f0a0 + head-side-cough e061 + head-side-cough-slash e062 + head-side-mask e063 + head-side-virus e064 + heading; f1dc + headphones; f025 + headphones-alt; f58f + headset; f590 + heart; f004 + heart-broken; f7a9 + heartbeat; f21e + helicopter; f533 + highlighter; f591 + hiking; f6ec + hippo; f6ed + hips; f452 + hire-a-helper; f3b0 + history; f1da + hive e07f + hockey-puck; f453 + holly-berry; f7aa + home; f015 + hooli; f427 + hornbill; f592 + horse; f6f0 + horse-head; f7ab + hospital; f0f8 + hospital-alt; f47d + hospital-symbol; f47e + hospital-user; f80d + hot-tub; f593 + hotdog; f80f + hotel; f594 + hotjar; f3b1 + hourglass; f254 + hourglass-end; f253 + hourglass-half; f252 + hourglass-start; f251 + house-damage; f6f1 + house-user e065 + houzz; f27c + hryvnia; f6f2 + html5; f13b + hubspot; f3b2 + i-cursor; f246 + ice-cream; f810 + icicles; f7ad + icons; f86d + id-badge; f2c1 + id-card; f2c2 + id-card-alt; f47f + ideal e013 + igloo; f7ae + image; f03e + images; f302 + imdb; f2d8 + inbox; f01c + indent; f03c + industry; f275 + infinity; f534 + info; f129 + info-circle; f05a + innosoft e080 + instagram; f16d + instagram-square e055 + instalod e081 + intercom; f7af + internet-explorer; f26b + invision; f7b0 + ioxhost; f208 + italic; f033 + itch-io; f83a + itunes; f3b4 + itunes-note; f3b5 + java; f4e4 + jedi; f669 + jedi-order; f50e + jenkins; f3b6 + jira; f7b1 + joget; f3b7 + joint; f595 + joomla; f1aa + journal-whills; f66a + js; f3b8 + js-square; f3b9 + jsfiddle; f1cc + kaaba; f66b + kaggle; f5fa + key; f084 + keybase; f4f5 + keyboard; f11c + keycdn; f3ba + khanda; f66d + kickstarter; f3bb + kickstarter-k; f3bc + kiss; f596 + kiss-beam; f597 + kiss-wink-heart; f598 + kiwi-bird; f535 + korvue; f42f + landmark; f66f + language; f1ab + laptop; f109 + laptop-code; f5fc + laptop-house e066 + laptop-medical; f812 + laravel; f3bd + lastfm; f202 + lastfm-square; f203 + laugh; f599 + laugh-beam; f59a + laugh-squint; f59b + laugh-wink; f59c + layer-group; f5fd + leaf; f06c + leanpub; f212 + lemon; f094 + less; f41d + less-than; f536 + less-than-equal; f537 + level-down-alt; f3be + level-up-alt; f3bf + life-ring; f1cd + lightbulb; f0eb + line; f3c0 + link; f0c1 + linkedin; f08c + linkedin-in; f0e1 + linode; f2b8 + linux; f17c + lira-sign; f195 + list; f03a + list-alt; f022 + list-ol; f0cb + list-ul; f0ca + location-arrow; f124 + lock; f023 + lock-open; f3c1 + long-arrow-alt-down; f309 + long-arrow-alt-left; f30a + long-arrow-alt-right; f30b + long-arrow-alt-up; f30c + low-vision; f2a8 + luggage-cart; f59d + lungs; f604 + lungs-virus e067 + lyft; f3c3 + magento; f3c4 + magic; f0d0 + magnet; f076 + mail-bulk; f674 + mailchimp; f59e + male; f183 + mandalorian; f50f + map; f279 + map-marked; f59f + map-marked-alt; f5a0 + map-marker; f041 + map-marker-alt; f3c5 + map-pin; f276 + map-signs; f277 + markdown; f60f + marker; f5a1 + mars; f222 + mars-double; f227 + mars-stroke; f229 + mars-stroke-h; f22b + mars-stroke-v; f22a + mask; f6fa + mastodon; f4f6 + maxcdn; f136 + mdb; f8ca + medal; f5a2 + medapps; f3c6 + medium; f23a + medium-m; f3c7 + medkit; f0fa + medrt; f3c8 + meetup; f2e0 + megaport; f5a3 + meh; f11a + meh-blank; f5a4 + meh-rolling-eyes; f5a5 + memory; f538 + mendeley; f7b3 + menorah; f676 + mercury; f223 + meteor; f753 + microblog e01a + microchip; f2db + microphone; f130 + microphone-alt; f3c9 + microphone-alt-slash; f539 + microphone-slash; f131 + microscope; f610 + microsoft; f3ca + minus; f068 + minus-circle; f056 + minus-square; f146 + mitten; f7b5 + mix; f3cb + mixcloud; f289 + mixer e056 + mizuni; f3cc + mobile; f10b + mobile-alt; f3cd + modx; f285 + monero; f3d0 + money-bill; f0d6 + money-bill-alt; f3d1 + money-bill-wave; f53a + money-bill-wave-alt; f53b + money-check; f53c + money-check-alt; f53d + monument; f5a6 + moon; f186 + mortar-pestle; f5a7 + mosque; f678 + motorcycle; f21c + mountain; f6fc + mouse; f8cc + mouse-pointer; f245 + mug-hot; f7b6 + music; f001 + napster; f3d2 + neos; f612 + network-wired; f6ff + neuter; f22c + newspaper; f1ea + nimblr; f5a8 + node; f419 + node-js; f3d3 + not-equal; f53e + notes-medical; f481 + npm; f3d4 + ns8; f3d5 + nutritionix; f3d6 + object-group; f247 + object-ungroup; f248 + octopus-deploy e082 + odnoklassniki; f263 + odnoklassniki-square; f264 + oil-can; f613 + old-republic; f510 + om; f679 + opencart; f23d + openid; f19b + opera; f26a + optin-monster; f23c + orcid; f8d2 + osi; f41a + otter; f700 + outdent; f03b + page4; f3d7 + pagelines; f18c + pager; f815 + paint-brush; f1fc + paint-roller; f5aa + palette; f53f + palfed; f3d8 + pallet; f482 + paper-plane; f1d8 + paperclip; f0c6 + parachute-box; f4cd + paragraph; f1dd + parking; f540 + passport; f5ab + pastafarianism; f67b + paste; f0ea + patreon; f3d9 + pause; f04c + pause-circle; f28b + paw; f1b0 + paypal; f1ed + peace; f67c + pen; f304 + pen-alt; f305 + pen-fancy; f5ac + pen-nib; f5ad + pen-square; f14b + pencil-alt; f303 + pencil-ruler; f5ae + penny-arcade; f704 + people-arrows e068 + people-carry; f4ce + pepper-hot; f816 + perbyte e083 + percent; f295 + percentage; f541 + periscope; f3da + person-booth; f756 + phabricator; f3db + phoenix-framework; f3dc + phoenix-squadron; f511 + phone; f095 + phone-alt; f879 + phone-slash; f3dd + phone-square; f098 + phone-square-alt; f87b + phone-volume; f2a0 + photo-video; f87c + php; f457 + pied-piper; f2ae + pied-piper-alt; f1a8 + pied-piper-hat; f4e5 + pied-piper-pp; f1a7 + pied-piper-square e01e + piggy-bank; f4d3 + pills; f484 + pinterest; f0d2 + pinterest-p; f231 + pinterest-square; f0d3 + pizza-slice; f818 + place-of-worship; f67f + plane; f072 + plane-arrival; f5af + plane-departure; f5b0 + plane-slash e069 + play; f04b + play-circle; f144 + playstation; f3df + plug; f1e6 + plus; f067 + plus-circle; f055 + plus-square; f0fe + podcast; f2ce + poll; f681 + poll-h; f682 + poo; f2fe + poo-storm; f75a + poop; f619 + portrait; f3e0 + pound-sign; f154 + power-off; f011 + pray; f683 + praying-hands; f684 + prescription; f5b1 + prescription-bottle; f485 + prescription-bottle-alt; f486 + print; f02f + procedures; f487 + product-hunt; f288 + project-diagram; f542 + pump-medical e06a + pump-soap e06b + pushed; f3e1 + puzzle-piece; f12e + python; f3e2 + qq; f1d6 + qrcode; f029 + question; f128 + question-circle; f059 + quidditch; f458 + quinscape; f459 + quora; f2c4 + quote-left; f10d + quote-right; f10e + quran; f687 + r-project; f4f7 + radiation; f7b9 + radiation-alt; f7ba + rainbow; f75b + random; f074 + raspberry-pi; f7bb + ravelry; f2d9 + react; f41b + reacteurope; f75d + readme; f4d5 + rebel; f1d0 + receipt; f543 + record-vinyl; f8d9 + recycle; f1b8 + red-river; f3e3 + reddit; f1a1 + reddit-alien; f281 + reddit-square; f1a2 + redhat; f7bc + redo; f01e + redo-alt; f2f9 + registered; f25d + remove-format; f87d + renren; f18b + reply; f3e5 + reply-all; f122 + replyd; f3e6 + republican; f75e + researchgate; f4f8 + resolving; f3e7 + restroom; f7bd + retweet; f079 + rev; f5b2 + ribbon; f4d6 + ring; f70b + road; f018 + robot; f544 + rocket; f135 + rocketchat; f3e8 + rockrms; f3e9 + route; f4d7 + rss; f09e + rss-square; f143 + ruble-sign; f158 + ruler; f545 + ruler-combined; f546 + ruler-horizontal; f547 + ruler-vertical; f548 + running; f70c + rupee-sign; f156 + rust e07a + sad-cry; f5b3 + sad-tear; f5b4 + safari; f267 + salesforce; f83b + sass; f41e + satellite; f7bf + satellite-dish; f7c0 + save; f0c7 + schlix; f3ea + school; f549 + screwdriver; f54a + scribd; f28a + scroll; f70e + sd-card; f7c2 + search; f002 + search-dollar; f688 + search-location; f689 + search-minus; f010 + search-plus; f00e + searchengin; f3eb + seedling; f4d8 + sellcast; f2da + sellsy; f213 + server; f233 + servicestack; f3ec + shapes; f61f + share; f064 + share-alt; f1e0 + share-alt-square; f1e1 + share-square; f14d + shekel-sign; f20b + shield-alt; f3ed + shield-virus e06c + ship; f21a + shipping-fast; f48b + shirtsinbulk; f214 + shoe-prints; f54b + shopify e057 + shopping-bag; f290 + shopping-basket; f291 + shopping-cart; f07a + shopware; f5b5 + shower; f2cc + shuttle-van; f5b6 + sign; f4d9 + sign-in-alt; f2f6 + sign-language; f2a7 + sign-out-alt; f2f5 + signal; f012 + signature; f5b7 + sim-card; f7c4 + simplybuilt; f215 + sink e06d + sistrix; f3ee + sitemap; f0e8 + sith; f512 + skating; f7c5 + sketch; f7c6 + skiing; f7c9 + skiing-nordic; f7ca + skull; f54c + skull-crossbones; f714 + skyatlas; f216 + skype; f17e + slack; f198 + slack-hash; f3ef + slash; f715 + sleigh; f7cc + sliders-h; f1de + slideshare; f1e7 + smile; f118 + smile-beam; f5b8 + smile-wink; f4da + smog; f75f + smoking; f48d + smoking-ban; f54d + sms; f7cd + snapchat; f2ab + snapchat-ghost; f2ac + snapchat-square; f2ad + snowboarding; f7ce + snowflake; f2dc + snowman; f7d0 + snowplow; f7d2 + soap e06e + socks; f696 + solar-panel; f5ba + sort; f0dc + sort-alpha-down; f15d + sort-alpha-down-alt; f881 + sort-alpha-up; f15e + sort-alpha-up-alt; f882 + sort-amount-down; f160 + sort-amount-down-alt; f884 + sort-amount-up; f161 + sort-amount-up-alt; f885 + sort-down; f0dd + sort-numeric-down; f162 + sort-numeric-down-alt; f886 + sort-numeric-up; f163 + sort-numeric-up-alt; f887 + sort-up; f0de + soundcloud; f1be + sourcetree; f7d3 + spa; f5bb + space-shuttle; f197 + speakap; f3f3 + speaker-deck; f83c + spell-check; f891 + spider; f717 + spinner; f110 + splotch; f5bc + spotify; f1bc + spray-can; f5bd + square; f0c8 + square-full; f45c + square-root-alt; f698 + squarespace; f5be + stack-exchange; f18d + stack-overflow; f16c + stackpath; f842 + stamp; f5bf + star; f005 + star-and-crescent; f699 + star-half; f089 + star-half-alt; f5c0 + star-of-david; f69a + star-of-life; f621 + staylinked; f3f5 + steam; f1b6 + steam-square; f1b7 + steam-symbol; f3f6 + step-backward; f048 + step-forward; f051 + stethoscope; f0f1 + sticker-mule; f3f7 + sticky-note; f249 + stop; f04d + stop-circle; f28d + stopwatch; f2f2 + stopwatch-20 e06f + store; f54e + store-alt; f54f + store-alt-slash e070 + store-slash e071 + strava; f428 + stream; f550 + street-view; f21d + strikethrough; f0cc + stripe; f429 + stripe-s; f42a + stroopwafel; f551 + studiovinari; f3f8 + stumbleupon; f1a4 + stumbleupon-circle; f1a3 + subscript; f12c + subway; f239 + suitcase; f0f2 + suitcase-rolling; f5c1 + sun; f185 + superpowers; f2dd + superscript; f12b + supple; f3f9 + surprise; f5c2 + suse; f7d6 + swatchbook; f5c3 + swift; f8e1 + swimmer; f5c4 + swimming-pool; f5c5 + symfony; f83d + synagogue; f69b + sync; f021 + sync-alt; f2f1 + syringe; f48e + table; f0ce + table-tennis; f45d + tablet; f10a + tablet-alt; f3fa + tablets; f490 + tachometer-alt; f3fd + tag; f02b + tags; f02c + tape; f4db + tasks; f0ae + taxi; f1ba + teamspeak; f4f9 + teeth; f62e + teeth-open; f62f + telegram; f2c6 + telegram-plane; f3fe + temperature-high; f769 + temperature-low; f76b + tencent-weibo; f1d5 + tenge; f7d7 + terminal; f120 + text-height; f034 + text-width; f035 + th; f00a + th-large; f009 + th-list; f00b + the-red-yeti; f69d + theater-masks; f630 + themeco; f5c6 + themeisle; f2b2 + thermometer; f491 + thermometer-empty; f2cb + thermometer-full; f2c7 + thermometer-half; f2c9 + thermometer-quarter; f2ca + thermometer-three-quarters; f2c8 + think-peaks; f731 + thumbs-down; f165 + thumbs-up; f164 + thumbtack; f08d + ticket-alt; f3ff + tiktok e07b + times; f00d + times-circle; f057 + tint; f043 + tint-slash; f5c7 + tired; f5c8 + toggle-off; f204 + toggle-on; f205 + toilet; f7d8 + toilet-paper; f71e + toilet-paper-slash e072 + toolbox; f552 + tools; f7d9 + tooth; f5c9 + torah; f6a0 + torii-gate; f6a1 + tractor; f722 + trade-federation; f513 + trademark; f25c + traffic-light; f637 + trailer e041 + train; f238 + tram; f7da + transgender; f224 + transgender-alt; f225 + trash; f1f8 + trash-alt; f2ed + trash-restore; f829 + trash-restore-alt; f82a + tree; f1bb + trello; f181 + trophy; f091 + truck; f0d1 + truck-loading; f4de + truck-monster; f63b + truck-moving; f4df + truck-pickup; f63c + tshirt; f553 + tty; f1e4 + tumblr; f173 + tumblr-square; f174 + tv; f26c + twitch; f1e8 + twitter; f099 + twitter-square; f081 + typo3; f42b + uber; f402 + ubuntu; f7df + uikit; f403 + umbraco; f8e8 + umbrella; f0e9 + umbrella-beach; f5ca + uncharted e084 + underline; f0cd + undo; f0e2 + undo-alt; f2ea + uniregistry; f404 + unity e049 + universal-access; f29a + university; f19c + unlink; f127 + unlock; f09c + unlock-alt; f13e + unsplash e07c + untappd; f405 + upload; f093 + ups; f7e0 + usb; f287 + user; f007 + user-alt; f406 + user-alt-slash; f4fa + user-astronaut; f4fb + user-check; f4fc + user-circle; f2bd + user-clock; f4fd + user-cog; f4fe + user-edit; f4ff + user-friends; f500 + user-graduate; f501 + user-injured; f728 + user-lock; f502 + user-md; f0f0 + user-minus; f503 + user-ninja; f504 + user-nurse; f82f + user-plus; f234 + user-secret; f21b + user-shield; f505 + user-slash; f506 + user-tag; f507 + user-tie; f508 + user-times; f235 + users; f0c0 + users-cog; f509 + users-slash e073 + usps; f7e1 + ussunnah; f407 + utensil-spoon; f2e5 + utensils; f2e7 + vaadin; f408 + vector-square; f5cb + venus; f221 + venus-double; f226 + venus-mars; f228 + vest e085 + vest-patches e086 + viacoin; f237 + viadeo; f2a9 + viadeo-square; f2aa + vial; f492 + vials; f493 + viber; f409 + video; f03d + video-slash; f4e2 + vihara; f6a7 + vimeo; f40a + vimeo-square; f194 + vimeo-v; f27d + vine; f1ca + virus e074 + virus-slash e075 + viruses e076 + vk; f189 + vnv; f40b + voicemail; f897 + volleyball-ball; f45f + volume-down; f027 + volume-mute; f6a9 + volume-off; f026 + volume-up; f028 + vote-yea; f772 + vr-cardboard; f729 + vuejs; f41f + walking; f554 + wallet; f555 + warehouse; f494 + watchman-monitoring e087 + water; f773 + wave-square; f83e + waze; f83f + weebly; f5cc + weibo; f18a + weight; f496 + weight-hanging; f5cd + weixin; f1d7 + whatsapp; f232 + whatsapp-square; f40c + wheelchair; f193 + whmcs; f40d + wifi; f1eb + wikipedia-w; f266 + wind; f72e + window-close; f410 + window-maximize; f2d0 + window-minimize; f2d1 + window-restore; f2d2 + windows; f17a + wine-bottle; f72f + wine-glass; f4e3 + wine-glass-alt; f5ce + wix; f5cf + wizards-of-the-coast; f730 + wodu e088 + wolf-pack-battalion; f514 + won-sign; f159 + wordpress; f19a + wordpress-simple; f411 + wpbeginner; f297 + wpexplorer; f2de + wpforms; f298 + wpressr; f3e4 + wrench; f0ad + x-ray; f497 + xbox; f412 + xing; f168 + xing-square; f169 + y-combinator; f23b + yahoo; f19e + yammer; f840 + yandex; f413 + yandex-international; f414 + yarn; f7e3 + yelp; f1e9 + yen-sign; f157 + yin-yang; f6ad + yoast; f2b1 + youtube; f167 + youtube-square; f431 + zhihu; f63f diff --git a/extras/dmenu-scripts/dm-displayselect b/extras/dmenu-scripts/dm-displayselect new file mode 100755 index 0000000..9fdd581 --- /dev/null +++ b/extras/dmenu-scripts/dm-displayselect @@ -0,0 +1,90 @@ +#!/bin/sh + +# Probes xrandr for connected displays and lets user select one to use. User +# may also select "manual selection" which opens arandr. (arandr can be buggy) + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +# based on a script by Luke Smith (lukesmith.xyz) + + +twoscreen() { # If multi-monitor is selected and there are two screens. + + mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?") + # Mirror displays using native resolution of external display and a scaled + # version for the internal display + if [ "$mirror" = "yes" ]; then + external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:") + internal=$(echo "$screens" | grep -v "$external") + + res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + + res_ext_x=$(echo "$res_external" | sed 's/x.*//') + res_ext_y=$(echo "$res_external" | sed 's/.*x//') + res_int_x=$(echo "$res_internal" | sed 's/x.*//') + res_int_y=$(echo "$res_internal" | sed 's/.*x//') + + scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l) + scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l) + + xrandr --output "$external" --auto --scale 1.0x1.0 \ + --output "$internal" --auto --same-as "$external" \ + --scale "$scale_x"x"$scale_y" + else + + primary=$(echo "$screens" | dmenu -i -p "Select primary display:") + secondary=$(echo "$screens" | grep -v "$primary") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0 + fi + } + +morescreen() { # If multi-monitor is selected and there are more than two screens. + primary=$(echo "$screens" | dmenu -i -p "Select primary display:") + secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:") + xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto +} + +multimon() { # Multi-monitor handler. + case "$(echo "$screens" | wc -l)" in + 2) twoscreen ;; + *) morescreen ;; + esac ;} + +onescreen() { # If only one output available or chosen. + xrandr --output "$1" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "\b$1" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -) +} + +postrun() { # Stuff to run to clean up. + bgloc="${XDG_DATA_HOME:-$HOME/.local/share}/bg" + xwallpaper --zoom "$bgloc" # Fix background if screen size/arangement has changed. + { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen +} + +# Get all possible displays +allposs=$(xrandr -q | grep "connected") + +# Get all connected screens. +screens=$(echo "$allposs" | awk '/ connected/ {print $1}') + +# If there's only one screen +[ "$(echo "$screens" | wc -l)" -lt 2 ] && + { onescreen "$screens"; postrun; notify-send "Only one screen detected." "Using it in its optimal settings..."; exit ;} + +# Get user choice including multi-monitor and manual selection: +chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") && +case "$chosen" in + "manual selection") arandr ; exit ;; + "multi-monitor") multimon ;; + *) onescreen "$chosen" ;; +esac + +postrun diff --git a/extras/dmenu-scripts/dm-handler b/extras/dmenu-scripts/dm-handler new file mode 100755 index 0000000..a30e743 --- /dev/null +++ b/extras/dmenu-scripts/dm-handler @@ -0,0 +1,25 @@ +#!/bin/sh + +# Feed this script a link and dmenu will return some choice programs to open +# it. + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +# based on a script by Luke Smith (lukesmith.xyz) + +feed="${1:-$(true | dmenu -p 'Paste URL or file path')}" + +case "$(printf "copy url\\nbrowser\\nmpv\\nnsxiv\\nPDF\\nlynx\\nvim\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | dmenu -i -p "Open it with?")" in + "copy url") echo "$feed" | xclip -selection clipboard ;; + mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;; + "queue yt-dlp") qndl "$feed" >/dev/null 2>&1 ;; + "queue yt-dlp audio") qndl "$feed" 'yt-dlp -o "%(title)s.%(ext)s" -f bestaudio --embed-metadata --restrict-filenames' ;; + "queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;; + PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; + nsxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && nsxiv -a "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; + vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; + browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;; +esac diff --git a/extras/dmenu-scripts/dm-kampv b/extras/dmenu-scripts/dm-kampv new file mode 100755 index 0000000..a61a0ea --- /dev/null +++ b/extras/dmenu-scripts/dm-kampv @@ -0,0 +1,8 @@ +#!/bin/sh + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +killall mpv diff --git a/extras/dmenu-scripts/dm-maimpick b/extras/dmenu-scripts/dm-maimpick new file mode 100755 index 0000000..8aa41d7 --- /dev/null +++ b/extras/dmenu-scripts/dm-maimpick @@ -0,0 +1,20 @@ +#!/bin/sh + +# dmenu screenshot utillity. Requires maim + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +output="$(date '+%y%m%d-%H%M-%S').png" +xclip_cmd="xclip -sel clip -t image/png" + +case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in + "a selected area") maim -u -s pic-selected-"${output}" ;; + "current window") maim -q -d 0.2 -i "$(xdotool getactivewindow)" pic-window-"${output}" ;; + "full screen") maim -q -d 0.2 pic-full-"${output}" ;; + "a selected area (copy)") maim -u -s | ${xclip_cmd} ;; + "current window (copy)") maim -q -d 0.2 -i "$(xdotool getactivewindow)" | ${xclip_cmd} ;; + "full screen (copy)") maim -q -d 0.2 | ${xclip_cmd} ;; +esac diff --git a/extras/dmenu-scripts/dm-mountcifs b/extras/dmenu-scripts/dm-mountcifs new file mode 100755 index 0000000..0b55e7c --- /dev/null +++ b/extras/dmenu-scripts/dm-mountcifs @@ -0,0 +1,24 @@ +#!/bin/sh + +# Gives a dmenu prompt to mount unmounted local NAS shares for read/write. +# Requirements - "%wheel ALL=(ALL) NOPASSWD: ALL" + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +# based on a script by Luke Smith (lukesmith.xyz) + +srvname=$(avahi-browse _smb._tcp -t | awk '{print $4}' | dmenu -i -p "Which NAS?") || exit 1 +notify-send "Searching for network shares..." "Please wait..." +share=$(smbclient -L "$srvname" -N | grep Disk | awk '{print $1}' | dmenu -i -p "Mount which share?") || exit 1 +share2mnt=//"$srvname".local/"$share" + +sharemount() { + mounted=$(mount -v | grep "$share2mnt") || ([ ! -d /mnt/"$share" ] && sudo mkdir /mnt/"$share") + [ -z "$mounted" ] && sudo mount -t cifs "$share2mnt" -o user=nobody,password="",noperm /mnt/"$share" && notify-send "Netshare $share mounted" && exit 0 + notify-send "Netshare $share already mounted"; exit 1 +} + +sharemount diff --git a/extras/dmenu-scripts/dm-mounter b/extras/dmenu-scripts/dm-mounter new file mode 100755 index 0000000..84b401d --- /dev/null +++ b/extras/dmenu-scripts/dm-mounter @@ -0,0 +1,122 @@ +#!/bin/bash + +# Mounts Android Phones and USB drives (encrypted or not). + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +# based on a script by Luke Smith (lukesmith.xyz) + +IFS=' +' +# Function for escaping cell-phone names. +escape(){ echo "$@" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g" ;} + +# Check for phones. +phones="$(simple-mtpfs -l 2>/dev/null | sed "s/^/📱/")" +mountedphones="$(grep "simple-mtpfs" /etc/mtab)" +# If there are already mounted phones, remove them from the list of mountables. +[ -n "$mountedphones" ] && phones="$(for phone in $phones; do + for mounted in $mountedphones; do + escphone="$(escape "$phone")" + [[ "$mounted" =~ "$escphone" ]] && break 1 + done && continue 1 + echo "$phone" +done)" + +# Check for drives. +lsblkoutput="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,fstype")" +# Get all LUKS drives +allluks="$(echo "$lsblkoutput" | grep crypto_LUKS)" +# Get a list of the LUKS drive UUIDs already decrypted. +decrypted="$(find /dev/disk/by-id/dm-uuid-CRYPT-LUKS2-* | sed "s|.*LUKS2-||;s|-.*||")" +# Functioning for formatting drives correctly for dmenu: +filter() { sed "s/ /:/g" | awk -F':' '$7==""{printf "%s%s (%s) %s\n",$1,$3,$5,$6}' ; } + +# Get only LUKS drives that are not decrypted. +unopenedluks="$(for drive in $allluks; do + uuid="${drive%% *}" + uuid="${uuid//-}" # This is a bashism. + [ -n "$decrypted" ] && for open in $decrypted; do + [ "$uuid" = "$open" ] && break 1 + done && continue 1 + echo "🔒 $drive" +done | filter)" + +# Get all normal, non-encrypted or decrypted partitions that are not mounted. +normalparts="$(echo "$lsblkoutput"| grep -v crypto_LUKS | grep 'part\|rom\|crypt' | sed "s/^/💾 /" | filter )" + +# Add all to one variable. If no mountable drives found, exit. +alldrives="$(echo "$phones +$unopenedluks +$normalparts" | sed "/^$/d;s/ *$//")" + +# Quit the script if a sequential command fails. +set -e + +test -n "$alldrives" + +# Feed all found drives to dmenu and get user choice. +chosen="$(echo "$alldrives" | dmenu -p "Mount which drive?" -i)" + +# Function for prompting user for a mountpoint. +getmount(){ + mp="$(find /mnt /media /mount /home -maxdepth 1 -type d 2>/dev/null | dmenu -i -p "Mount this drive where?")" + test -n "$mp" + if [ ! -d "$mp" ]; then + mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") + [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp") + fi +} + +attemptmount(){ + # Attempt to mount without a mountpoint, to see if drive is in fstab. + sudo -A mount "$chosen" || return 1 + notify-send "💾Drive Mounted." "$chosen mounted." + exit +} + +case "$chosen" in + 💾*) + chosen="${chosen%% *}" + chosen="${chosen:1}" # This is a bashism. + parttype="$(echo "$lsblkoutput" | grep "$chosen")" + attemptmount || getmount + case "${parttype##* }" in + vfat) sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000 ;; + btrfs) sudo -A mount "$chosen" "$mp" ;; + *) sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)" ;; + esac + notify-send "💾Drive Mounted." "$chosen mounted to $mp." + ;; + + 🔒*) + chosen="${chosen%% *}" + chosen="${chosen:1}" # This is a bashism. + # Number the drive. + while true; do + [ -f "/dev/mapper/usb$num" ] || break + num="$(printf "%02d" "$((num +1))")" + done + + # Decrypt in a terminal window + ${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$chosen" "usb$num" + # Check if now decrypted. + test -b "/dev/mapper/usb$num" + + attemptmount || getmount + sudo -A mount "/dev/mapper/usb$num" "$mp" -o uid="$(id -u)",gid="$(id -g)" + notify-send "🔓Decrypted drive Mounted." "$chosen decrypted and mounted to $mp." + ;; + + 📱*) + notify-send "❗Note" "Remember to allow file access on your phone now." + getmount + number="${chosen%%:*}" + number="${chosen:1}" # This is a bashism. + sudo -A simple-mtpfs -o allow_other -o fsname="simple-mtpfs-$(escape "$chosen")" --device "$number" "$mp" + notify-send "🤖 Android Mounted." "Android device mounted to $mp." + ;; +esac diff --git a/extras/dmenu-scripts/dm-pass b/extras/dmenu-scripts/dm-pass new file mode 100755 index 0000000..8429775 --- /dev/null +++ b/extras/dmenu-scripts/dm-pass @@ -0,0 +1,11 @@ +#!/bin/sh + +# Set this script as the SUDO_ASKPASS variable. Will function as a password +# prompt. + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +dmenu -fn Monospace-18 -P -p "$1" <&- && echo diff --git a/extras/dmenu-scripts/dm-record b/extras/dmenu-scripts/dm-record new file mode 100755 index 0000000..b76aa04 --- /dev/null +++ b/extras/dmenu-scripts/dm-record @@ -0,0 +1,123 @@ +#!/bin/sh + +# dmenu screen capture utillity + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +# based on a script by Luke Smith (lukesmith.xyz) + +getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' ' ;} + +updateicon() { \ + echo "$1" > /tmp/recordingicon + pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" + } + +killrecording() { + recpid="$(cat /tmp/recordingpid)" + kill -15 "$recpid" + rm -f /tmp/recordingpid + updateicon "" + pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" + } + +screencast() { \ + ffmpeg -y \ + -f x11grab \ + -framerate 30 \ + -s "$(getdim)" \ + -i "$DISPLAY" \ + -r 24 \ + -use_wallclock_as_timestamps 1 \ + -f alsa -thread_queue_size 1024 -i default \ + -c:v h264 \ + -crf 0 -preset ultrafast -c:a aac \ + "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" & + echo $! > /tmp/recordingpid + updateicon "⏺️🎙️" + } + +video() { ffmpeg \ + -f x11grab \ + -framerate 30 \ + -s "$(getdim)" \ + -i "$DISPLAY" \ + -c:v libx264 -qp 0 -r 30 \ + "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "⏺️" + } + +webcamhidef() { ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 1920x1080 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "🎥" + } + +webcam() { ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 640x480 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "🎥" + } + + +audio() { \ + ffmpeg \ + -f alsa -i default \ + -c:a flac \ + "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" & + echo $! > /tmp/recordingpid + updateicon "🎙️" + } + +askrecording() { \ + choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:") + case "$choice" in + screencast) screencast;; + audio) audio;; + video) video;; + *selected) videoselected;; + webcam) webcam;; + "webcam (hi-def)") webcamhidef;; + esac + } + +asktoend() { \ + response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") && + [ "$response" = "Yes" ] && killrecording + } + +videoselected() +{ + slop -f "%x %y %w %h" > /tmp/slop + read -r X Y W H < /tmp/slop + rm /tmp/slop + + ffmpeg \ + -f x11grab \ + -framerate 30 \ + -video_size "$W"x"$H" \ + -i :0.0+"$X,$Y" \ + -c:v libx264 -qp 0 -r 30 \ + "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "⏺️" +} + +case "$1" in + screencast) screencast;; + audio) audio;; + video) video;; + *selected) videoselected;; + kill) killrecording;; + *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;; +esac diff --git a/extras/dmenu-scripts/dm-streamselect b/extras/dmenu-scripts/dm-streamselect new file mode 100755 index 0000000..39b4d56 --- /dev/null +++ b/extras/dmenu-scripts/dm-streamselect @@ -0,0 +1,21 @@ +#!/bin/sh + +# stream radio stations + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +streamList=" +WXXI Classical (Rochester Classical Radio) link:https://22213.live.streamtheworld.com/WXXIFM.mp3 +Classical WSMR (Tampa Classical Radio) link:https://worldradiomap.com/us-fl/play/wsmr_live +WHTK Fox Sports 1280 AM (Rochester Sports Radio) link:https://worldradiomap.com/us-ny/play/whtk_live +WDAE 620 AM/95.3 FM (Tampa Sports Radio) link:https://worldradiomap.com/us-fl/play/wdae_live +" + +selected=$(echo "$streamList" | grep -P "^$(echo "$streamList" | grep "https:" | sed 's/link:.*//g' | dmenu -i -p "Select a Stream" -l 20 | awk '{print $1}')\s") +name=$(echo "$selected" | sed 's/link:.*//g') + +notify-send "now-playing" "$name" +echo "$selected" | sed 's/.*link://' | xargs -r mpv --no-video --terminal=no || notify-send "mpv failed" diff --git a/extras/dmenu-scripts/dm-sysact b/extras/dmenu-scripts/dm-sysact new file mode 100755 index 0000000..3b9683f --- /dev/null +++ b/extras/dmenu-scripts/dm-sysact @@ -0,0 +1,32 @@ +#!/bin/sh + +# dmenu wrapper script for system functions. + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +export WM="dwm" +case "$(readlink -f /sbin/init)" in + *systemd*) ctl='systemctl' ;; + *) ctl='loginctl' ;; +esac + +wmpid(){ # This function is needed if there are multiple instances of the window manager. + tree="$(pstree -ps $$)" + tree="${tree#*$WM(}" + echo "${tree%%)*}" +} + +case "$(printf " lock\n leave $WM\n renew $WM\n hibernate\n reboot\n shutdown\n sleep\n display off" | dmenu -i -p 'Action: ')" in + ' lock') slock ;; + " leave $WM") kill -TERM "$(wmpid)" ;; + " renew $WM") kill -HUP "$(wmpid)" ;; + ' hibernate') slock $ctl hibernate -i ;; + ' sleep') slock $ctl suspend -i ;; + ' reboot') $ctl reboot -i ;; + ' shutdown') $ctl poweroff -i ;; + ' display off') xset dpms force off ;; + *) exit 1 ;; +esac diff --git a/extras/dmenu-scripts/dm-umounter b/extras/dmenu-scripts/dm-umounter new file mode 100755 index 0000000..23f0a73 --- /dev/null +++ b/extras/dmenu-scripts/dm-umounter @@ -0,0 +1,34 @@ +#!/bin/sh + +# Unmount USB drives or Android phones. + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +# based on a script by Luke Smith (lukesmith.xyz) + +set -e + +mounteddroids="$(grep simple-mtpfs /etc/mtab | awk '{print "📱" $2}')" +lsblkoutput="$(lsblk -nrpo "name,type,size,mountpoint")" +mounteddrives="$(echo "$lsblkoutput" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "💾%s (%s)\n",$4,$3}')" + +allunmountable="$(echo "$mounteddroids +$mounteddrives" | sed "/^$/d;s/ *$//")" +test -n "$allunmountable" + +chosen="$(echo "$allunmountable" | dmenu -i -p "Unmount which drive?")" +chosen="${chosen%% *}" +test -n "$chosen" + +sudo -A umount -l "/${chosen#*/}" +notify-send "Device unmounted." "$chosen has been unmounted." + +# Close the chosen drive if decrypted. +cryptid="$(echo "$lsblkoutput" | grep "/${chosen#*/}$")" +cryptid="${cryptid%% *}" +test -b /dev/mapper/"${cryptid##*/}" +sudo -A cryptsetup close "$cryptid" +notify-send "🔒Device dencryption closed." "Drive is now securely locked again." diff --git a/extras/dmenu-scripts/dm-unicode b/extras/dmenu-scripts/dm-unicode new file mode 100755 index 0000000..0885363 --- /dev/null +++ b/extras/dmenu-scripts/dm-unicode @@ -0,0 +1,17 @@ +#!/bin/sh + +# Tucker Johnson (git.newer.systems) (tucker@newer.systems) + +# This script is to add out-of the box features to my dmenu build. If you want +# to make changes, make them in the source directory and reinstall. + +chosen=$(cut -d ';' -f1 /usr/lib/TuCLS/chars/* | dmenu -i -l 30 | sed "s/ .*//") + +[ -z "$chosen" ] && exit + +if [ -n "$1" ]; then + xdotool type "$chosen" +else + printf "%s" "$chosen" | xclip -selection clipboard + notify-send "'$chosen' copied to clipboard." & +fi diff --git a/extras/dmenu-scripts/dmenu_path b/extras/dmenu-scripts/dmenu_path new file mode 100755 index 0000000..3a7cda7 --- /dev/null +++ b/extras/dmenu-scripts/dmenu_path @@ -0,0 +1,13 @@ +#!/bin/sh + +cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" +cache="$cachedir/dmenu_run" + +[ ! -e "$cachedir" ] && mkdir -p "$cachedir" + +IFS=: +if stest -dqr -n "$cache" $PATH; then + stest -flx $PATH | sort -u | tee "$cache" +else + cat "$cache" +fi diff --git a/extras/dmenu-scripts/dmenu_run b/extras/dmenu-scripts/dmenu_run new file mode 100755 index 0000000..834ede5 --- /dev/null +++ b/extras/dmenu-scripts/dmenu_run @@ -0,0 +1,2 @@ +#!/bin/sh +dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/stest b/stest deleted file mode 100755 index 5dfee7f..0000000 Binary files a/stest and /dev/null differ diff --git a/stest.o b/stest.o deleted file mode 100644 index 8a784af..0000000 Binary files a/stest.o and /dev/null differ diff --git a/util.o b/util.o deleted file mode 100644 index 26ab857..0000000 Binary files a/util.o and /dev/null differ