#!/usr/bin/env bash # spmenu_make imlib2=${imlib2:-true} xinerama=${xinerama:-true} openssl=${openssl:-true} fribidi=${fribidi:-true} libconfig=${libconfig:-true} xresources=${xresources:-true} wayland=${wayland:-true} x11=${x11:-true} regex=${regex:-true} prefix="${prefix:-/usr}" reconfigure=${reconfigure:-false} static=${static:-false} clean() { clean_headers rm -rf ./*.zst* ./*.tar* ./*.sig* spmenu-*.PKGBUILD build/ } check_correct_dir() { [ ! -f "spmenu.c" ] && printf "Incorrect directory.\n" && exit 1 } gen_arg_list() { [ ! -x "$(command -v spmenu)" ] && printf "spmenu must be installed for this action.\n" && exit 1 spmenu -h | grep -vE -- "- |: fancy dynamic menu" | sed "s// /g; /^[[:space:]]*$/d" } docs() { [ ! -x "$(command -v pandoc)" ] && printf "pandoc must be installed for this action.\n" && exit 1 version="$(grep "version : '" meson.build | awk '{ print $3 }' | sed "s/'\"//g; s/\"',//g")" if [ -f "docs/docs.md" ]; then printf "%% spmenu(1) ${version} | fancy dynamic menu\n" > .man.md cat docs/docs.md >> .man.md pandoc --standalone --to man .man.md -o spmenu.1 rm -f .man.md fi if [ -f "docs/run-docs.md" ]; then printf "%% spmenu_run(1) ${version} | \$PATH/.desktop launcher and file manager\n" > .man.md cat docs/run-docs.md >> .man.md pandoc --standalone --to man .man.md -o spmenu_run.1 rm -f .man.md fi if [ -f "docs/test-docs.md" ]; then printf "%% spmenu_test(1) ${version} | spmenu test script\n" > .man.md cat docs/test-docs.md >> .man.md pandoc --standalone --to man .man.md -o spmenu_test.1 rm -f .man.md fi } kblist() { grep "{ " "$1" | \ grep -v "[*]" | \ sed "s/{.i = //g; s/{.c = //g; s/{.f = //g; s/{0} }/0/g; s/ } }//g; s/,//g; s/{ //g; s/^\s*//g; s/XK_//g; s/|/+/g" > /tmp/data cat << EOF > /tmp/wipdata | Mode | Modifier | Key | Function | Argument | | :----------------- | :----------------- | :----------------- | :----------------- | :----------------- | EOF i=1 while true; do len="$(wc -l < /tmp/data)" mode="$(printf '%-18s' "$(sed -n ${i},${i}p /tmp/data | awk '{ print $1 }')")" mod="$(printf '%-18s' "$(sed -n ${i},${i}p /tmp/data | awk '{ print $2 }')")" key="$(printf '%-18s' "$(sed -n ${i},${i}p /tmp/data | awk '{ print $3 }')")" func="$(printf '%-18s' "$(sed -n ${i},${i}p /tmp/data | awk '{ print $4 }')")" arg="$(printf '%-18s' "$(sed -n ${i},${i}p /tmp/data | awk '{ print $5 }')")" cat << EOF >> /tmp/wipdata | $mode | $mod | $key | $func | $arg | EOF [ "$i" = "$len" ] && break i=$((i+1)) done cat /tmp/wipdata rm -f /tmp/wipdata /tmp/data } headers() { [ ! -x "$(command -v wayland-scanner)" ] && printf "wayland-scanner must be installed for this action.\n" && exit 1 wayland-scanner \ client-header \ protocols/wlr-layer-shell-unstable-v1.xml \ libs/wl/wlr-layer-shell-unstable-v1-client-protocol.h wayland-scanner \ client-header \ protocols/xdg-shell.xml \ libs/wl/xdg-shell-client-protocol.h wayland-scanner \ client-header \ protocols/xdg-output-unstable-v1.xml \ libs/wl/xdg-output-unstable-v1-client-protocol.h wayland-scanner \ public-code \ protocols/wlr-layer-shell-unstable-v1.xml \ libs/wl/wlr-layer-shell-unstable-v1-protocol.c wayland-scanner \ public-code \ protocols/xdg-shell.xml \ libs/wl/xdg-shell-protocol.c wayland-scanner \ public-code \ protocols/xdg-output-unstable-v1.xml \ libs/wl/xdg-output-unstable-v1-protocol.c } clean_headers() { rm -f \ libs/wl/xdg-output-unstable-v1-protocol.c \ libs/wl/xdg-shell-protocol.c \ libs/wl/wlr-layer-shell-unstable-v1-protocol.c \ libs/wl/xdg-output-unstable-v1-client-protocol.h \ libs/wl/xdg-shell-client-protocol.h \ libs/wl/wlr-layer-shell-unstable-v1-client-protocol.h } gen_pkg() { [ "$(id -u)" = "0" ] && printf "Do not run as root.\n" && exit 1 version="$(grep "version : '" meson.build | awk '{ print $3 }' | sed "s/'\"//g; s/\"',//g")" rm -f spmenu spmenu-${version}.tar.gz spmenu-${version}.PKGBUILD *.o *zst* mkdir -p spmenu-${version} cp -rf LICENSE meson.build meson_options.txt *.c *.1 scripts/ docs/ libs/ protocols/ PKGBUILD "spmenu-${version}" tar -cf spmenu-${version}.tar spmenu-${version} gzip spmenu-${version}.tar rm -rf spmenu-${version} if [ -x "$(command -v gpg)" ]; then gpg --detach-sign --yes --local-user $(whoami) spmenu-${version}.tar.gz fi if [ -x "$(command -v md5sum)" ]; then md5sum *.tar.gz | cut -d ' ' -f 1 > spmenu-${version}.tar.gz.md5 fi if [ -x "$(command -v sha256sum)" ]; then sha256sum *.tar.gz | cut -d ' ' -f 1 > spmenu-${version}.tar.gz.sha256 fi } gen_arch_pkg() { [ "$(id -u)" = "0" ] && printf "Do not run as root.\n" && exit 1 [ ! -x "$(command -v makepkg)" ] && printf "makepkg required for this action.\n" && exit 1 [ -f PKGBUILD ] || exit 1 gen_pkg cp -f PKGBUILD PKGBUILD.orig sed "s/VERSION/${version}/g; s/MD5SUM/$(md5sum *.tar.gz | cut -d ' ' -f 1)/g" PKGBUILD > .PKGBUILD && mv .PKGBUILD PKGBUILD makepkg -sfr --sign || exit 1 rm -rf src/ pkg/ cp PKGBUILD spmenu-${version}.PKGBUILD; mv -f PKGBUILD.orig PKGBUILD } generate_theme() { declare -a color read_colors() { i=1 color=() while true; do color[i]="$(sed -n ${i},${i}p $1)" ccol="${color[i]}" [ "${#ccol}" != "7" ] || [ "${ccol:0:1}" != "#" ] && color[i]="#000000" [ "$i" = "18" ] && break i=$((i+1)) done } write_array() { cat << EOF /* spmenu colorscheme generated from ${1:-None} */ theme = { color = ( { itemnormfg = "${color[17]}"; itemnormbg = "${color[18]}"; itemnormfg2 = "${color[17]}"; itemnormbg2 = "${color[18]}"; itemselfg = "${color[8]}"; itemselbg = "${color[2]}"; itemmarkedfg = "${color[1]}"; itemmarkedbg = "${color[7]}"; itemnormprifg = "${color[17]}"; itemnormpribg = "${color[18]}"; itemselprifg = "${color[17]}"; itemselpribg = "${color[13]}"; menu = "${color[18]}"; promptfg = "${color[18]}"; promptbg = "${color[4]}"; larrowfg = "${color[13]}"; rarrowfg = "${color[13]}"; larrowbg = "${color[18]}"; rarrowbg = "${color[18]}"; inputfg = "${color[17]}"; inputbg = "${color[18]}"; numfg = "${color[1]}"; numbg = "${color[10]}"; normhlfg = "${color[7]}"; normhlbg = "${color[18]}"; selhlfg = "${color[16]}"; selhlbg = "${color[1]}"; caretfg = "${color[17]}"; border = "${color[10]}"; modefg = "${color[1]}"; modebg = "${color[3]}"; capsfg = "${color[1]}"; capsbg = "${color[5]}"; sgr0 = "${color[1]}"; sgr1 = "${color[2]}"; sgr2 = "${color[3]}"; sgr3 = "${color[4]}"; sgr4 = "${color[5]}"; sgr5 = "${color[6]}"; sgr6 = "${color[7]}"; sgr7 = "${color[8]}"; sgr8 = "${color[9]}"; sgr9 = "${color[10]}"; sgr10 = "${color[11]}"; sgr11 = "${color[12]}"; sgr12 = "${color[13]}"; sgr13 = "${color[14]}"; sgr14 = "${color[15]}"; sgr15 = "${color[16]}"; } ); file = ( { global = 0; } ); }; EOF } [ ! -f "$1" ] && printf "File does not exist.\n" && exit 1 [ "$(wc -l < "$1")" != "18" ] && printf "Color list is not 18 lines long.\n" && exit 1 read_colors "$1" write_array "$1" } build() { [ -x "buildconf" ] && [ ! -x "buildconf_dev" ] && source buildconf [ -x "buildconf_dev" ] && source buildconf_dev [ ! -f "meson.build" ] && printf "meson.build does not exist.\n" && exit 1 cp -f meson.build meson.build.orig [ "$reconfigure" != "false" ] && rm -rf build/ mkdir -p build/ chown -R $(whoami) build/ || exit 1 [ "$static" = "true" ] && STATIC="--prefer-static" if [ "$reconfigure" = "true" ]; then meson setup --reconfigure $STATIC \ -Dxresources="$xresources" \ -Dfribidi="$fribidi" \ -Dxinerama="$xinerama" \ -Dimlib2="$imlib2" \ -Dopenssl="$openssl" \ -Dlibconfig="$libconfig" \ -Dwayland="$wayland" \ -Dx11="$x11" \ -Dregex="$regex" \ --prefix "$prefix" \ build || exit 1 else meson setup \ -Dxresources="$xresources" $STATIC \ -Dfribidi="$fribidi" \ -Dxinerama="$xinerama" \ -Dimlib2="$imlib2" \ -Dopenssl="$openssl" \ -Dlibconfig="$libconfig" \ -Dwayland="$wayland" \ -Dx11="$x11" \ -Dregex="$regex" \ --prefix "$prefix" \ build || exit 1 fi ninja -C build [ "$cp_build" = "true" ] && cp meson.build meson.build.used mv -f meson.build.orig meson.build } install() { [ "$(id -u)" != "0" ] && printf "This action needs to be run as root.\n" && exit 1 [ ! -d "build/" ] && build cd build/ || exit 1 meson install cd .. || exit 1 [ "$reconfigure" = "true" ] && rm -rf build/ [ "$reconfigure" = "true" ] && clean_headers } help() { cat << EOF $0 - Build spmenu $0 Build spmenu $0 install Install spmenu $0 clean Remove tarballs and pacman packages $0 dist Create a distro package for spmenu $0 arglist Create an argument list for spmenu based on spmenu -h output $0 kblist Create a keybind list in markdown column format based on keybinds.h $0 pkg_arch Create a Arch package for spmenu $0 theme Create a theme for spmenu based on 18 colors $0 docs Generate documentation such as man pages for spmenu $0 headers Generate headers using wayland-scanner $0 clean_headers Remove generated headers $0 help Print this help EOF } main() { case "$1" in "clean") action="clean" ;; "dist") action="dist" ;; "arglist") action="arglist" ;; "kblist") action="kblist" ;; "pkg_arch") action="arch" ;; "help") action="help" ;; "install") action="install" ;; "theme") action="theme" ;; "docs") action="mkdocs" ;; "headers") action="headers" ;; "clean_headers") action="clean_headers" ;; "") action="build" ;; *) [ -z "$action" ] && action="wrong" ;; esac check_correct_dir case "$action" in "wrong") printf "Invalid action: %s\n" "$1" && exit 1 ;; "clean") clean ;; "mkdocs") docs ;; "headers") headers ;; "clean_headers") clean_headers ;; "build") build ;; "install") install ;; "arch") gen_arch_pkg ;; "theme") generate_theme "$2" ;; "kblist") kblist "libs/keybinds.h" ;; "help") help ;; "arglist") gen_arg_list ;; "dist") gen_pkg ;; esac exit $? } main "$@"