]> git.newer.systems - dmenu.git/commitdiff
re-struct 2
authorTucker Johnson <tucker@newer.systems>
Sun, 1 Jun 2025 15:23:00 +0000 (11:23 -0400)
committerTucker Johnson <tucker@newer.systems>
Sun, 1 Jun 2025 15:23:00 +0000 (11:23 -0400)
38 files changed:
Makefile
config.mk
dmenu [deleted file]
dmenu-scripts/dm-displayselect [deleted file]
dmenu-scripts/dm-handler [deleted file]
dmenu-scripts/dm-kampv [deleted file]
dmenu-scripts/dm-maimpick [deleted file]
dmenu-scripts/dm-mountcifs [deleted file]
dmenu-scripts/dm-mounter [deleted file]
dmenu-scripts/dm-pass [deleted file]
dmenu-scripts/dm-record [deleted file]
dmenu-scripts/dm-streamselect [deleted file]
dmenu-scripts/dm-sysact [deleted file]
dmenu-scripts/dm-umounter [deleted file]
dmenu-scripts/dm-unicode [deleted file]
dmenu.o [deleted file]
dmenu_path [deleted file]
dmenu_run [deleted file]
drw.o [deleted file]
extras/chars/emoji [new file with mode: 0644]
extras/chars/font-awesome [new file with mode: 0644]
extras/dmenu-scripts/dm-displayselect [new file with mode: 0755]
extras/dmenu-scripts/dm-handler [new file with mode: 0755]
extras/dmenu-scripts/dm-kampv [new file with mode: 0755]
extras/dmenu-scripts/dm-maimpick [new file with mode: 0755]
extras/dmenu-scripts/dm-mountcifs [new file with mode: 0755]
extras/dmenu-scripts/dm-mounter [new file with mode: 0755]
extras/dmenu-scripts/dm-pass [new file with mode: 0755]
extras/dmenu-scripts/dm-record [new file with mode: 0755]
extras/dmenu-scripts/dm-streamselect [new file with mode: 0755]
extras/dmenu-scripts/dm-sysact [new file with mode: 0755]
extras/dmenu-scripts/dm-umounter [new file with mode: 0755]
extras/dmenu-scripts/dm-unicode [new file with mode: 0755]
extras/dmenu-scripts/dmenu_path [new file with mode: 0755]
extras/dmenu-scripts/dmenu_run [new file with mode: 0755]
stest [deleted file]
stest.o [deleted file]
util.o [deleted file]

index 4522e49157f7508b8a1ff9542b78c3ce0c2394dd..5ae2dcc7e2875af5dcd78371f6b4e726e39d69c7 100644 (file)
--- 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
index 8531fb99e0c0ec05337a76818063b8f1a14cc053..d24f9d098b152078a50499e3c83c278be4acf15d 100644 (file)
--- 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 (executable)
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 (executable)
index 0227a32..0000000
+++ /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 (executable)
index e50178a..0000000
+++ /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 (executable)
index e7fd782..0000000
+++ /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 (executable)
index 5de26c1..0000000
+++ /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 (executable)
index 46c2b57..0000000
+++ /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 (executable)
index 3459b1a..0000000
+++ /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 (executable)
index 2c14e6f..0000000
+++ /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 (executable)
index ca6b011..0000000
+++ /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 (executable)
index ee78286..0000000
+++ /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 (executable)
index 148c1e6..0000000
+++ /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 (executable)
index 7f1dbf5..0000000
+++ /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 (executable)
index 9ae9245..0000000
+++ /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 (file)
index c63a80d..0000000
Binary files a/dmenu.o and /dev/null differ
diff --git a/dmenu_path b/dmenu_path
deleted file mode 100755 (executable)
index 3a7cda7..0000000
+++ /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 (executable)
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 (file)
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 (file)
index 0000000..6803731
--- /dev/null
@@ -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 (file)
index 0000000..3283be3
--- /dev/null
@@ -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 (executable)
index 0000000..9fdd581
--- /dev/null
@@ -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 (executable)
index 0000000..a30e743
--- /dev/null
@@ -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 (executable)
index 0000000..a61a0ea
--- /dev/null
@@ -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 (executable)
index 0000000..8aa41d7
--- /dev/null
@@ -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 (executable)
index 0000000..0b55e7c
--- /dev/null
@@ -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 (executable)
index 0000000..84b401d
--- /dev/null
@@ -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 (executable)
index 0000000..8429775
--- /dev/null
@@ -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 (executable)
index 0000000..b76aa04
--- /dev/null
@@ -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 (executable)
index 0000000..39b4d56
--- /dev/null
@@ -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 (executable)
index 0000000..3b9683f
--- /dev/null
@@ -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 (executable)
index 0000000..23f0a73
--- /dev/null
@@ -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 (executable)
index 0000000..0885363
--- /dev/null
@@ -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 (executable)
index 0000000..3a7cda7
--- /dev/null
@@ -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 (executable)
index 0000000..834ede5
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} &
diff --git a/stest b/stest
deleted file mode 100755 (executable)
index 5dfee7f..0000000
Binary files a/stest and /dev/null differ
diff --git a/stest.o b/stest.o
deleted file mode 100644 (file)
index 8a784af..0000000
Binary files a/stest.o and /dev/null differ
diff --git a/util.o b/util.o
deleted file mode 100644 (file)
index 26ab857..0000000
Binary files a/util.o and /dev/null differ