summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/iconez84
1 files changed, 84 insertions, 0 deletions
diff --git a/bin/iconez b/bin/iconez
new file mode 100755
index 0000000..a570064
--- /dev/null
+++ b/bin/iconez
@@ -0,0 +1,84 @@
+#!/bin/sh
+
+set -e
+[ -n "$DEBUG" ] && set -x
+
+by_pid=
+by_name=
+fuzzy=
+desktop_files=
+while getopts n:p:dfh opt; do
+	case "$opt" in
+		n) by_name="${OPTARG}" ;;
+		p) by_pid="${OPTARG}" ;;
+		f) fuzzy=1 ;;
+		d) desktop_files=1 ;;
+		h | ?)
+			printf "usage: %s [-h]\n" "$(basename "$0")"
+			printf "\n"
+			printf "  -p \t PID\n"
+			printf "  -n \t NAME\n"
+			printf "  -f \t enable fuzzy matching (NAME only)\n"
+			printf "  -d \t try to match NAME desktop file\n"
+			printf "\n"
+			exit 2
+			;;
+	esac
+done
+shift $((OPTIND - 1))
+
+desktop_dirs="/usr/share/applications/ /usr/local/share/applications/"
+icon_dirs="/usr/share/icons/ /usr/local/share/icons/"
+
+by_name() {
+	name=$1
+
+	if [ -n "${desktop_files}" ]; then
+		[ -z "${fuzzy}" ] && name="^${name}$"
+		# try getting .desktop entry for name
+		# shellcheck disable=2086
+		ident=$(fd -e desktop "${name}" ${desktop_dirs} -x grep Icon= | cut -d= -f2 | uniq)
+	fi
+
+	if [ -z "${fuzzy}" ]; then
+		ident="^${ident:-$name}\."
+	else
+		ident="${ident:-$name}"
+	fi
+
+	# shellcheck disable=2086
+	fd -t f -e png -e svg "${ident}" ${icon_dirs}
+
+	# avoid selecting svg, can be made to prefer svg if `-v` is removed
+	# svg=$(printf "%s" "${icons}" | grep -v svg)
+	# [ -n "${svg}" ] && icons=${svg}
+
+	# printf "%s\n" "${icons}"
+}
+
+by_pid() {
+	pid=$1
+
+	arg0=
+	while true; do
+		arg0=$(awk '{print $1}' /proc/"${pid}"/comm)
+		case ${arg0} in
+			*sh)
+				pid=$(ps -p "${pid}" -o ppid= | xargs)
+				[ "$pid" = 1 ] && exit 1
+				;;
+			*) break ;;
+		esac
+	done
+
+	by_name "${arg0}"
+}
+
+# main
+if [ -n "${by_name}" ]; then
+	by_name "${by_name}"
+
+elif [ -n "${by_pid}" ]; then
+	by_pid "${by_pid}"
+
+fi