From be631018946a1b9a90167e48081190794651367c Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 19:49:08 +1000 Subject: [PATCH 01/30] Add support for Dragonfly BSD and PC BSD --- ; | 3216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ neofetch | 138 ++- 2 files changed, 3279 insertions(+), 75 deletions(-) create mode 100644 ; diff --git a/; b/; new file mode 100644 index 00000000..4d6b9e6a --- /dev/null +++ b/; @@ -0,0 +1,3216 @@ +#!/usr/bin/env bash +# set -x +# vim: fdm=marker:noai:ts=4:sw=4 +# +# Neofetch info about your system +# https://github.com/dylanaraps/neofetch +# +# Required Dependencies: +# Bash 3.0+ +# xprop +# [Linux / BSD / Windows] Uptime detection: procps or procps-ng +# +# Optional Dependencies: (You'll lose these features without them) +# Displaying Images: w3m + w3m-img +# Image Cropping: ImageMagick +# Displaying song with Google Play Music: gpmdp-bash +# [ Linux / BSD ] Wallpaper Display: feh, nitrogen or gsettings +# [ Linux / BSD ] Current Song: mpc, cmus, moc +# [ Linux ] Current Song: spotify +# [ Linux / BSD ] Resolution detection: xorg-xdpyinfo +# [ OS X ] Getting screen resolution (faster): screenresolution +# +# Created by Dylan Araps +# https://github.com/dylanaraps/ + +version="${BASH_VERSION/.*}" +SYS_LOCALE="${LANG:-C}" +XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}" + +# Speed up script by not using unicode +export LC_ALL=C +export LANG=C + + +# Config Options {{{ + + +# Info Options {{{ + + +# Info +# See this wiki page for more info: +# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info +printinfo () { + info title + info underline + + info "OS" distro + info "Kernel" kernel + info "Uptime" uptime + info "Packages" packages + info "Shell" shell + info "Resolution" resolution + info "DE" de + info "WM" wm + info "WM Theme" wmtheme + info "Theme" theme + info "Icons" icons + info "Font" font + info "CPU" cpu + info "GPU" gpu + info "Memory" memory + + # info "Disk" disk + # info "Battery" battery + # info "Song" song + # info "Local IP" localip + # info "Public IP" publicip + # info "Users" users + # info "Birthday" birthday + + info linebreak + info cols + info linebreak + info linebreak +} + + +# Kernel + +# Show more kernel info +# --kernel_shorthand on/off +kernel_shorthand="on" + + +# Distro + +# Mac OS X hide/show build version +# --osx_buildversion on/off +osx_buildversion="on" + +# Mac OS X hide/show codename +# --osx_codename on/off +osx_codename="on" + +# Show 'x86_64' and 'x86' in 'Distro:' output. +# --os_arch on/off +os_arch="on" + + +# Uptime + +# Shorten the output of the uptime function +# --uptime_shorthand tiny, on, off +uptime_shorthand="off" + + +# Shell + +# Show the path to $SHELL +# --shell_path on/off +shell_path="on" + +# Show $SHELL's version +# --shell_version on/off +shell_version="off" + + +# CPU + +# CPU speed type +# Only works on Linux with cpufreq. +# --speed_type current, min, max, bios, +# scaling_current, scaling_min, scaling_max +speed_type="max" + +# CPU Display +# Set shorthand setting and progress bar setting +# --cpu_display (name, speed, tiny, on, off) (bar, infobar, barinfo, off) +cpu_shorthand="off" +cpu_display="off" + +# CPU Cores +# Display CPU cores in output +# --cpu_cores on/off +cpu_cores="on" + +# GPU + +# Shorten output of the getgpu funcion +# --gpu_shorthand on/off/tiny +gpu_shorthand="on" + +# Resolution + +# Display refresh rate next to each monitor +# Unsupported on Windows +# --refresh_rate on/off +refresh_rate="off" + +# Gtk Theme / Icons + +# Shorten output (Hide [GTK2] etc) +# --gtk_shorthand on/off +gtk_shorthand="off" + + +# Enable/Disable gtk2 theme/icons output +# --gtk2 on/off +gtk2="on" + +# Enable/Disable gtk3 theme/icons output +# --gtk3 on/off +gtk3="on" + + +# Battery + +# Which battery to display. +# By default we display all batteries. +# NOTE: Only works on Linux. +# --battery_num all, 0, 1, 2, etc +battery_num="all" + +# Whether or not to print each battery on the same line. +# By default each battery gets its own line and title. +# NOTE: Only works on Linux. +# --battery_shorthand on/off +battery_shorthand="off" + + +# IP Address + +# Website to ping for the public IP +# --ip_host url +public_ip_host="http://ident.me" + + +# Song + +# Print the Artist and Title on seperate lines +# --song_shorthand on/off +song_shorthand="off" + + +# Birthday + +# Whether to show a long pretty output +# or a shortened one +# NOTE: Long pretty output doesn't work on OpenBSD or NetBSD. +# --birthday_shorthand on/off +birthday_shorthand="off" + +# Whether to show the time in the output +# --birthday_time on/off +birthday_time="on" + +# Date format to use when printing birthday +# --birthday_format "format" +birthday_format="%a %d %b %Y %l:%M %p" + + +# Color Blocks + +# Color block range +# --block_range start end +start=0 +end=7 + +# Toggle color blocks +# --color_blocks on/off +color_blocks="on" + +# Color block width +# --color_block_width num +block_width=3 + + +# }}} + +# Text Colors {{{ + + +# Text Colors +# Each number represents a different part of +# the text in this order: +# title, @, underline, subtitle, colon, info +# colors=(4 6 1 8 8 6) +# You can also specify: +# fg (foreground color) +colors=(distro) + + +# }}} + +# Text Options {{{ + + +# Toggle line wrapping +# --line_wrap on/off +line_wrap="off" + +# Toggle bold text +# --bold on/off +bold="on" + +# Enable/Disable Underline +# --underline on/off +underline_enabled="on" + +# Underline character +# --underline_char char +underline_char="-" + +# Prompt height +# You should only have to change this if your +# prompt is greater than 2 lines high. +# --prompt_height num +prompt_height=1 + + +# }}} + +# Progress Bars {{{ + + +# Progress bar character +# --progress_char elapsed_char total_char +progress_char_elapsed="=" +progress_char_total="-" + +# Progress vorder +# --progress_border on/off +progress_border="on" + +# Progress bar length in spaces +# Number of chars long to make the progress bars. +# --progress_length num +progress_length="15" + +# Progress bar colors +# When set to distro, uses your distro's logo colors +# Takes: num, "distro" +# --progress_colors col col +progress_color_elapsed="distro" +progress_color_total="distro" + +# Customize how the info is displayed. +# bar: Only the progress bar is displayed. +# infobar: The bar is displayed after the info. +# barinfo: The bar is displayed before the info. +# off: Only the info is displayed. +# +# --memory_display bar/infobar/barinfo/off +# --battery_display bar/infobar/barinfo/off +# --disk_display bar/infobar/barinfo/off +memory_display="off" +battery_display="off" +disk_display="off" + + +# }}} + +# Image Options {{{ + + +# Image Source +# --image wall, ascii, /path/to/img, /path/to/dir/, off +image="wall" + +# Thumbnail directory +thumbnail_dir="$HOME/.cache/thumbnails/neofetch" + +# W3m-img path +# This is automatically detected, this variable +# should only be set to w3m-img's location if the +# builtin detection doesn't work. +w3m_img_path="/usr/lib/w3m/w3mimgdisplay" + +# Image position +# Only works with the w3m backend +# --image_position left/right +image_position="left" + +# Crop mode +# --crop_mode normal/fit/fill +crop_mode="normal" + +# Crop offset +# Only affects normal mode. +# --crop_offset northwest/north/northeast/west/center +# east/southwest/south/southeast +crop_offset="center" + +# Image size +# The image is half the terminal width by default. +# --size auto, 00px, 00% +image_size="auto" + +# Right gap between image and text +# --gap num +gap=2 + +# Image offsets +# --xoffset px +# --yoffset px +yoffset=0 +xoffset=0 + + +# }}} + +# Ascii Options {{{ + + +# Default ascii image to use +# When this is set to distro it will use your +# distro's logo as the ascii. +# --ascii 'distro', path/to/ascii +ascii="distro" + +# Ascii colors +# When this is set to distro it will use your +# ditro's colors to color the ascii. +# NOTE: You can also set this to a range of colors +# which will allow you to custom color distro logos +# --ascii_colors distro +# --ascii_colors 2 4 5 6 +ascii_colors=(distro) + +# Logo size +# Arch, Crux and Gentoo have a smaller logo +# variant. Changing the value below to 'small' +# will make neofetch use the small logo. +# --ascii_logo_size small, normal +ascii_logo_size="normal" + + +# }}} + +# Scrot Options {{{ + + +# Whether or not to always take a screenshot +# You can manually take a screenshot with "--scrot" or "-s" +scrot="off" + +# Screenshot program to launch +# --scrot_cmd +scrot_cmd="scrot -c -d 3" + +# Scrot dir +# Where to save the screenshots +# --scrot_dir /path/to/screenshot/folder +scrot_dir="$HOME/Pictures/" + +# Scrot filename +# What to name the screenshots +# --scrot_name str +scrot_name="neofetch-$(date +%F-%T).png" + + +# }}} + +# Stdout options {{{ + +# Separator for stdout mode +# --stdout_separator string +stdout_separator=" " + +# }}} + +# Config Options {{{ + + +# Enable/Disable config file +# --config off, none +config="on" + +# Path to custom config file location +# --config path/to/config +config_file="${XDG_CONFIG_HOME:-${HOME}/.config}/neofetch/config" + + +# }}} + + +# }}} + + +# Gather Info {{{ + + +# Set no case match and extended globbing. +shopt -s nocasematch extglob + + +# Operating System {{{ + +case "$(uname)" in + "Linux") os="Linux" ;; + "Darwin") os="$(sw_vers -productName)" ;; + "OpenBSD") os="OpenBSD" ;; + *"BSD") os="BSD" ;; + "CYGWIN"*) os="Windows" ;; + *) printf "%s\n" "Unknown OS detected: $(uname)"; exit 1 ;; +esac + +# }}} + +# Distro {{{ + +getdistro () { + [ ! -z "$distro" ] && return + + case "$os" in + "Linux" ) + if type -p lsb_release >/dev/null 2>&1; then + distro="$(lsb_release -d 2>/dev/null | awk -F ':' '/Description/ {printf $2}')" + distro=${distro/[[:space:]]} + + elif type -p crux >/dev/null 2>&1; then + distro="$(crux)" + + else + distro="$(awk -F 'NAME=' '/^NAME=/ {printf $2}' /etc/*ease)" + distro=${distro//\"} + + # Workaround for distros that store the value differently. + [ -z "$distro" ] && distro="$(awk -F 'TAILS_PRODUCT_NAME="|"' '/^TAILS_PRODUCT_NAME=/ {printf $2}' /etc/*ease)" + [ -z "$distro" ] && distro="$(awk '/BLAG/ {print $1; exit}' /etc/*ease)" + fi + ;; + + "Mac OS X") + osx_version=$(sw_vers -productVersion) + osx_build=$(sw_vers -buildVersion) + + case "${osx_version%.*}" in + "10.4") codename="Mac OS X Tiger" ;; + "10.5") codename="Mac OS X Leopard" ;; + "10.6") codename="Mac OS X Snow Leopard" ;; + "10.7") codename="Mac OS X Lion" ;; + "10.8") codename="OS X Mountain Lion" ;; + "10.9") codename="OS X Mavericks" ;; + "10.10") codename="OS X Yosemite" ;; + "10.11") codename="OS X El Capitan" ;; + *) codename="Mac OS X" ;; + esac + distro="$codename $osx_version $osx_build" + ;; + + "iPhone OS") + distro="iOS $(sw_vers -productVersion)" + + # "uname -m" doesn't print architecture on iOS so we force it off. + os_arch="off" + ;; + + "OpenBSD") + distro="OpenBSD" + ;; + + "BSD") + distro="$(uname -sr)" + ;; + + "Windows") + distro="$(wmic os get Caption /value)" + + # Strip crap from the output of wmic + distro=${distro/Caption'='} + distro=${distro//[[:space:]]/ } + distro=${distro// } + distro=${distro/Microsoft } + ;; + esac + distro=${distro//+( )/ } + + # Get architecture + [ "$os_arch" == "on" ] && \ + distro+=" $(uname -m)" + + [ "$osx_codename" == "off" ] && \ + distro=${distro/${codename}/Mac OS X} + + [ "$osx_buildversion" == "off" ] && \ + distro=${distro/ ${osx_build}} +} + + +# }}} + +# Title {{{ + +gettitle () { + title="${USER:-$(whoami)}@${HOSTNAME:-$(hostname)}" +} + +# }}} + +# Kernel {{{ + +getkernel() { + case "$kernel_shorthand" in + "on") kernel="$(uname -r)" ;; + "off") kernel="$(uname -srm)" ;; + esac +} + +# }}} + +# Uptime {{{ + +getuptime () { + case "$os" in + "Linux" | "Windows") + case "$distro" in + *"Puppy"* | "Quirky Werewolf"* | "Alpine Linux"* | "Windows"*) + uptime=$(uptime | awk -F ':[0-9]{2}+ |(, ){1}+' '{printf $2}') + ;; + + "openSUSE"*) + uptime=$(uptime | awk -F ':[0-9]{2}+[a-z][a-z] |(, ){1}+' '{printf $2}') + ;; + + *) + uptime="$(uptime -p)" + [ "$uptime" == "up " ] && uptime="up $(awk -F'.' '{print $1}' /proc/uptime) seconds" + ;; + esac + ;; + + "Mac OS X" | "iPhone OS" | *"BSD") + # Get boot time in seconds + boot="$(sysctl -n kern.boottime)" + boot="${boot/'{ sec = '}" + boot=${boot/,*} + + # Get current date in seconds + now=$(date +%s) + uptime=$((now - boot)) + + # Convert uptime to days/hours/mins + minutes=$((uptime / 60%60)) + hours=$((uptime / 3600%24)) + days=$((uptime / 86400)) + + case "$minutes" in + 1) minutes="1 minute" ;; + 0) unset minutes ;; + *) minutes="$minutes minutes" ;; + esac + + case "$hours" in + 1) hours="1 hour" ;; + 0) unset hours ;; + *) hours="$hours hours" ;; + esac + + case "$days" in + 1) days="1 day" ;; + 0) unset days ;; + *) days="$days days" ;; + esac + + [ ! -z "$hours" ] && \ + [ ! -z "$minutes" ] && \ + hours+="," + + [ ! -z "$days" ] && \ + [ ! -z "$hours" ] && \ + days+="," + + uptime="up $days $hours $minutes" + ;; + esac + + # Make the output of uptime smaller. + case "$uptime_shorthand" in + "on") + uptime=${uptime/up } + uptime=${uptime/minutes/mins} + uptime=${uptime/minute/min} + uptime=${uptime/seconds/secs} + uptime=${uptime# } + ;; + + "tiny") + uptime=${uptime/up } + uptime=${uptime/ days/d} + uptime=${uptime/ day/d} + uptime=${uptime/ hours/h} + uptime=${uptime/ hour/h} + uptime=${uptime/ minutes/m} + uptime=${uptime/ minute/m} + uptime=${uptime/ seconds/s} + uptime=${uptime/,} + uptime=${uptime# } + ;; + esac + uptime=${uptime//+( )/ } +} + +# }}} + +# Package Count {{{ + +getpackages () { + case "$os" in + "Linux" | "iPhone OS") + type -p pacman >/dev/null 2>&1 && \ + packages="$(pacman -Qq --color never | wc -l)" + + type -p dpkg >/dev/null 2>&1 && \ + packages=$((packages+=$(dpkg --get-selections | grep -cv deinstall$))) + + type -p /sbin/pkgtool >/dev/null 2>&1 && \ + packages=$((packages+=$(ls -1 /var/log/packages | wc -l))) + + type -p rpm >/dev/null 2>&1 && \ + packages=$((packages+=$(rpm -qa | wc -l))) + + type -p xbps-query >/dev/null 2>&1 && \ + packages=$((packages+=$(xbps-query -l | wc -l))) + + type -p pkginfo >/dev/null 2>&1 && \ + packages=$((packages+=$(pkginfo -i | wc -l))) + + type -p pisi >/dev/null 2>&1 && \ + packages=$((packages+=$(pisi list-installed | wc -l))) + + type -p pkg >/dev/null 2>&1 && \ + packages=$((packages+=$(ls -1 /var/db/pkg | wc -l))) + + type -p emerge >/dev/null 2>&1 && \ + packages=$((packages+=$(ls -d /var/db/pkg/*/* | wc -l))) + + type -p nix-env >/dev/null 2>&1 && \ + packages=$((packages+=$(ls -d -1 /nix/store/*/ | wc -l))) + + type -p apk >/dev/null 2>&1 && \ + packages=$((packages+=$(apk info | wc -l))) + + type -p pacman-g2 >/dev/null 2>&1 && \ + packages=$((packages+=$(pacman-g2 -Q | wc -l))) + + type -p cave >/dev/null 2>&1 && \ + packages=$((packages+=$(ls -d -1 /var/db/paludis/repositories/cross-installed/*/data/* /var/db/paludis/repositories/installed/data/* | wc -l))) + ;; + + "Mac OS X") + [ -d "/usr/local/bin" ] && \ + packages=$(($(ls -l /usr/local/bin/ | grep -v "\(../Cellar/\|brew\)" | wc -l) - 1)) + + type -p port >/dev/null 2>&1 && \ + packages=$((packages + $(port installed 2>/dev/null | wc -l) - 1)) + + type -p brew >/dev/null 2>&1 && \ + packages=$((packages + $(find /usr/local/Cellar -maxdepth 1 2>/dev/null | wc -l) - 1)) + + type -p pkgin >/dev/null 2>&1 && \ + packages=$((packages + $(pkgin list 2>/dev/null | wc -l))) + ;; + + *"BSD") + if type -p pkg_info >/dev/null 2>&1; then + packages=$(pkg_info | wc -l) + + elif type -p pkg >/dev/null 2>&1; then + packages=$(pkg info | wc -l) + fi + ;; + + "Windows") + packages=$(cygcheck -cd | wc -l) + + # Count chocolatey packages + [ -d "/cygdrive/c/ProgramData/chocolatey/lib" ] && \ + packages=$((packages+=$(ls -1 /cygdrive/c/ProgramData/chocolatey/lib | wc -l))) + ;; + esac + packages=${packages// } +} + +# }}} + +# Shell {{{ + +getshell () { + case "$shell_path" in + "on") shell="$SHELL" ;; + "off") shell="${SHELL##*/}" ;; + esac + + if [ "$shell_version" == "on" ]; then + shell+=" " + case "$shell" in + *"bash"*) + shell+="$(bash --version | head -n 1)" + shell=${shell/ *, version} + ;; + + *"zsh"*) + shell+="$(zsh --version)" + shell=${shell/ zsh} + ;; + + *"mksh"* | *"ksh") + shell+="$("$SHELL" -c 'printf "%s" "$KSH_VERSION"')" + shell=${shell/ * KSH} + ;; + + *"tcsh"* | *"csh"*) + shell+="$("$SHELL" --version)" + shell=${shell/tcsh} + shell=${shell/\(*} + ;; + esac + + shell="${shell/\(*\)}" + fi +} + +# }}} + +# Desktop Environment {{{ +getde () { + case "$os" in + "Mac OS X") de="Aqua" ;; + *) + de="${XDG_CURRENT_DESKTOP/i3}" + de=${de/'X-'} + ;; + esac + + if [ -n "$DISPLAY" ] && [ -z "$de" ]; then + de="$(xprop -root | awk '/KDE_SESSION_VERSION|^_MUFFIN|xfce4|xfce5/' 2>/dev/null)" + + case "$de" in + "KDE_SESSION_VERSION"*) de="KDE${de/* = }" ;; + *"TDE_FULL_SESSION"*) de="Trinity" ;; + *"MUFFIN"*) de="Cinnamon" ;; + *"xfce4"*) de="XFCE4" ;; + *"xfce5"*) de="XFCE5" ;; + esac + fi +} + +# }}} + +# Window Manager {{{ + +getwm () { + if [ -n "$DISPLAY" ] && [ "$os" != "Mac OS X" ]; then + id="$(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}')" + wm="$(xprop -id "$id" -notype -f _NET_WM_NAME 8t)" + wm=${wm/*_NET_WM_NAME = } + wm=${wm/\"} + wm=${wm/\"*} + + # Fallback for Wayland wms + case "$wm" in + "xwlc") + wm="$(ps -e | grep -m 1 -oE "sway|orbment|velox|orbital")" + [ "$version" -ge 4 ] && wm=${wm^} + ;; + esac + + else + case "$os" in + "Mac OS X") wm="Quartz Compositor" ;; + "Windows") wm="Explorer" ;; + esac + fi +} + +# }}} + +# Window Manager Theme {{{ + +getwmtheme () { + [ -z "$wm" ] && getwm + [ -z "$de" ] && getde + + case "$wm" in + 'BudgieWM') wmtheme="$(gsettings get org.gnome.desktop.wm.preferences theme)" ;; + 'E16') wmtheme="$(awk -F "= " '/theme.name/ {print $2}' "$HOME/.e16/e_config--0.0.cfg")";; + 'Sawfish') wmtheme="$(awk -F ")" '/\(quote default-frame-style/ {print $2}' "$HOME/.sawfish/custom")" ;; + + 'Cinnamon' | 'Muffin' | 'Mutter (Muffin)') + detheme="$(gsettings get org.cinnamon.theme name)" + wmtheme="$(gsettings get org.cinnamon.desktop.wm.preferences theme)" + wmtheme="$detheme (${wmtheme})" + ;; + + 'Compiz' | 'Mutter'* | 'GNOME Shell' | 'Gala') + if type -p gsettings >/dev/null 2>&1; then + wmtheme="$(gsettings get org.gnome.desktop.wm.preferences theme)" + + elif type -p gconftool-2 >/dev/null 2>&1; then + wmtheme="$(gconftool-2 -g /apps/metacity/general/theme)" + fi + ;; + + 'Metacity'*) + if [ "$de" == "Deepin" ]; then + wmtheme="$(gsettings get com.deepin.wrap.gnome.desktop.wm.preferences theme 2>/dev/null)" + + else + wmtheme="$(gconftool-2 -g /apps/metacity/general/theme 2>/dev/null)" + fi + ;; + + 'E17' | 'Enlightenment') + if type -p eet >/dev/null 2>&1; then + wmtheme="$(eet -d $HOME/.e/e/config/standard/e.cfg config | awk '/value \"file\" string.*.edj/ {print $4}')" + wmtheme=${wmtheme##*/} + wmtheme=${wmtheme%.*} + fi + ;; + + 'Fluxbox') + [ -f $HOME/.fluxbox/init ] && \ + wmtheme="$(awk -F "/" '/styleFile/ {print $NF}' "$HOME/.fluxbox/init")" + ;; + + 'IceWM'*) + [ -f $HOME/.icewm/theme ] && \ + wmtheme="$(awk -F "[\",/]" '!/#/ {print $2}' "$HOME/.icewm/theme")" + ;; + + 'Openbox') + if [ "$de" == "LXDE" ] && [ -f "${HOME}/.config/openbox/lxde-rc.xml" ]; then + ob_file="lxde-rc" + + elif [ -f "${HOME}/.config/openbox/rc.xml" ]; then + ob_file="rc" + fi + + wmtheme="$(awk -F "[<,>]" '//dev/null)" + wmtheme="${wmtheme##*\\}" + wmtheme="${wmtheme%.*}" + wmtheme="${wmtheme^}" + ;; + + esac + + wmtheme="${wmtheme//\'}" + [ "$version" -ge 4 ] && wmtheme=${wmtheme^} +} + +# }}} + +# CPU {{{ + +getcpu () { + case "$os" in + "Mac OS X") + cpu="$(sysctl -n machdep.cpu.brand_string)" + cores=$(sysctl -n hw.ncpu) + ;; + + "iPhone OS") + ios_model=${ios_model:-$(uname -m)} + case "$ios_model" in + "iPhone1,1" | "iPhone1,2" | "iPod1,1") + cpu="Samsung S5L8900 @ 412MHz" + cores="1" + ;; + + "iPhone2,1") + cpu="Samsung S5PC100 @ 600MHz" + cores="1" + ;; + + "iPhone3,1" | "iPhone3,2" | "iPhone3,3" | "iPod4,1") + cpu="Apple A4 @ 800MHz" + cores="1" + ;; + + "iPhone4,1" | "iPod5,1") + cpu="Apple A5 @ 800MHz" + cores="2" + ;; + + "iPhone5,1" | "iPhone5,2" | "iPhone5,3" | "iPhone5,4") + cpu="Apple A6 @ 1.3GHz" + cores="2" + ;; + + "iPhone6,1" | "iPhone6,2") + cpu="Apple A7 @ 1.3GHz" + cores="2" + ;; + + "iPhone7,1" | "iPhone7,2") + cpu="Apple A8 @ 1.4GHz" + cores="2" + ;; + + "iPhone8,1" | "iPhone8,2" | "iPhone8,4") + cpu="Apple A9 @ 1.85GHz" + cores="2" + ;; + + "iPod2,1") + cpu="Samsung S5L8720 @ 533MHz" + cores="1" + ;; + + "iPod3,1") + cpu="Samsung S5L8922 @ 600MHz" + cores="1" + ;; + + "iPod7,1") + cpu="Apple A8 @ 1.1GHz" + cores="2" + ;; + + "iPad1,1") + cpu="Apple A4 @ 1GHz" + cores="1" + ;; + + "iPad2,1" | "iPad2,2" | "iPad2,3" | "iPad2,4" | "iPad2,5" | "iPad2,6" | "iPad2,7") + cpu="Apple A5 @ 1GHz" + cores="2" + ;; + + "iPad3,1" | "iPad3,2" | "iPad3,3") + cpu="Apple A5X @ 1GHz" + cores="2" + ;; + + "iPad3,4" | "iPad3,5" | "iPad3,6") + cpu="Apple A6X @ 1.4GHz" + cores="2" + ;; + + "iPad4,1" | "iPad4,2" | "iPad4,3") + cpu="Apple A7 @ 1.4GHz" + cores="2" + ;; + + "iPad4,4" | "iPad4,5" | "iPad4,6" | "iPad4,7" | "iPad4,8" | "iPad4,9") + cpu="Apple A7 @ 1.4GHz" + cores="2" + ;; + + "iPad5,1" | "iPad5,2") + cpu="Apple A8 @ 1.5GHz" + cores="2" + ;; + + "iPad5,3" | "iPad5,4") + cpu="Apple A8X @ 1.5GHz" + cores="3" + ;; + + "iPad6,3" | "iPad6,4") + cpu="Apple A9X @ 2.16GHz" + cores="2" + ;; + + "iPad6,7" | "iPad6,8") + cpu="Apple A9X @ 2.26GHz" + cores="2" + ;; + esac + ;; + + *) + case "$distro" in + "OpenBSD"* | "FreeBSD"*) + # Get cpu name + cpu="$(sysctl -n hw.model)" + cpu=${cpu/[0-9]\.*} + cpu=${cpu/ @*} + + # Get cpu speed + case "$distro" in + "OpenBSD"*) speed=$(sysctl -n hw.cpuspeed) ;; + "FreeBSD"*) speed=$(sysctl -n hw.clockrate) ;; + esac + speed=$((speed / 100)) + cores=$(sysctl -n hw.ncpu) + ;; + + *) + # Get cpu name + cpu="$(awk -F ': | @' '/model name/ {printf $2; exit}' /proc/cpuinfo)" + + # Get cpu speed + if [ -d "/sys/devices/system/cpu/cpu0/cpufreq" ]; then + case "$speed_type" in + current) speed_type="scaling_cur_freq" ;; + min) speed_type="scaling_min_freq" ;; + max) speed_type="scaling_max_freq" ;; + bios) speed_type="bios_limit" ;; + scaling_current) speed_type="scaling_cur_freq" ;; + scaling_min) speed_type="scaling_min_freq" ;; + scaling_max) speed_type="scaling_max_freq" ;; + esac + + read -t 1 -r speed < \ + /sys/devices/system/cpu/cpu0/cpufreq/${speed_type} + + speed=$((speed / 100000)) + else + speed=$(awk -F ': |\\.' '/cpu MHz/ {printf $2; exit}' /proc/cpuinfo) + speed=$((speed / 100)) + fi + + cores=$(awk -F ': ' '/siblings/ {printf $2; exit}' /proc/cpuinfo) + ;; + esac + + # Fix for speeds under 1ghz + if [ -z "${speed:1}" ]; then + speed="0.${speed}" + else + speed=${speed:0:1}.${speed:1} + fi + + cpu="$cpu @ ${speed}GHz" + ;; + esac + + # Remove uneeded patterns from cpu output + # This is faster than sed/gsub + cpu=${cpu//(tm)} + cpu=${cpu//(TM)} + cpu=${cpu//(r)} + cpu=${cpu//(R)} + cpu=${cpu//CPU} + cpu=${cpu//Processor} + cpu=${cpu//Six-Core} + cpu=${cpu//Eight-Core} + cpu=${cpu/Dual-Core} + cpu=${cpu/Quad-Core} + cpu=${cpu//with Radeon HD Graphics} + + # Add cpu cores to output + [ "$cpu_cores" == "on" ] && [ ! -z "$cores" ] && \ + cpu=${cpu/@/\(${cores}\) @} + + # Make the output of cpu shorter + case "$cpu_shorthand" in + "name") + cpu=${cpu/@*} + ;; + + "speed") + cpu=${cpu#*@ } + ;; + + "on" | "tiny") + cpu=${cpu/Intel } + cpu=${cpu/Core } + cpu=${cpu/Core? Duo } + cpu=${cpu/AMD } + + case "$cpu_shorthand" in + "tiny") cpu=${cpu/@*} ;; + esac + ;; + esac + + # Trim whitespace + cpu=${cpu//+( )/ } + + [ ! -z "$cpu" ] && prin "$subtitle" "$cpu" + + if [ "$cpu_display" != "off" ]; then + cpu_usage="$(ps aux | awk 'BEGIN { sum = 0 } { sum += $3 }; END { print sum }')" + cpu_usage="${cpu_usage/\.*}%" + + case "$cpu_display" in + "info") prin "$subtitle Usage" "$cpu_usage" ;; + "bar") prin "$subtitle Usage" "$(bar "${cpu_usage/'%'}" $(( 100 * cores )))" ;; + "infobar") prin "$subtitle Usage" "${cpu_usage} $(bar "${cpu_usage/'%'}" $(( 100 * cores )))" ;; + "barinfo") prin "$subtitle Usage" "$(bar "${cpu_usage/'%'}" $(( 100 * cores ))) $cpu_usage" ;; + esac + fi + [ "$stdout_mode" != "on" ] && unset cpu +} + +# }}} + +# GPU {{{ + +getgpu () { + case "$os" in + "Linux") + gpu="$(PATH="/sbin:$PATH" lspci | grep -F "3D")" + + # If a GPU with a prefix of '3D' doesn't exist + # fallback to looking for a prefix of 'VGA' + [ -z "$gpu" ] && \ + gpu="$(PATH="/sbin:$PATH" lspci | grep -F "VGA")" + + gpu=${gpu//??':'??'.'?} + + # Count the number of GPUs + count="$(printf "%s" "$gpu" | uniq -c)" + count=${count/ VGA*} + count=${count/ 3D*} + count=${count//[[:space:]]} + + # If there's more than one gpu + # Display the count. + if [ "$count" -gt 1 ]; then + count=" x $count" + else + unset count + fi + + # Format the output + gpu=${gpu/* VGA compatible controller: } + gpu=${gpu/* 3D controller: } + gpu=${gpu/(rev*)} + + case "$gpu" in + intel*) + gpu="Intel Integrated Graphics" + ;; + + advanced*) + gpu=${gpu/Advanced Micro Devices, Inc\. } + gpu=${gpu/'[AMD/ATI]' } + gpu=${gpu/Tahiti PRO} + gpu=${gpu/Seymour} + gpu=${gpu/Cayman} + gpu=${gpu/Richland} + gpu=${gpu/Pitcairn} + gpu=${gpu/Broadway} + gpu=${gpu/XTMobility} + gpu=${gpu/Mobility} + gpu=${gpu/Hawaii} + gpu=${gpu/Tobago} + gpu=${gpu/Thames} + gpu=${gpu/Kabini} + gpu=${gpu/Bonaire} + gpu=${gpu/XTX} + gpu=${gpu/ OEM} + gpu=${gpu/ Cape Verde} + gpu=${gpu/ \[} + gpu=${gpu/\]} + + brand="AMD " + ;; + + nvidia*) + gpu=${gpu/NVIDIA Corporation } + gpu=${gpu/G????M } + gpu=${gpu/G???? } + gpu=${gpu/\[} + gpu=${gpu/\] } + + brand="NVIDIA " + ;; + + *virtualbox*) + gpu="VirtualBox Graphics Adapter" + ;; + esac + + gpu="${brand}${gpu}" + ;; + + "Mac OS X") + # Use cache if it exists + if [ -f "/Library/Caches/neofetch/gpu" ]; then + source "/Library/Caches/neofetch/gpu" + else + gpu=$(system_profiler SPDisplaysDataType | awk -F': ' '/^\ *Chipset Model:/ {printf $2 ", "}') + gpu=${gpu//'/ $'} + gpu=${gpu%,*} + cache "gpu" "$gpu" "/Library/Caches/" + fi + ;; + + "iPhone OS") + ios_model=${ios_model:-$(uname -m)} + case "$ios_model" in + "iPhone1,1" | "iPhone1,2") + gpu="PowerVR MBX Lite 3D" + ;; + + "iPhone2,1" | "iPhone3,1" | "iPhone3,2" | "iPhone3,3" | "iPod3,1" | "iPod4,1" | "iPad1,1") + gpu="PowerVR SGX535" + ;; + + "iPhone4,1" | "iPad2,1" | "iPad2,2" | "iPad2,3" | "iPad2,4" | "iPad2,5" | "iPad2,6" | "iPad2,7" | "iPod5,1") + gpu="PowerVR SGX543MP2" + ;; + + "iPhone5,1" | "iPhone5,2" | "iPhone5,3" | "iPhone5,4") + gpu="PowerVR SGX543MP3" + ;; + + "iPhone6,1" | "iPhone6,2" | "iPad4,1" | "iPad4,2" | "iPad4,3" | "iPad4,4" | "iPad4,5" | "iPad4,6" | "iPad4,7" | "iPad4,8" | "iPad4,9") + gpu="PowerVR G6430" + ;; + + "iPhone7,1" | "iPhone7,2" | "iPod7,1" | "iPad5,1" | "iPad5,2") + gpu="PowerVR GX6450" + ;; + + "iPhone8,1" | "iPhone8,2" | "iPhone8,4") + gpu="PowerVR GT7600" + ;; + + "iPod1,1" | "iPod2,1") + gpu="PowerVR MBX Lite" + ;; + + "iPad3,1" | "iPad3,2" | "iPad3,3") + gpu="PowerVR SGX534MP4" + ;; + + "iPad3,4" | "iPad3,5" | "iPad3,6") + gpu="PowerVR SGX554MP4" + ;; + + "iPad5,3" | "iPad5,4") + gpu="PowerVR GXA6850" + ;; + + "iPad6,3" | "iPad6,4" | "iPad6,7" | "iPad6,8") + gpu="PowerVR 7XT" + ;; + esac + ;; + + *"BSD") + case "$distro" in + "FreeBSD"*) + gpu=$(pciconf -lv 2>/dev/null | grep -B 4 "VGA" | grep "device") + gpu=${gpu/device*= } + gpu=${gpu//\'} + ;; + + *) + gpu=$(glxinfo | grep -F 'OpenGL renderer string') + gpu=${gpu/'OpenGL renderer string: '} + ;; + esac + ;; + + + "Windows") + gpu=$(wmic path Win32_VideoController get caption /value) + gpu=${gpu/Caption'='} + gpu=${gpu//[[:space:]]/ } + gpu=${gpu// } + ;; + esac + + case "$gpu_shorthand" in + "on" | "tiny") + gpu=${gpu// Rev\. ?} + gpu=${gpu//AMD*\/ATI\]/AMD} + gpu=${gpu// Tahiti} + gpu=${gpu// PRO} + gpu=${gpu// OEM} + gpu=${gpu// Mars} + gpu=${gpu// Series} + gpu=${gpu// Controller} + gpu=${gpu/\/*} + + case "$gpu_shorthand" in + "tiny") + gpu=${gpu/Graphics } + gpu=${gpu/GeForce } + gpu=${gpu/Radeon } + ;; + esac + ;; + esac + + gpu=${gpu//+( )/ } + gpu="${gpu}${count}" +} + +# }}} + +# Memory {{{ + +getmemory () { + case "$os" in + "Linux" | "Windows") + if [ ! -z "$(grep -F "MemAvail" /proc/meminfo)" ]; then + mem=($(awk -F ':| kB' '/MemTotal|MemAvail/ {printf $2}' /proc/meminfo)) + memused=$((mem[0] - mem[1])) + else + mem=($(awk -F ':| kB' '/MemTotal|MemFree|Buffers|Cached/ {printf $2}' /proc/meminfo) 0 0) + memused=$((mem[0] - mem[1] - mem[2] - mem[3])) + fi + + memused=$((memused / 1024)) + memtotal=$((mem[0] / 1024)) + ;; + + "Mac OS X" | "iPhone OS") + memtotal=$(printf "%s\n" "$(sysctl -n hw.memsize)"/1024^2 | bc) + memwired=$(vm_stat | awk '/wired/ { print $4 }') + memactive=$(vm_stat | awk '/active / { printf $3 }') + memcompressed=$(vm_stat | awk '/occupied/ { printf $5 }') + memused=$(((${memwired//.} + ${memactive//.} + ${memcompressed//.}) * 4 / 1024)) + ;; + + "OpenBSD" | "BSD") + case "$distro" in + "OpenBSD"*) + mem=($(top -d 1 | awk -F ': |/| |M' '/Memory:/ {printf $4 " " $6 " " $11 "\n"}')) + memtotal=$((${mem[1]} + ${mem[2]})) + memused=$((memtotal - ${mem[0]})) + ;; + + "FreeBSD"*) + memtotal=$(dmesg | awk '/real mem/ {printf $5}') + memtotal=${memtotal/\(} + memtotal=${memtotal/MB\)} + memfree=$(top -d 1 | awk '/Mem:/ {printf $10}') + memfree=${memfree/M} + memused=$((memtotal - memfree)) + ;; + + "NetBSD"*) + memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) + memused=$(($(vmstat | awk 'END{printf $3}') / 1000)) + memtotal=$((memused + memfree)) + memused=$((memtotal - memfree)) + ;; + esac + + ;; + esac + memory="${memused}MB / ${memtotal}MB" + + # Progress bars + case "$memory_display" in + "bar") memory="$(bar "${memused}" "${memtotal}")" ;; + "infobar") memory="${memory} $(bar "${memused}" "${memtotal}")" ;; + "barinfo") memory="$(bar "${memused}" "${memtotal}") ${memory}" ;; + esac +} + +# }}} + +# Song {{{ + +getsong () { + if mpc version >/dev/null 2>&1; then + song="$(mpc current 2>/dev/null)" + state=$(mpc | awk -F '\\[|\\]' '/\[/ {printf $2}' 2>/dev/null) + + elif [ -n "$(ps x | awk '!(/awk/) && /cmus/')" ]; then + song="$(cmus-remote -Q | grep "tag artist\|title" 2>/dev/null)" + song=${song/tag artist } + song=${song/tag title/-} + song=${song//[[:space:]]/ } + state=$(cmus-remote -Q | awk -F ' ' '/status/ {printf $2}' 2>/dev/null) + + elif pgrep "mocp" >/dev/null 2>&1; then + song="$(mocp -Q "%artist - %song" 2>/dev/null)" + state="$(mocp -Q "%state" 2>/dev/null)" + + elif [ -n "$(ps x | awk '!(/awk/) && /spotify/')" ]; then + case "$os" in + "Linux") + # This command is way too long + song="$(\ + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \ + org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' |\ + awk -F 'string "' '/string|array/ {printf "%s",$2; next}{print ""}' |\ + awk -F '"' '/artist|title/ {printf $2 " - "}' + )" + song=${song% - } + song=${song/'('*} + song=${song//'['*} + ;; + + "Mac OS X") + song="$(osascript -e 'tell application "Spotify" to artist of current track as string & " - " & name of current track as string')" + state="$(osascript -e 'tell application "Spotify" to player state as string')" + ;; + esac + + elif [ -n "$(ps x | awk '!(/awk/ || /Helper/) && /Google Play Music Desktop Player/')" ] && type -p gpmdp >/dev/null 2>&1; then + song="$(gpmdp current)" + state="$(gpmdp status)" + + elif [ -n "$(ps x | awk '!(/awk/ || /Helper/) && /iTunes/')" ]; then + song="$(osascript -e 'tell application "iTunes" to artist of current track as string & " - " name of current track as string')" + state="$(osascript -e 'tell application "iTunes" to player state as string')" + + else + song="Not Playing" + fi + + case "$state" in + "paused" | "PAUSE") + song="Paused" + ;; + + "stopped" | "STOP") + song="Stopped" + ;; + esac + + # Display Artist and Title on seperate lines. + if [ "$song_shorthand" == "on" ] && [ "$stdout_mode" != "on" ]; then + artist="${song/ -*}" + song=${song/$artist - } + + if [ "$song" != "$artist" ]; then + prin "Artist" "$artist" + prin "Song" "$song" + else + prin "$subtitle" "$song" + fi + unset song + fi +} + +# }}} + +# Resolution {{{ + +getresolution () { + case "$os" in + "Linux" | *"BSD") + if type -p xrandr >/dev/null 2>&1; then + case "$refresh_rate" in + "on") resolution=$(xrandr --nograb --current | awk 'match($0,/[0-9]{2,3}.[0-9]{2}\*/) {printf $1 " @ " substr($0,RSTART,RLENGTH) "Hz, "}') ;; + "off") resolution=$(xrandr --nograb --current | awk '/*/ {printf $1 ", "}') ;; + esac + resolution=${resolution//\*} + + elif type -p xdpyinfo >/dev/null 2>&1; then + resolution=$(xdpyinfo 2>/dev/null | awk '/dimensions:/ {printf $2}') + fi + ;; + + "Mac OS X") + if type -p screenresolution >/dev/null 2>&1; then + resolution=$(screenresolution get 2>&1 | awk '/Display/ {printf $6 "Hz, "}') + resolution=${resolution//x??@/ @ } + + else + resolution=$(system_profiler SPDisplaysDataType |\ + awk '/Resolution:/ {printf $2"x"$4" @ "$6"Hz, "}') + fi + + [[ "$refresh_rate" == "off" ]] && \ + resolution=${resolution// @ *([0-9])Hz} + ;; + + "Windows") + width=$(wmic desktopmonitor get screenwidth /value 2>/dev/null) + width=${width/ScreenWidth'='/} + width=${width//[[:space:]]} + + height=$(wmic desktopmonitor get screenheight /value 2>/dev/null) + height=${height/ScreenHeight'='/} + height=${height//[[:space:]]} + + [ ! -z "$width" ] && \ + resolution="${width}x${height}" + ;; + esac + + resolution=${resolution%,*} +} + +# }}} + +# Theme/Icons/Font {{{ + +getstyle () { + # Fix weird output when the function + # is run multiple times. + unset gtk2theme gtk3theme theme path + + case "$1" in + theme) + name="gtk-theme-name" + gsettings="gtk-theme" + gconf="gtk_theme" + xfconf="ThemeName" + kde="widgetStyle" + ;; + + icons) + name="gtk-icon-theme-name" + gsettings="icon-theme" + gconf="icon_theme" + xfconf="IconThemeName" + kde="Theme" + ;; + + font) + name="gtk-font-name" + gsettings="font-name" + gconf="font_theme" + xfconf="FontName" + kde="font" + ;; + esac + + if [ -n "$DISPLAY" ] && [ "$os" != "Mac OS X" ]; then + # Get DE if user has disabled the function. + [ -z "$de" ] && getde + + case "$de" in + "KDE"*) + kdeconfigdir + + if [ -f "${kde_config_dir}/share/config/kdeglobals" ]; then + kde_config_file="${kde_config_dir}/share/config/kdeglobals" + + theme=$(grep "^[^#]*$kde" "$kde_config_file") + theme=${theme/${kde}*=} + [ "$version" -ge 4 ] && theme=${theme^} + + gtk_shorthand="on" + return + fi + ;; + + *"Cinnamon") + if type -p gsettings >/dev/null 2>&1; then + gtk3theme=$(gsettings get org.cinnamon.desktop.interface $gsettings) + gtk3theme=${gtk3theme//"'"} + gtk2theme=${gtk3theme} + fi + ;; + + "Gnome"* | "Unity"* | "Budgie") + if type -p gsettings >/dev/null 2>&1; then + gtk3theme=$(gsettings get org.gnome.desktop.interface $gsettings) + gtk3theme=${gtk3theme//"'"} + gtk2theme=${gtk3theme} + + elif type -p gconftool-2 >/dev/null 2>&1; then + gtk2theme=$(gconftool-2 -g /desktop/gnome/interface/$gconf) + fi + ;; + + "Mate"*) + gtk3theme=$(gsettings get org.mate.interface $gsettings) + gtk2theme=${gtk3theme} + ;; + + "Xfce"*) + type -p xfconf-query >/dev/null 2>&1 && \ + gtk2theme=$(xfconf-query -c xsettings -p /Net/$xfconf) + ;; + esac + + # Check for gtk2 theme + if [ -z "$gtk2theme" ]; then + if [ -f "${GTK2_RC_FILES:-$HOME/.gtkrc-2.0}" ]; then + gtk2theme=$(grep "^[^#]*$name" "${GTK2_RC_FILES:-$HOME/.gtkrc-2.0}") + + elif [ -f "/usr/share/gtk-2.0/gtkrc" ]; then + gtk2theme=$(grep "^[^#]*$name" /usr/share/gtk-2.0/gtkrc) + + elif [ -f "/etc/gtk-2.0/gtkrc" ]; then + gtk2theme=$(grep "^[^#]*$name" /etc/gtk-2.0/gtkrc) + fi + + gtk2theme=${gtk2theme/${name}*=} + gtk2theme=${gtk2theme//\"} + fi + + # Check for gtk3 theme + if [ -z "$gtk3theme" ]; then + if [ -f "$XDG_CONFIG_HOME/gtk-3.0/settings.ini" ]; then + gtk3theme=$(grep "^[^#]*$name" "$XDG_CONFIG_HOME/gtk-3.0/settings.ini") + + elif type -p gsettings >/dev/null 2>&1; then + gtk3theme="$(gsettings get org.gnome.desktop.interface $gsettings)" + gtk3theme=${gtk3theme//\'} + + elif [ -f "/usr/share/gtk-3.0/settings.ini" ]; then + gtk3theme=$(grep "^[^#]*$name" /usr/share/gtk-3.0/settings.ini) + + elif [ -f "/etc/gtk-3.0/settings.ini" ]; then + gtk3theme=$(grep "^[^#]*$name" /etc/gtk-3.0/settings.ini) + fi + + gtk3theme=${gtk3theme/${name}*=} + gtk3theme=${gtk3theme//\"} + gtk3theme=${gtk3theme/[[:space:]]/ } + fi + + # Uppercase the first letter of each gtk theme + if [ "$version" -ge 4 ]; then + gtk2theme=${gtk2theme^} + gtk3theme=${gtk3theme^} + fi + + # Toggle visibility of gtk themes. + [ "$gtk2" == "off" ] && unset gtk2theme + [ "$gtk3" == "off" ] && unset gtk3theme + + # Format the string based on which themes exist + if [ "$gtk2theme" ] && [ "$gtk2theme" == "$gtk3theme" ]; then + gtk3theme+=" [GTK2/3]" + unset gtk2theme + + elif [ "$gtk2theme" ] && [ "$gtk3theme" ]; then + gtk2theme+=" [GTK2], " + gtk3theme+=" [GTK3] " + else + [ "$gtk2theme" ] && gtk2theme+=" [GTK2] " + [ "$gtk3theme" ] && gtk3theme+=" [GTK3] " + fi + + # Final string + theme="${gtk2theme}${gtk3theme}" + theme=${theme//\"} + theme=${theme//\'} + + # Make the output shorter by removing "[GTKX]" from the string + if [ "$gtk_shorthand" == "on" ]; then + theme=${theme/ '[GTK2]'} + theme=${theme/ '[GTK3]'} + theme=${theme/ '[GTK2/3]'} + fi + fi +} + +gettheme () { + getstyle theme +} + +geticons () { + getstyle icons + icons="$theme" +} + +getfont () { + getstyle font + font="$theme" +} + +# }}} + +# Disk Usage {{{ + +getdisk () { + # df flags + case "$os" in + "Linux" | "iPhone OS" | "Windows") df_flags="-h -l --total" ;; + "Mac OS X") df_flags="-H / -l" ;; + + *"BSD") + case "$distro" in + "FreeBSD"*) df_flags="-h -c -l" ;; + *) return ;; + esac + ;; + esac + + # Get the disk info + disk=$(df $df_flags 2>/dev/null | awk 'END{print $2 ":" $3 ":" $5}') + + # Format the output + disk_used=${disk#*:} + disk_used=${disk_used%%:*} + disk_total=${disk%%:*} + disk_total_per=${disk#*:*:} + + # Put it all together + disk="${disk_used} / ${disk_total} (${disk_total_per})" + + # Add info bar + disk_used=${disk_used/G} + disk_total=${disk_total/G} + + [[ "$disk_used" == *"T" ]] && \ + disk_used=$(printf "%s\n" "${disk_used/T} * 1000" | bc) + + [[ "$disk_total" == *"T" ]] && \ + disk_total=$(printf "%s\n" "${disk_total/T} * 1000" | bc) + + case "$disk_display" in + "bar") disk="$(bar "${disk_used/'.'*}" "${disk_total/'.'*}")" ;; + "infobar") disk+=" $(bar "${disk_used/'.'*}" "${disk_total/'.'*}")" ;; + "barinfo") disk="$(bar "${disk_used/'.'*}" "${disk_total/'.'*}") $disk" ;; + "perc") disk="$disk_total_per $(bar "${disk_used/'.'*}" "${disk_total/'.'*}")" ;; + esac +} + +# }}} + +# Battery Usage {{{ + +getbattery () { + case "$os" in + "Linux") + if [ "$(ls /sys/class/power_supply/)" ]; then + # Set the index to the battery number. + case "$battery_num" in + "all") battery_num="*" index=0 ;; + *) index="$battery_num" ;; + esac + + batteries=($(cat /sys/class/power_supply/BAT${battery_num}/capacity)) + battery_state=($(cat /sys/class/power_supply/BAT${battery_num}/status)) + + # Get the subtitle and reassign it so it doesn't change. + title="$subtitle" + + # If shorthand is on, print each value on the same line + if [ "$battery_shorthand" == "on" ] || [ "$stdout_mode" == "on" ]; then + battery=${batteries[*]} + battery=${battery// /%, } + battery="${battery}%" + + else + if [ "${#batteries[@]}" -gt 1 ]; then + unset battery + + # Print each battery on a separate line. + index=0 + for bat in "${batteries[@]}"; do + case "$battery_display" in + "bar") prin "${title}${index}" "$(bar ${bat/'%'} 100)" ;; + "infobar") prin "${title}${index}" "${bat}% $(bar "${bat/'%'}" 100)" ;; + "barinfo") prin "${title}${index}" "$(bar "${bat/'%'}" 100) ${bat}%" ;; + *) prin "${title}${index}" "${bat}%" ;; + esac + index=$((index + 1)) + done + return + fi + battery="${batteries[0]}%" + fi + fi + ;; + + "BSD") + case "$distro" in + "FreeBSD"*) + battery=$(acpiconf -i 0 | awk -F ':\t' '/Remaining capacity/ {print $2}') + battery_state=$(acpiconf -i 0 | awk -F ':\t\t\t' '/State/ {print $2}') + ;; + + "NetBSD"*) + battery=$(envstat | awk '\\(|\\)' '/charge:/ {print $2}') + battery="${battery/\.*}%" + ;; + esac + ;; + + "OpenBSD") + battery0full=$(sysctl -n hw.sensors.acpibat0.watthour0) + battery0full=${battery0full/ Wh*} + + battery0now=$(sysctl -n hw.sensors.acpibat0.watthour3) + battery0now="${battery0now/ Wh*}" + + [ ! -z "$battery0full" ] && \ + battery="$(printf "%s\n" "100 * $battery0now / $battery0full" | bc)%" + ;; + + "Mac OS X") + battery="$(pmset -g batt | grep -o '[0-9]*%')" + battery_state="$(pmset -g batt | awk 'NR==2 {print $3}')" + ;; + + "Windows") + battery="$(wmic Path Win32_Battery get EstimatedChargeRemaining /value)" + battery=${battery/EstimatedChargeRemaining'='} + battery=${battery//[[:space:]]/ } + battery=${battery// } + [ ! -z "$battery" ] && \ + battery+="%" + ;; + esac + + case "$battery_state" in + "charging"*) battery+=" Charging" ;; + esac + + case "$battery_display" in + "bar") battery="$(bar ${battery/'%'*} 100)" ;; + "infobar") battery="${battery} $(bar "${battery/'%'*}" 100)" ;; + "barinfo") battery="$(bar "${battery/'%'*}" 100) ${battery}" ;; + esac +} + +# }}} + +# IP Address {{{ + +getlocalip () { + case "$os" in + "Linux") + localip="$(ip route get 1 | awk '{print $NF;exit}')" + ;; + + "Mac OS X" | "iPhone OS") + localip="$(ipconfig getifaddr en0)" + [ -z "$localip" ] && localip="$(ipconfig getifaddr en1)" + ;; + + *"BSD") + localip="$(ifconfig | awk '/broadcast/ {print $2}')" + ;; + + "Windows") + localip="$(ipconfig | awk -F ': ' '/IPv4 Address/ {printf $2}')" + ;; + esac +} + +getpublicip () { + if type -p dig >/dev/null 2>&1; then + publicip="$(dig +time=1 +tries=1 +short myip.opendns.com @resolver1.opendns.com 2>/dev/null)" + fi + + if [ -z "$publicip" ] && type -p curl >/dev/null 2>&1; then + publicip="$(curl --max-time 10 -w '\n' "$public_ip_host" 2>/dev/null)" + fi + + if [ -z "$publicip" ] && type -p wget >/dev/null 2>&1; then + publicip="$(wget -T 10 -qO- "$public_ip_host" 2>/dev/null; printf "%s")" + fi +} + +# }}} + +# Logged In Users {{{ + +getusers () { + users="$(who | awk '!seen[$1]++ {printf $1 ", "}')" + users=${users%\,*} +} + +# }}} + +# Birthday {{{ + +getbirthday () { + case "$os" in + "linux" | "iPhone OS") + birthday="$(ls -alct --full-time / | awk '/lost\+found|private/ {printf $6 " " $7}')" + date_cmd="$(date -d"$birthday" "$birthday_format")" + ;; + + "Mac OS X") + birthday="$(ls -lUT /var/log/install.log | awk '{printf $6 " " $7 " " $9 " " $8}')" + + # Split the string into Date + time + time=${birthday/*???? } + birthday=${birthday/$time} + + case "${time/:*}" in + 0? | 10 | 11) time+=" AM" ;; + *) time+=" PM" ;; + esac + birthday+="$time" + birthday_shorthand="on" + ;; + + *"BSD") + case "$distro" in + "OpenBSD"*) + birthday="$(ls -alctT / | awk '/lost\+found/ {printf $6 " " $7 " " $9 " " $8}')" + birthday_shorthand="on" + ;; + + "FreeBSD"*) + birthday="$(ls -alctT /etc/hostid | awk '{printf $6 " " $7 " " $9 " " $8}')" + date_cmd="$(date -j -f "%b %d %Y" "$birthday" "$birthday_format")" + ;; + + "NetBSD"*) + birthday="$(ls -alctT /etc/defaults/rc.conf | awk '{printf $6 " " $7 " " $9 " " $8}')" + birthday_shorthand="on" + ;; + esac + ;; + + "Windows") + birthday="$(ls -alct --full-time /cygdrive/c/Windows/explorer.exe | awk '{printf $8 " " $9}')" + date_cmd="$(date -d"$birthday" "$birthday_format")" + ;; + esac + + # Strip seconds from time output + birthday=${birthday/:?? / } + + # Pretty output + [ "$birthday_shorthand" == "off" ] && \ + birthday=${date_cmd//+( )/ } + + # Toggle showing the time + [ "$birthday_time" == "off" ] && \ + birthday=${birthday/??:??*} +} + +# }}} + +# Terminal colors {{{ + +getcols () { + if [ "$color_blocks" == "on" ]; then + printf "${padding}%s" + while [ $start -le $end ]; do + case "$start" in + [0-6]) printf "\033[4${start}m%${block_width}s" ;; + 7) printf "\033[4${start}m%${block_width}s${clear}\n${padding}" ;; + *) printf "\033[48;5;${start}m%${block_width}s" ;; + esac + start=$((start + 1)) + done + + # Clear formatting + printf "%b%s" "$clear" + fi +} + +# }}} + +# }}} + + +# Images {{{ + + +# Wallpaper {{{ + +getwallpaper () { + case "$os" in + "Linux" | *"BSD") + if type -p feh >/dev/null 2>&1 && [ -f "$HOME/.fehbg" ]; then + img="$(awk -F\' '/feh/ {printf $2}' "$HOME/.fehbg")" + + elif type -p nitrogen >/dev/null 2>&1; then + img="$(awk -F'=' '/file/ {printf $2;exit;}' "$XDG_CONFIG_HOME/nitrogen/bg-saved.cfg")" + + elif type -p gsettings >/dev/null 2>&1; then + # Get DE if user has disabled the function. + [ -z "$de" ] && getde + + case "$de" in + "MATE"*) img="$(gsettings get org.mate.background picture-filename 2>/dev/null)" ;; + *) img="$(gsettings get org.gnome.desktop.background picture-uri 2>/dev/null)" ;; + esac + + # Strip quotes etc from the path. + img=${img/'file://'} + img=${img//\'} + fi + ;; + + "Mac OS X") + img="$(osascript -e 'tell application "System Events" to picture of current desktop')" + ;; + + "Windows") + case "$distro" in + "Windows XP") + img="/cygdrive/c/Documents and Settings/${USER}" + img+="/Local Settings/Application Data/Microsoft" + img+="/Wallpaper1.bmp" + ;; + + "Windows"*) + img="$APPDATA/Microsoft/Windows/Themes" + img+="/TranscodedWallpaper.jpg" + ;; + esac + ;; + esac + + # If img is an xml file don't use it. + [ "${img/*\./}" == "xml" ] && img="" + + # Error msg + [ -z "$img" ] && err "Wallpaper detection failed, falling back to ascii mode." +} + +# }}} + +# Ascii {{{ + +getascii () { + if [ ! -f "$ascii" ] || [ "$ascii" == "distro" ]; then + # Error message + [ "$ascii" != "distro" ] && \ + [ ! -f "$ascii" ] && err "Ascii file not found, using distro ascii" + + # Lowercase the distro name + if [ "$version" -le 3 ]; then + ascii=$(tr '[:upper:]' '[:lower:]' <<< "$ascii_distro") + else + ascii=${ascii_distro,,} + fi + + [ "$ascii_logo_size" == "small" ] && \ + ascii="${ascii/ *}_small" + + if [ -f "/usr/share/neofetch/ascii/distro/${ascii/ *}" ]; then + ascii="/usr/share/neofetch/ascii/distro/${ascii/ *}" + + elif [ -f "/usr/local/share/neofetch/ascii/distro/${ascii/ *}" ]; then + ascii="/usr/local/share/neofetch/ascii/distro/${ascii/ *}" + + else + getscriptdir + + # If the ascii file doesn't exist fallback to text mode. + if [ ! -f "$script_dir/ascii/distro/${ascii/ *}" ]; then + padding="\033[0C" + image="off" + err "Ascii file not found, falling back to text mode." + return + fi + + ascii="$script_dir/ascii/distro/${ascii/ *}" + fi + + # We only use eval in the distro ascii files. + print="$(eval printf "$(<"$ascii")")" + else + case "${ascii_colors[0]}" in + "distro") ascii_color="$c1" ;; + *) ascii_color="\033[38;5;${ascii_colors[0]}m" ;; + esac + + print="${ascii_color}$(<"$ascii")" + fi + + # Set locale to get correct padding + export LC_ALL="$SYS_LOCALE" + + # Turn the file into a variable and strip escape codes. + ascii_strip=$(<"$ascii") + ascii_strip=${ascii_strip//\$\{??\}} + ascii_strip=${ascii_strip//\\} + + # Get length of longest line + ascii_size=($(awk 'END {print NR}length>max{max=length}END{print max}' <<< "$ascii_strip")) + lines=$((ascii_size[0] + 1)) + ascii_length=${ascii_size[1]} + + padding="\033[$((ascii_length + gap))C" + printf "%b%s" "$print" + + export LC_ALL=C +} + + +# }}} + +# Image {{{ + +getimage () { + # Fallback to ascii mode if imagemagick isn't installed. + type -p convert >/dev/null 2>&1 || image="ascii" + + # Get terminal lines + lines=$(tput lines) + + case "$image" in + "wall") getwallpaper ;; + "ascii") getascii; return ;; + *) + if [ "${image: -1}" == "/" ]; then + files=("$image"*.png "$image"*.jpg) + img="$(printf "%s" "${files[RANDOM % ${#files[@]}]}")" + else + img="$image" + fi + ;; + esac + + # Get terminal width and height + stty -echo + if [ -n "$TMUX" ]; then + printf "%b%s" "\033Ptmux;\033\033[14t\033\033[c\033\\" + else + printf "%b%s" "\033[14t\033[c" + fi + + # The ascape code above prints the output AFTER the prompt so this + # loop below reads it as input. wtf xterm + read -t 1 -d c -s -r term_size; stty echo + + # Split the string + term_size=${term_size//'['} + term_size=${term_size/';'} + term_size=${term_size/$'\E4'} + term_size=${term_size/t*} + term_height=${term_size/';'*} + term_width=${term_size/*';'} + + + # If $img isn't a file or the terminal doesn't support xterm escape sequences, + # fallback to ascii mode. + if [ ! -f "$img" ] || [ ${#term_size} -le 5 ]; then + image="ascii" + getascii + + # Error messages + [ ! -f "$img" ] && err "\$img, isn't a file, falling back to ascii mode." + [ ${#term_size} -le 5 ] && err "Your terminal doesn't support \\\033[14t, falling back to ascii mode." + + return + fi + + # Get terminal columns + columns=$(tput cols) + + # Calculate font size + font_width=$((term_width / columns)) + + # Image size is half of the terminal + case "$image_size" in + "auto") + image_size=$((columns * font_width / 2)) + term_height=$((term_height - term_height / 4)) + + [ "$term_height" -lt "$image_size" ] && \ + image_size="$term_height" + ;; + + *"%") + percent=${image_size/\%} + image_size=$((percent * term_width / 100)) + + [ "$((percent * term_height / 50))" -lt "$image_size" ] && \ + image_size=$((percent * term_height / 100)) + ;; + + *) image_size=${image_size/px} ;; + esac + + # Where to draw the image + case "$image_position" in + "left") + # Padding is half the terminal width + gap + padding="\033[$((image_size / font_width + gap + xoffset/font_width))C" + ;; + + "right") + padding="\033[0C" + xoffset=$((columns * font_width / 2 - gap)) + ;; + esac + + # Make the directory if it doesn't exist + mkdir -p "$thumbnail_dir" + + # Check to see if the image has a file extension, if it doesn't + # then add one. + case "${img##*/}" in + *"."*) imgname="$crop_mode-$crop_offset-$image_size-${img##*/}" ;; + *) imgname="$crop_mode-$crop_offset-$image_size-${img##*/}.jpg" ;; + esac + + # Check to see if the thumbnail exists before we do any cropping. + if [ ! -f "$thumbnail_dir/$imgname" ]; then + # Get image size so that we can do a better crop + size=$(identify -format "%w %h" "$img") + width=${size%% *} + height=${size##* } + + # This checks to see if height is geater than width + # so we can do a better crop of portrait images. + size=$height + [ "$height" -gt "$width" ] && size=$width + + case "$crop_mode" in + fit) + c=$(convert "$img" \ + -colorspace srgb \ + -format "%[pixel:p{0,0}]" info:) + + convert \ + "$img" \ + -trim +repage \ + -gravity south \ + -background "$c" \ + -extent "$size"x"$size" \ + -scale "$image_size"x"$image_size" \ + "$thumbnail_dir/$imgname" + ;; + + fill) + convert \ + "$img" \ + -trim +repage \ + -scale "$image_size"x"$image_size"^ \ + -extent "$image_size"x"$image_size" \ + "$thumbnail_dir/$imgname" + ;; + + *) + convert \ + "$img" \ + -gravity $crop_offset \ + -crop "$size"x"$size"+0+0 \ + -quality 95 \ + -scale "$image_size"x"$image_size" \ + "$thumbnail_dir/$imgname" + ;; + esac + fi + + # The final image + img="$thumbnail_dir/$imgname" +} + +takescrot () { + $scrot_cmd "${scrot_dir}${scrot_name}" +} + +# }}} + +# Find w3m-img {{{ + +# Find w3mimgdisplay automatically +getw3m_img_path () { + if [ -x "$w3m_img_path" ]; then + return + + elif [ -x "/usr/lib/w3m/w3mimgdisplay" ]; then + w3m_img_path="/usr/lib/w3m/w3mimgdisplay" + + elif [ -x "/usr/libexec/w3m/w3mimgdisplay" ]; then + w3m_img_path="/usr/libexec/w3m/w3mimgdisplay" + + elif [ -x "/usr/lib64/w3m/w3mimgdisplay" ]; then + w3m_img_path="/usr/lib64/w3m/w3mimgdisplay" + + elif [ -x "/usr/libexec64/w3m/w3mimgdisplay" ]; then + w3m_img_path="/usr/libexec64/w3m/w3mimgdisplay" + + else + image="ascii" + err "w3m-img wasn't found on your system, falling back to ascii mode." + fi +} + +# }}} + + +# }}} + + +# Text Formatting {{{ + + +# Info {{{ + +info () { + # $1 is the subtitle + subtitle="$1" + + # Call the function and update variable + if [ -z "$2" ]; then + "get$1" 2>/dev/null + eval output="\$${1}" + + else + "get$2" 2>/dev/null + eval output="\$${2}" + fi + + # If the output is empty, don't print anything + [ -z "$output" ] && return + + case "$1" in + title) + string="${bold}${title_color}${output}" + string="${string/@/${at_color}@${title_color}}" + length=${#output} + ;; + + underline) + string="${underline_color}${output}" + ;; + + *) + string="${bold}${subtitle_color}${subtitle}${clear}" + string+="${colon_color}: ${info_color}${output}" + length=$((${#subtitle} + ${#output} + 2)) + ;; + esac + + # If there's no subtitle don't print one + [ -z "$2" ] && string=${string/*: } + + # Print the string + printf "%b%s\n" "${padding}${string}${clear}" +} + +# }}} + +# Prin {{{ + +prin () { + if [ -z "$2" ]; then + string="${info_color}${1}" + length=${#1} + + else + string="${bold}${subtitle_color}${1}${clear}" + string+="${colon_color}: ${info_color}${2}" + length=$((${#subtitle} + ${#2} + 1)) + fi + + # Print the info + printf "%b%s\n" "${padding}${string}${clear}" +} + +# }}} + +# Stdout {{{ + +stdout () { + # Read args early for the separator + stdout_separator_flag="$(awk -F '--stdout_separator ' '{printf $2}' <<< "${args[@]}")" + stdout_separator_flag=${stdout_separator_flag/ '--'*} + + [ ! -z "$stdout_separator_flag" ] && \ + stdout_separator="$stdout_separator_flag" + + for func in "${args[@]}"; do + case "$func" in + "--"*) break ;; + *) + "get$func" 2>/dev/null + eval output="\$$func" + stdout+="${output}${stdout_separator}" + ;; + esac + done + + printf "%s" "${stdout%%${stdout_separator}}" + exit +} + +# }}} + +# Underline {{{ + +getunderline () { + case "$underline_enabled" in + "on") + underline=$(printf %"$length"s) + underline=${underline// /$underline_char} + ;; + "off") underline="" ;; + esac +} + +# }}} + +# Colors {{{ + +colors () { + # Change color of logo based on distro + case "$ascii_distro" in + "Arch"* | "Antergos"*) + setcolors 6 4 + ;; + + "CentOS"*) + setcolors 3 2 4 5 7 + ;; + + "CRUX"* | "Chakra"* | "gNewSense"* | "SailfishOS"* | "Alpine"* | "Ubuntu-GNOME"* | "Qubes"*) + setcolors 4 5 7 + ;; + + "Chrom"*) + setcolors 2 1 3 4 7 + ascii_distro="chrome" + ;; + + "Debian"* | "FreeBSD"* | "Elementary"* | "CrunchBang"* | "Ubuntu"*) + setcolors 7 1 3 + ;; + + "Red"*) + setcolors 7 1 3 + ascii_distro="redhat" + ;; + + "Kogaion"*) + setcolors 4 7 + ;; + + "Fedora"* | "Sabayon"* | "Frugalware"* | "Exherbo"*) + setcolors 7 4 1 + ;; + + "Gentoo"* | "Funtoo"* | "SteamOS"*) + setcolors 7 5 + ;; + + "KDE"*) + setcolors 2 7 + ascii_distro="kde" + ;; + + "Kali"*) + setcolors 4 8 + ;; + + *"OS X"* | *"iOS"*) + setcolors 2 3 1 1 5 4 + ascii_distro="mac" + ;; + + "OpenMandriva"*) + setcolors 4 3 + ;; + + "Mageia"*) + setcolors 7 6 + ;; + + "Peppermint"*) + setcolors 7 1 + ;; + + *"Mint"*) + setcolors 7 2 + ascii_distro="mint" + ;; + + "LMDE"* | "Chapeau"*) + setcolors 7 2 + ;; + + "NetBSD"* | "Parabola"* | "Tails"* | "BLAG"*) + setcolors 5 7 + ;; + + "OpenBSD"*) + setcolors 3 7 6 1 8 + ;; + + "OpenSuse"* | "Manjaro"* | "Deepin"*) + setcolors 2 7 + ;; + + "PCLinuxOS"* | "Slackware"* | "KaOS"* | "Kubuntu"* | "Lubuntu"* | "Xubuntu"*) + setcolors 4 7 1 + ;; + + "Puppy"* | "Quirky Werewolf"* | "Precise Puppy"*) + setcolors 4 + ascii_distro="puppy" + ;; + + "Scientific"*) + setcolors 4 1 7 + ;; + + "Solus"*) + setcolors 7 8 + ;; + + "Trisquel"* | "NixOS"* | "Zorin"*) + setcolors 4 6 + ;; + + "Travis") + setcolors 3 1 0 7 4 + ;; + + "void"*) + setcolors 2 8 + ;; + + "Windows 8"* | "Windows 10"*) + setcolors 6 + ascii_distro="windows10" + ;; + + "Windows"*) + setcolors 1 2 4 3 + ;; + + "Raspbian"* | *) + setcolors 2 1 + ;; + esac + + # Overwrite distro colors if '$ascii_colors' doesn't + # equal 'distro'. + [ "${ascii_colors[0]}" != "distro" ] && \ + setcolors ${ascii_colors[@]} +} + +setcolors () { + c1="$(color $1)" + c2="$(color $2)" + c3="$(color $3)" + c4="$(color $4)" + c5="$(color $5)" + c6="$(color $6)" + + if [ "${colors[0]}" == "distro" ]; then + title_color="$c1" + at_color="\033[0m" + underline_color="\033[0m" + subtitle_color="$c2" + colon_color="\033[0m" + info_color="\033[0m" + + # If the second color is white use the first for the subtitle + [ "$2" == 7 ] && subtitle_color="\033[0m\033[3${1}m" + else + title_color="$(color ${colors[0]})" + at_color="$(color ${colors[1]})" + underline_color="$(color ${colors[2]})" + subtitle_color="$(color ${colors[3]})" + colon_color="$(color ${colors[4]})" + info_color="$(color ${colors[5]})" + fi + + if [ "$progress_color_elapsed" == "distro" ]; then + progress_color_elapsed="$(color fg)" + else + progress_color_elapsed="$(color $progress_color_elapsed)" + fi + + case "$progress_color_total $1" in + distro\ [736]) progress_color_total="$c2" ;; + distro\ [0-9]) progress_color_total="$c1" ;; + *) progress_color_total="$(color $progress_color_total)" ;; + esac +} + +color () { + case "$1" in + [0-7]) printf "%b%s" "\033[0m\033[3${1}m" ;; + "fg") printf "%b%s" "\033[0m" ;; + *) printf "%b%s" "\033[38;5;${1}m" ;; + esac +} + + +# }}} + +# Bold {{{ + +bold () { + case "$bold" in + "on") bold="\033[1m" ;; + "off") bold="" ;; + esac +} + +# }}} + +# Linebreak {{{ + +getlinebreak () { + linebreak=" " +} + +# }}} + +clear="\033[0m" + + +# }}} + + +# Other {{{ + + +# Get script directory {{{ + +getscriptdir () { + # Use $0 to get the script's physical path. + cd "${0%/*}" || exit + script_dir=${0##*/} + + # Iterate down a (possible) chain of symlinks. + while [ -L "$script_dir" ]; do + script_dir="$(readlink "$script_dir")" + cd "${script_dir%/*}" || exit + script_dir="${script_dir##*/}" + done + + # Final directory + script_dir="$(pwd -P)" +} + +# }}} + +# Source Config {{{ + +# Check for $config_file first +getconfig () { + # Check $config_file + if [ -f "$config_file" ]; then + source "$config_file" + return + fi + mkdir -p "$XDG_CONFIG_HOME/neofetch/" + + # Check $XDG_CONFIG_HOME/neofetch and create the + # dir/files if they don't exist. + if [ -f "$XDG_CONFIG_HOME/neofetch/config" ]; then + source "$XDG_CONFIG_HOME/neofetch/config" + + elif [ -f "/usr/share/neofetch/config" ]; then + cp "/usr/share/neofetch/config" "$XDG_CONFIG_HOME/neofetch" + source "$XDG_CONFIG_HOME/neofetch/config" + + elif [ -f "/usr/local/share/neofetch/config" ]; then + cp "/usr/local/share/neofetch/config" "$XDG_CONFIG_HOME/neofetch" + source "$XDG_CONFIG_HOME/neofetch/config" + + else + getscriptdir + + cp "$script_dir/config/config" "$XDG_CONFIG_HOME/neofetch" + source "$XDG_CONFIG_HOME/neofetch/config" + fi +} + +# Check the commandline flags early for '--config none/off' +case "$@" in + *"--config off"* | *'--config "off"'* | *"--config 'off'"* | \ + *"--config none"* | *'--config "none"'* | *"--config 'none'"* | *"--stdout"*) + config="off" + ;; +esac +[ "$config" == "on" ] && getconfig + +# }}} + +# Progress Bars {{{ + +bar() { + # Get the values + elapsed=$(($1 * progress_length / $2)) + + # Create the bar with spaces + prog=$(printf %"$elapsed"s) + total=$(printf %"$((progress_length - elapsed))"s) + + # Set the colors and swap the spaces for $progress_char + bar+="${progress_color_elapsed}${prog// /$progress_char_elapsed}" + bar+="${progress_color_total}${total// /$progress_char_total}" + + # Borders + if [ "$progress_border" == "on" ]; then + bar+="$(color fg)]" + bar="$(color fg)[$bar" + fi + + printf "%b%s\n" "${bar}${clear}" +} + +# }}} + +# Cache {{{ + +cache () { + mkdir -p "$3/neofetch" + echo "${1/*-}=\"$2\"" > "$3/neofetch/${1/*-}" +} + +# }}} + +# KDE Config directory {{{ + +kdeconfigdir () { + if [ -n "$KDE_CONFIG_DIR" ]; then + kde_config_dir="$KDE_CONFIG_DIR" + + elif type -p kde5-config >/dev/null 2>&1; then + kde_config_dir=$(kde5-config --localprefix) + + elif type -p kde4-config >/dev/null 2>&1; then + kde_config_dir=$(kde4-config --localprefix) + + elif type -p kde-config >/dev/null 2>&1; then + kde_config_dir=$(kde-config --localprefix) + fi +} + +# }}} + +err () { + err+="$(color 1)[!]$(color fg) $1 \n" +} + +# }}} + + +# Usage {{{ + + +usage () { cat << EOF + + usage: neofetch --option "value" --option "value" + + NOTE: There's also a config option for each flag below. + + Info: + --disable infoname Allows you to disable an info line from appearing + in the output. + NOTE: You can supply multiple args. eg. + 'neofetch --disable cpu gpu disk shell' + --osx_buildversion on/off Hide/Show Mac OS X build version. + --osx_codename on/off Hide/Show Mac OS X codename. + --os_arch on/off Hide/Show Windows architecture. + --speed_type type Change the type of cpu speed to display. + Possible values: current, min, max, bios, + scaling_current, scaling_min, scaling_max + NOTE: This only support Linux with cpufreq. + --cpu_shorthand type Shorten the output of CPU + Possible values: name, speed, tiny, on, off + --cpu_cores on/off Whether or not to display the number of CPU cores + --kernel_shorthand on/off Shorten the output of kernel + --uptime_shorthand on/off Shorten the output of uptime (tiny, on, off) + --refresh_rate on/off Whether to display the refresh rate of each monitor + Unsupported on Windows + --gpu_shorthand on/off Shorten the output of GPU (tiny, on, off) + --gtk_shorthand on/off Shorten output of gtk theme/icons + --gtk2 on/off Enable/Disable gtk2 theme/icons output + --gtk3 on/off Enable/Disable gtk3 theme/icons output + --shell_path on/off Enable/Disable showing \$SHELL path + --shell_version on/off Enable/Disable showing \$SHELL version + --battery_num num Which battery to display, default value is 'all' + --battery_shorthand on/off Whether or not each battery gets its own line/title + --ip_host url Url to ping for public IP + --song_shorthand on/off Print the Artist/Title on seperate lines + --birthday_shorthand on/off Shorten the output of birthday + --birthday_time on/off Enable/Disable showing the time in birthday output + --birthday_format format Format the birthday output. (Uses 'date' cmd format) + + + Text Formatting: + --colors x x x x x x Changes the text colors in this order: + title, @, underline, subtitle, colon, info + --underline on/off enable/disable the underline. + --underline_char char Character to use when underlining title + --line_wrap on/off Enable/Disable line wrapping + --bold on/off Enable/Disable bold text + --prompt_height num Set this to your prompt height to fix issues with + the text going off screen at the top + + + Color Blocks: + --color_blocks on/off Enable/Disable the color blocks + --block_width num Width of color blocks + --block_range start end Range of colors to print as blocks + + + Progress Bars: + --progress_char 'elapsed char' 'total char' + Characters to use when drawing progress bars. + --progress_border on/off Whether or not to surround the bar with '[]' + --progress_length num Length in spaces to make the progress bars. + --progress_colors num num Colors to make the progress bar. + Set in this order: elapsed, total + --cpu_display mode1 mode2 Which shorthand to use and how CPU usage should be printed + mode1 takes: name, speed, tiny, on, off + mode2 takes: info, bar, infobar, barinfo + --memory_display mode Which way should the memory progress bar be added + Takes bar, infobar, barinfo + --battery_display mode Which way should the battery progress bar be added + Takes bar, infobar, barinfo + --disk_display mode Which way should the disk progress bar be added + Takes bar, infobar, barinfo, perc + + + Image: + --image type Image source. Where and what image we display. + Possible values: wall, ascii, + /path/to/img, /path/to/dir/, off + --size 20px | --size 20% Size to make the image, takes pixels or a percentage. + --image_position left/right Where to display the image: (Left/Right) + --crop_mode mode Which crop mode to use + Takes the values: normal, fit, fill + --crop_offset value Change the crop offset for normal mode. + Possible values: northwest, north, northeast, + west, center, east, southwest, south, southeast + + --xoffset px How close the image will be to the left edge of the + window. This only works with w3m. + --yoffset px How close the image will be to the top edge of the + window. This only works with w3m. + --gap num Gap between image and text. + NOTE: --gap can take a negative value which will + move the text closer to the left side. + --clean Remove all cropped images + + + Ascii: + --ascii value Where to get the ascii from, Possible values: + distro, /path/to/ascii + --ascii_colors x x x x x x Colors to print the ascii art + --ascii_distro distro Which Distro's ascii art to print + --ascii_logo_size Size of ascii logo. + Supported distros: Arch, Gentoo, Crux, OpenBSD. + + + Stdout: + --stdout info info Launch neofetch in stdout mode which prints the info + in a plain-text format that you can use with + lemonbar etc. + --stdout_separator string String to use as a separator in stdout mode. + + + Screenshot: + --scrot /path/to/img Take a screenshot, if path is left empty the screen- + shot function will use \$scrot_dir and \$scrot_name. + --scrot_cmd cmd Screenshot program to launch + + + Other: + --config /path/to/config Specify a path to a custom config file + --config none Launch the script without a config file + --help Print this text and exit + --test Launch the script with all functions / options enabled. + This should only be used for testing purposes, ie Travis.CI. + -v Display error messages. + -vv Display a verbose log for error reporting. + +EOF +exit 1 +} + + +# }}} + + +# Args {{{ + + +while [ "$1" ]; do + case $1 in + # Info + --os_arch) os_arch="$2" ;; + --osx_buildversion) osx_buildversion="$2" ;; + --osx_codename) osx_codename="$2" ;; + --cpu_cores) cpu_cores="$2" ;; + --speed_type) speed_type="$2" ;; + --kernel_shorthand) kernel_shorthand="$2" ;; + --uptime_shorthand) uptime_shorthand="$2" ;; + --cpu_shorthand) cpu_shorthand="$2" ;; + --gpu_shorthand) gpu_shorthand="$2" ;; + --refresh_rate) refresh_rate="$2" ;; + --gtk_shorthand) gtk_shorthand="$2" ;; + --gtk2) gtk2="$2" ;; + --gtk3) gtk3="$2" ;; + --shell_path) shell_path="$2" ;; + --shell_version) shell_version="$2" ;; + --battery_num) battery_num="$2" ;; + --battery_shorthand) battery_shorthand="$2" ;; + --ip_host) public_ip_host="$2" ;; + --song_shorthand) song_shorthand="$2" ;; + --birthday_shorthand) birthday_shorthand="$2" ;; + --birthday_time) birthday_time="$2" ;; + --birthday_format) birthday_format="$2" ;; + --disable) + for func in "$@"; do + case "$func" in + "--disable") continue ;; + "--"*) return ;; + *) unset -f "get$func" ;; + esac + done + ;; + + # Text Colors + --colors) + unset colors + for arg in "$2" "$3" "$4" "$5" "$6" "$7"; do + case "$arg" in + "--"*) break ;; + *) colors+=($arg) + esac + done + colors+=(7 7 7 7 7 7) + ;; + + # Text Formatting + --underline) underline_enabled="$2" ;; + --underline_char) underline_char="$2" ;; + --line_wrap) line_wrap="$2" ;; + --bold) bold="$2" ;; + --prompt_height) prompt_height="$2" ;; + + # Color Blocks + --color_blocks) color_blocks="$2" ;; + --block_range) start=$2; end=$3 ;; + --block_width) block_width="$2" ;; + + # Progress Bars + --progress_char) + progress_char_elapsed="$2" + progress_char_total="$3" + ;; + --progress_border) progress_border="$2" ;; + --progress_length) progress_length="$2" ;; + --progress_colors) + progress_color_elapsed="$2" + progress_color_total="$3" + ;; + --cpu_display) + cpu_shorthand="$2" + cpu_display="$3" + ;; + --memory_display) memory_display="$2" ;; + --battery_display) battery_display="$2" ;; + --disk_display) disk_display="$2" ;; + + # Image + --image) + image="$2" + case "$2" in "--"* | "") image="ascii" ;; esac + ;; + + --size) image_size="$2" ;; + --image_position) image_position="$2" ;; + --crop_mode) crop_mode="$2" ;; + --crop_offset) crop_offset="$2" ;; + --xoffset) xoffset="$2" ;; + --yoffset) yoffset="$2" ;; + --gap) gap="$2" ;; + --clean) + rm -rf "$thumbnail_dir" + rm -rf "/Library/Caches/neofetch/" + exit + ;; + + # Ascii + --ascii) + image="ascii" + ascii="$2" + case "$2" in "--"* | "") ascii="distro" ;; esac + ;; + + --ascii_colors) + unset ascii_colors + for arg in "$2" "$3" "$4" "$5" "$6" "$7"; do + case "$arg" in + "--"*) break ;; + *) ascii_colors+=($arg) + esac + done + ascii_colors+=(7 7 7 7 7 7) + ;; + + --ascii_distro) + ascii_distro="$2" + case "$2" in "--"* | "") ascii_distro="$distro" ;; esac + ;; + + --ascii_logo_size) ascii_logo_size="$2" ;; + + # Screenshot + --scrot | -s) + scrot="on" + if [ "$2" ]; then + scrot_name="${2##*/}" + scrot_dir="${2/$scrot_name}" + fi + ;; + --scrot_cmd) scrot_cmd="$2" ;; + + # Stdout + --stdout) + unset info_color prin clear bar + stdout_mode="on" + config="off" + case "$2" in + "--"* | "") printf "%s\n" "--stdout requires at least one argument"; exit ;; + *) shift; args=("$@"); stdout ;; + esac + ;; + + # Other + --config) + case "$2" in + "none" | "off") config="off" ;; + *) config_file="$2"; config="on"; getconfig ;; + esac + ;; + --test) + info=(title underline distro kernel uptime packages shell resolution de wm wmtheme theme icons cpu gpu memory font disk battery song localip publicip users birthday) + + refresh_rate="on" + shell_version="on" + cpu_display="infobar" + memory_display="infobar" + disk_display="infobar" + + printinfo () { + if [ ! -z "$TRAVIS_OS_NAME" ]; then + info linebreak + info linebreak + fi + + for func in "${info[@]}"; do + info "$(tr '[:lower:]' '[:upper:]' <<< "$func")" $func + done + + info linebreak + info cols + info linebreak + printf "%b%s" "\033[$(tput lines)H" + } + ;; + + -v) verbose="on" ;; + -vv) set -x; verbose="on" ;; + --help) usage ;; + esac + + shift +done + + +# }}} + + +# Call Functions and Finish Up {{{ + + +# Restore cursor and clear screen on ctrl+c +trap 'printf "\033[?25h"; clear; exit' 2 + +# Distro detection +getdistro +[ -z "$ascii_distro" ] && ascii_distro="$distro" + +# Text formatting +colors +bold + +if [ "$image" != "off" ]; then + # If the script exits for any reason, unhide the cursor. + trap 'printf "\033[?25h"' EXIT + + # Clear the scren + clear + + # Hide the cursor + printf "\033[?25l" + + # If iterm2 is detected use iterm2 backend. + if [ -n "$ITERM_PROFILE" ]; then + image_backend="iterm2" + else + image_backend="w3m" + fi + + # Find w3mimgdisplay + [ "$image_backend" == "w3m" ] && \ + [ "$image" != "ascii" ] && \ + getw3m_img_path + + # Get the image + getimage +fi + +# Display the image if enabled +if [ "$image" != "off" ] && [ "$image" != "ascii" ]; then + case "$image_backend" in + "w3m") + printf "%b%s\n" "0;1;$xoffset;$yoffset;$image_size;$image_size;;;;;$img\n4;\n3;" |\ + $w3m_img_path 2>/dev/null || padding="\033[0C" + ;; + + "iterm2") + printf "%b%s\a\n" "\033]1337;File=width=${image_size}px;height=${image_size}px;inline=1:$(base64 < "$img")" + ;; + esac +fi + +# Disable line wrap +[ "$line_wrap" == "off" ] && printf "\033[?7l" + +# Move cursor to the top +[ "$image" != "off" ] && printf "\033[0H" + +# Print the info +printinfo + +if [ "$image" != "off" ]; then + # Get cursor position + info_height="$(stty -echo; IFS=';' read -rdR -t 1 -d c -p $'\033[6n\033[c' ROW COL; printf "%s" "${ROW#*[}"; stty echo)" + + # Set cursor position dynamically based on height of ascii/text. + [ "${lines:-0}" -lt "${info_height:-0}" ] && lines="$info_height" + + printf "%b%s" "\033[${lines}H\033[${prompt_height}A" +fi + +# Re-enable line wrap +[ "$line_wrap" == "off" ] && printf "%b%s" "\033[?7h" + +# If enabled take a screenshot +if [ "$scrot" == "on" ]; then + takescrot +fi + +# Show error messages +if [ "$verbose" == "on" ]; then + printf "$err" +fi + +# }}} diff --git a/neofetch b/neofetch index 8b648dfc..d9ef7afc 100755 --- a/neofetch +++ b/neofetch @@ -450,8 +450,7 @@ shopt -s nocasematch extglob case "$(uname)" in "Linux") os="Linux" ;; "Darwin") os="$(sw_vers -productName)" ;; - "OpenBSD") os="OpenBSD" ;; - *"BSD") os="BSD" ;; + *"BSD" | "DragonFly") os="BSD" ;; "CYGWIN"*) os="Windows" ;; *) printf "%s\n" "Unknown OS detected: $(uname)"; exit 1 ;; esac @@ -507,13 +506,8 @@ getdistro () { os_arch="off" ;; - "OpenBSD") - distro="OpenBSD" - ;; - "BSD") - distro="$(uname -v)" - distro=${distro%% *} + distro="$(uname -sr)" ;; "Windows") @@ -582,7 +576,7 @@ getuptime () { esac ;; - "Mac OS X" | "iPhone OS" | *"BSD") + "Mac OS X" | "iPhone OS" | "BSD") # Get boot time in seconds boot="$(sysctl -n kern.boottime)" boot="${boot/'{ sec = '}" @@ -714,7 +708,7 @@ getpackages () { packages=$((packages + $(pkgin list 2>/dev/null | wc -l))) ;; - *"BSD") + "BSD") if type -p pkg_info >/dev/null 2>&1; then packages=$(pkg_info | wc -l) @@ -945,6 +939,43 @@ getwmtheme () { getcpu () { case "$os" in + "Linux" | "Windows") + # Get cpu name + cpu="$(awk -F ': | @' '/model name/ {printf $2; exit}' /proc/cpuinfo)" + + # Get cpu speed + if [ -d "/sys/devices/system/cpu/cpu0/cpufreq" ]; then + case "$speed_type" in + current) speed_type="scaling_cur_freq" ;; + min) speed_type="scaling_min_freq" ;; + max) speed_type="scaling_max_freq" ;; + bios) speed_type="bios_limit" ;; + scaling_current) speed_type="scaling_cur_freq" ;; + scaling_min) speed_type="scaling_min_freq" ;; + scaling_max) speed_type="scaling_max_freq" ;; + esac + + read -t 1 -r speed < \ + /sys/devices/system/cpu/cpu0/cpufreq/${speed_type} + + speed=$((speed / 100000)) + else + speed=$(awk -F ': |\\.' '/cpu MHz/ {printf $2; exit}' /proc/cpuinfo) + speed=$((speed / 100)) + fi + + cores=$(awk -F ': ' '/siblings/ {printf $2; exit}' /proc/cpuinfo) + + # Fix for speeds under 1ghz + if [ -z "${speed:1}" ]; then + speed="0.${speed}" + else + speed=${speed:0:1}.${speed:1} + fi + + cpu="$cpu @ ${speed}GHz" + ;; + "Mac OS X") cpu="$(sysctl -n machdep.cpu.brand_string)" cores=$(sysctl -n hw.ncpu) @@ -1060,60 +1091,18 @@ getcpu () { esac ;; - *) - case "$distro" in - "OpenBSD"* | "FreeBSD"*) - # Get cpu name - cpu="$(sysctl -n hw.model)" - cpu=${cpu/[0-9]\.*} - cpu=${cpu/ @*} + "BSD") + # Get cpu name + cpu="$(sysctl -n hw.model)" + cpu=${cpu/[0-9]\.*} + cpu=${cpu/ @*} - # Get cpu speed - case "$distro" in - "OpenBSD"*) speed=$(sysctl -n hw.cpuspeed) ;; - "FreeBSD"*) speed=$(sysctl -n hw.clockrate) ;; - esac - speed=$((speed / 100)) - cores=$(sysctl -n hw.ncpu) - ;; + # Get cpu speed + speed=$(sysctl -n hw.cpuspeed hw.clockrate 2>/dev/null) + speed=$((speed / 100)) - *) - # Get cpu name - cpu="$(awk -F ': | @' '/model name/ {printf $2; exit}' /proc/cpuinfo)" - - # Get cpu speed - if [ -d "/sys/devices/system/cpu/cpu0/cpufreq" ]; then - case "$speed_type" in - current) speed_type="scaling_cur_freq" ;; - min) speed_type="scaling_min_freq" ;; - max) speed_type="scaling_max_freq" ;; - bios) speed_type="bios_limit" ;; - scaling_current) speed_type="scaling_cur_freq" ;; - scaling_min) speed_type="scaling_min_freq" ;; - scaling_max) speed_type="scaling_max_freq" ;; - esac - - read -t 1 -r speed < \ - /sys/devices/system/cpu/cpu0/cpufreq/${speed_type} - - speed=$((speed / 100000)) - else - speed=$(awk -F ': |\\.' '/cpu MHz/ {printf $2; exit}' /proc/cpuinfo) - speed=$((speed / 100)) - fi - - cores=$(awk -F ': ' '/siblings/ {printf $2; exit}' /proc/cpuinfo) - ;; - esac - - # Fix for speeds under 1ghz - if [ -z "${speed:1}" ]; then - speed="0.${speed}" - else - speed=${speed:0:1}.${speed:1} - fi - - cpu="$cpu @ ${speed}GHz" + # Get cpu cores + cores=$(sysctl -n hw.ncpu) ;; esac @@ -1324,7 +1313,7 @@ getgpu () { esac ;; - *"BSD") + "BSD") case "$distro" in "FreeBSD"*) gpu=$(pciconf -lv 2>/dev/null | grep -B 4 "VGA" | grep "device") @@ -1401,7 +1390,7 @@ getmemory () { memused=$(((${memwired//.} + ${memactive//.} + ${memcompressed//.}) * 4 / 1024)) ;; - "OpenBSD" | "BSD") + "BSD") case "$distro" in "OpenBSD"*) mem=($(top -d 1 | awk -F ': |/| |M' '/Memory:/ {printf $4 " " $6 " " $11 "\n"}')) @@ -1522,7 +1511,7 @@ getsong () { getresolution () { case "$os" in - "Linux" | *"BSD") + "Linux" | "BSD") if type -p xrandr >/dev/null 2>&1; then case "$refresh_rate" in "on") resolution=$(xrandr --nograb --current | awk 'match($0,/[0-9]{2,3}.[0-9]{2}\*/) {printf $1 " @ " substr($0,RSTART,RLENGTH) "Hz, "}') ;; @@ -1747,12 +1736,11 @@ getdisk () { # df flags case "$os" in "Linux" | "iPhone OS" | "Windows") df_flags="-h -l --total" ;; - "Mac OS X") df_flags="-H / -l" ;; - - *"BSD") + "Mac OS X" | "BSD") case "$distro" in - "FreeBSD"*) df_flags="-h -c -l" ;; - *) return ;; + "OpenBSD"*) return ;; + "FreeBSD"* | *"OS X"* ) df_flags="-H / -l" ;; + *) df_flags="-h -c -l" ;; esac ;; esac @@ -1837,7 +1825,7 @@ getbattery () { "BSD") case "$distro" in - "FreeBSD"*) + "FreeBSD"* | "DragonFly"*) battery=$(acpiconf -i 0 | awk -F ':\t' '/Remaining capacity/ {print $2}') battery_state=$(acpiconf -i 0 | awk -F ':\t\t\t' '/State/ {print $2}') ;; @@ -1901,7 +1889,7 @@ getlocalip () { [ -z "$localip" ] && localip="$(ipconfig getifaddr en1)" ;; - *"BSD") + "BSD") localip="$(ifconfig | awk '/broadcast/ {print $2}')" ;; @@ -1960,7 +1948,7 @@ getbirthday () { birthday_shorthand="on" ;; - *"BSD") + "BSD") case "$distro" in "OpenBSD"*) birthday="$(ls -alctT / | awk '/lost\+found/ {printf $6 " " $7 " " $9 " " $8}')" @@ -1972,7 +1960,7 @@ getbirthday () { date_cmd="$(date -j -f "%b %d %Y" "$birthday" "$birthday_format")" ;; - "NetBSD"*) + "NetBSD"* | "DragonFly"*) birthday="$(ls -alctT /etc/defaults/rc.conf | awk '{printf $6 " " $7 " " $9 " " $8}')" birthday_shorthand="on" ;; @@ -2030,7 +2018,7 @@ getcols () { getwallpaper () { case "$os" in - "Linux" | *"BSD") + "Linux" | "BSD") if type -p feh >/dev/null 2>&1 && [ -f "$HOME/.fehbg" ]; then img="$(awk -F\' '/feh/ {printf $2}' "$HOME/.fehbg")" From 350a4c90bc430bcf6d196a1f195d756ddf936908 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 19:50:19 +1000 Subject: [PATCH 02/30] Remove stray file --- ; | 3216 ------------------------------------------------------------- 1 file changed, 3216 deletions(-) delete mode 100644 ; diff --git a/; b/; deleted file mode 100644 index 4d6b9e6a..00000000 --- a/; +++ /dev/null @@ -1,3216 +0,0 @@ -#!/usr/bin/env bash -# set -x -# vim: fdm=marker:noai:ts=4:sw=4 -# -# Neofetch info about your system -# https://github.com/dylanaraps/neofetch -# -# Required Dependencies: -# Bash 3.0+ -# xprop -# [Linux / BSD / Windows] Uptime detection: procps or procps-ng -# -# Optional Dependencies: (You'll lose these features without them) -# Displaying Images: w3m + w3m-img -# Image Cropping: ImageMagick -# Displaying song with Google Play Music: gpmdp-bash -# [ Linux / BSD ] Wallpaper Display: feh, nitrogen or gsettings -# [ Linux / BSD ] Current Song: mpc, cmus, moc -# [ Linux ] Current Song: spotify -# [ Linux / BSD ] Resolution detection: xorg-xdpyinfo -# [ OS X ] Getting screen resolution (faster): screenresolution -# -# Created by Dylan Araps -# https://github.com/dylanaraps/ - -version="${BASH_VERSION/.*}" -SYS_LOCALE="${LANG:-C}" -XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}" - -# Speed up script by not using unicode -export LC_ALL=C -export LANG=C - - -# Config Options {{{ - - -# Info Options {{{ - - -# Info -# See this wiki page for more info: -# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info -printinfo () { - info title - info underline - - info "OS" distro - info "Kernel" kernel - info "Uptime" uptime - info "Packages" packages - info "Shell" shell - info "Resolution" resolution - info "DE" de - info "WM" wm - info "WM Theme" wmtheme - info "Theme" theme - info "Icons" icons - info "Font" font - info "CPU" cpu - info "GPU" gpu - info "Memory" memory - - # info "Disk" disk - # info "Battery" battery - # info "Song" song - # info "Local IP" localip - # info "Public IP" publicip - # info "Users" users - # info "Birthday" birthday - - info linebreak - info cols - info linebreak - info linebreak -} - - -# Kernel - -# Show more kernel info -# --kernel_shorthand on/off -kernel_shorthand="on" - - -# Distro - -# Mac OS X hide/show build version -# --osx_buildversion on/off -osx_buildversion="on" - -# Mac OS X hide/show codename -# --osx_codename on/off -osx_codename="on" - -# Show 'x86_64' and 'x86' in 'Distro:' output. -# --os_arch on/off -os_arch="on" - - -# Uptime - -# Shorten the output of the uptime function -# --uptime_shorthand tiny, on, off -uptime_shorthand="off" - - -# Shell - -# Show the path to $SHELL -# --shell_path on/off -shell_path="on" - -# Show $SHELL's version -# --shell_version on/off -shell_version="off" - - -# CPU - -# CPU speed type -# Only works on Linux with cpufreq. -# --speed_type current, min, max, bios, -# scaling_current, scaling_min, scaling_max -speed_type="max" - -# CPU Display -# Set shorthand setting and progress bar setting -# --cpu_display (name, speed, tiny, on, off) (bar, infobar, barinfo, off) -cpu_shorthand="off" -cpu_display="off" - -# CPU Cores -# Display CPU cores in output -# --cpu_cores on/off -cpu_cores="on" - -# GPU - -# Shorten output of the getgpu funcion -# --gpu_shorthand on/off/tiny -gpu_shorthand="on" - -# Resolution - -# Display refresh rate next to each monitor -# Unsupported on Windows -# --refresh_rate on/off -refresh_rate="off" - -# Gtk Theme / Icons - -# Shorten output (Hide [GTK2] etc) -# --gtk_shorthand on/off -gtk_shorthand="off" - - -# Enable/Disable gtk2 theme/icons output -# --gtk2 on/off -gtk2="on" - -# Enable/Disable gtk3 theme/icons output -# --gtk3 on/off -gtk3="on" - - -# Battery - -# Which battery to display. -# By default we display all batteries. -# NOTE: Only works on Linux. -# --battery_num all, 0, 1, 2, etc -battery_num="all" - -# Whether or not to print each battery on the same line. -# By default each battery gets its own line and title. -# NOTE: Only works on Linux. -# --battery_shorthand on/off -battery_shorthand="off" - - -# IP Address - -# Website to ping for the public IP -# --ip_host url -public_ip_host="http://ident.me" - - -# Song - -# Print the Artist and Title on seperate lines -# --song_shorthand on/off -song_shorthand="off" - - -# Birthday - -# Whether to show a long pretty output -# or a shortened one -# NOTE: Long pretty output doesn't work on OpenBSD or NetBSD. -# --birthday_shorthand on/off -birthday_shorthand="off" - -# Whether to show the time in the output -# --birthday_time on/off -birthday_time="on" - -# Date format to use when printing birthday -# --birthday_format "format" -birthday_format="%a %d %b %Y %l:%M %p" - - -# Color Blocks - -# Color block range -# --block_range start end -start=0 -end=7 - -# Toggle color blocks -# --color_blocks on/off -color_blocks="on" - -# Color block width -# --color_block_width num -block_width=3 - - -# }}} - -# Text Colors {{{ - - -# Text Colors -# Each number represents a different part of -# the text in this order: -# title, @, underline, subtitle, colon, info -# colors=(4 6 1 8 8 6) -# You can also specify: -# fg (foreground color) -colors=(distro) - - -# }}} - -# Text Options {{{ - - -# Toggle line wrapping -# --line_wrap on/off -line_wrap="off" - -# Toggle bold text -# --bold on/off -bold="on" - -# Enable/Disable Underline -# --underline on/off -underline_enabled="on" - -# Underline character -# --underline_char char -underline_char="-" - -# Prompt height -# You should only have to change this if your -# prompt is greater than 2 lines high. -# --prompt_height num -prompt_height=1 - - -# }}} - -# Progress Bars {{{ - - -# Progress bar character -# --progress_char elapsed_char total_char -progress_char_elapsed="=" -progress_char_total="-" - -# Progress vorder -# --progress_border on/off -progress_border="on" - -# Progress bar length in spaces -# Number of chars long to make the progress bars. -# --progress_length num -progress_length="15" - -# Progress bar colors -# When set to distro, uses your distro's logo colors -# Takes: num, "distro" -# --progress_colors col col -progress_color_elapsed="distro" -progress_color_total="distro" - -# Customize how the info is displayed. -# bar: Only the progress bar is displayed. -# infobar: The bar is displayed after the info. -# barinfo: The bar is displayed before the info. -# off: Only the info is displayed. -# -# --memory_display bar/infobar/barinfo/off -# --battery_display bar/infobar/barinfo/off -# --disk_display bar/infobar/barinfo/off -memory_display="off" -battery_display="off" -disk_display="off" - - -# }}} - -# Image Options {{{ - - -# Image Source -# --image wall, ascii, /path/to/img, /path/to/dir/, off -image="wall" - -# Thumbnail directory -thumbnail_dir="$HOME/.cache/thumbnails/neofetch" - -# W3m-img path -# This is automatically detected, this variable -# should only be set to w3m-img's location if the -# builtin detection doesn't work. -w3m_img_path="/usr/lib/w3m/w3mimgdisplay" - -# Image position -# Only works with the w3m backend -# --image_position left/right -image_position="left" - -# Crop mode -# --crop_mode normal/fit/fill -crop_mode="normal" - -# Crop offset -# Only affects normal mode. -# --crop_offset northwest/north/northeast/west/center -# east/southwest/south/southeast -crop_offset="center" - -# Image size -# The image is half the terminal width by default. -# --size auto, 00px, 00% -image_size="auto" - -# Right gap between image and text -# --gap num -gap=2 - -# Image offsets -# --xoffset px -# --yoffset px -yoffset=0 -xoffset=0 - - -# }}} - -# Ascii Options {{{ - - -# Default ascii image to use -# When this is set to distro it will use your -# distro's logo as the ascii. -# --ascii 'distro', path/to/ascii -ascii="distro" - -# Ascii colors -# When this is set to distro it will use your -# ditro's colors to color the ascii. -# NOTE: You can also set this to a range of colors -# which will allow you to custom color distro logos -# --ascii_colors distro -# --ascii_colors 2 4 5 6 -ascii_colors=(distro) - -# Logo size -# Arch, Crux and Gentoo have a smaller logo -# variant. Changing the value below to 'small' -# will make neofetch use the small logo. -# --ascii_logo_size small, normal -ascii_logo_size="normal" - - -# }}} - -# Scrot Options {{{ - - -# Whether or not to always take a screenshot -# You can manually take a screenshot with "--scrot" or "-s" -scrot="off" - -# Screenshot program to launch -# --scrot_cmd -scrot_cmd="scrot -c -d 3" - -# Scrot dir -# Where to save the screenshots -# --scrot_dir /path/to/screenshot/folder -scrot_dir="$HOME/Pictures/" - -# Scrot filename -# What to name the screenshots -# --scrot_name str -scrot_name="neofetch-$(date +%F-%T).png" - - -# }}} - -# Stdout options {{{ - -# Separator for stdout mode -# --stdout_separator string -stdout_separator=" " - -# }}} - -# Config Options {{{ - - -# Enable/Disable config file -# --config off, none -config="on" - -# Path to custom config file location -# --config path/to/config -config_file="${XDG_CONFIG_HOME:-${HOME}/.config}/neofetch/config" - - -# }}} - - -# }}} - - -# Gather Info {{{ - - -# Set no case match and extended globbing. -shopt -s nocasematch extglob - - -# Operating System {{{ - -case "$(uname)" in - "Linux") os="Linux" ;; - "Darwin") os="$(sw_vers -productName)" ;; - "OpenBSD") os="OpenBSD" ;; - *"BSD") os="BSD" ;; - "CYGWIN"*) os="Windows" ;; - *) printf "%s\n" "Unknown OS detected: $(uname)"; exit 1 ;; -esac - -# }}} - -# Distro {{{ - -getdistro () { - [ ! -z "$distro" ] && return - - case "$os" in - "Linux" ) - if type -p lsb_release >/dev/null 2>&1; then - distro="$(lsb_release -d 2>/dev/null | awk -F ':' '/Description/ {printf $2}')" - distro=${distro/[[:space:]]} - - elif type -p crux >/dev/null 2>&1; then - distro="$(crux)" - - else - distro="$(awk -F 'NAME=' '/^NAME=/ {printf $2}' /etc/*ease)" - distro=${distro//\"} - - # Workaround for distros that store the value differently. - [ -z "$distro" ] && distro="$(awk -F 'TAILS_PRODUCT_NAME="|"' '/^TAILS_PRODUCT_NAME=/ {printf $2}' /etc/*ease)" - [ -z "$distro" ] && distro="$(awk '/BLAG/ {print $1; exit}' /etc/*ease)" - fi - ;; - - "Mac OS X") - osx_version=$(sw_vers -productVersion) - osx_build=$(sw_vers -buildVersion) - - case "${osx_version%.*}" in - "10.4") codename="Mac OS X Tiger" ;; - "10.5") codename="Mac OS X Leopard" ;; - "10.6") codename="Mac OS X Snow Leopard" ;; - "10.7") codename="Mac OS X Lion" ;; - "10.8") codename="OS X Mountain Lion" ;; - "10.9") codename="OS X Mavericks" ;; - "10.10") codename="OS X Yosemite" ;; - "10.11") codename="OS X El Capitan" ;; - *) codename="Mac OS X" ;; - esac - distro="$codename $osx_version $osx_build" - ;; - - "iPhone OS") - distro="iOS $(sw_vers -productVersion)" - - # "uname -m" doesn't print architecture on iOS so we force it off. - os_arch="off" - ;; - - "OpenBSD") - distro="OpenBSD" - ;; - - "BSD") - distro="$(uname -sr)" - ;; - - "Windows") - distro="$(wmic os get Caption /value)" - - # Strip crap from the output of wmic - distro=${distro/Caption'='} - distro=${distro//[[:space:]]/ } - distro=${distro// } - distro=${distro/Microsoft } - ;; - esac - distro=${distro//+( )/ } - - # Get architecture - [ "$os_arch" == "on" ] && \ - distro+=" $(uname -m)" - - [ "$osx_codename" == "off" ] && \ - distro=${distro/${codename}/Mac OS X} - - [ "$osx_buildversion" == "off" ] && \ - distro=${distro/ ${osx_build}} -} - - -# }}} - -# Title {{{ - -gettitle () { - title="${USER:-$(whoami)}@${HOSTNAME:-$(hostname)}" -} - -# }}} - -# Kernel {{{ - -getkernel() { - case "$kernel_shorthand" in - "on") kernel="$(uname -r)" ;; - "off") kernel="$(uname -srm)" ;; - esac -} - -# }}} - -# Uptime {{{ - -getuptime () { - case "$os" in - "Linux" | "Windows") - case "$distro" in - *"Puppy"* | "Quirky Werewolf"* | "Alpine Linux"* | "Windows"*) - uptime=$(uptime | awk -F ':[0-9]{2}+ |(, ){1}+' '{printf $2}') - ;; - - "openSUSE"*) - uptime=$(uptime | awk -F ':[0-9]{2}+[a-z][a-z] |(, ){1}+' '{printf $2}') - ;; - - *) - uptime="$(uptime -p)" - [ "$uptime" == "up " ] && uptime="up $(awk -F'.' '{print $1}' /proc/uptime) seconds" - ;; - esac - ;; - - "Mac OS X" | "iPhone OS" | *"BSD") - # Get boot time in seconds - boot="$(sysctl -n kern.boottime)" - boot="${boot/'{ sec = '}" - boot=${boot/,*} - - # Get current date in seconds - now=$(date +%s) - uptime=$((now - boot)) - - # Convert uptime to days/hours/mins - minutes=$((uptime / 60%60)) - hours=$((uptime / 3600%24)) - days=$((uptime / 86400)) - - case "$minutes" in - 1) minutes="1 minute" ;; - 0) unset minutes ;; - *) minutes="$minutes minutes" ;; - esac - - case "$hours" in - 1) hours="1 hour" ;; - 0) unset hours ;; - *) hours="$hours hours" ;; - esac - - case "$days" in - 1) days="1 day" ;; - 0) unset days ;; - *) days="$days days" ;; - esac - - [ ! -z "$hours" ] && \ - [ ! -z "$minutes" ] && \ - hours+="," - - [ ! -z "$days" ] && \ - [ ! -z "$hours" ] && \ - days+="," - - uptime="up $days $hours $minutes" - ;; - esac - - # Make the output of uptime smaller. - case "$uptime_shorthand" in - "on") - uptime=${uptime/up } - uptime=${uptime/minutes/mins} - uptime=${uptime/minute/min} - uptime=${uptime/seconds/secs} - uptime=${uptime# } - ;; - - "tiny") - uptime=${uptime/up } - uptime=${uptime/ days/d} - uptime=${uptime/ day/d} - uptime=${uptime/ hours/h} - uptime=${uptime/ hour/h} - uptime=${uptime/ minutes/m} - uptime=${uptime/ minute/m} - uptime=${uptime/ seconds/s} - uptime=${uptime/,} - uptime=${uptime# } - ;; - esac - uptime=${uptime//+( )/ } -} - -# }}} - -# Package Count {{{ - -getpackages () { - case "$os" in - "Linux" | "iPhone OS") - type -p pacman >/dev/null 2>&1 && \ - packages="$(pacman -Qq --color never | wc -l)" - - type -p dpkg >/dev/null 2>&1 && \ - packages=$((packages+=$(dpkg --get-selections | grep -cv deinstall$))) - - type -p /sbin/pkgtool >/dev/null 2>&1 && \ - packages=$((packages+=$(ls -1 /var/log/packages | wc -l))) - - type -p rpm >/dev/null 2>&1 && \ - packages=$((packages+=$(rpm -qa | wc -l))) - - type -p xbps-query >/dev/null 2>&1 && \ - packages=$((packages+=$(xbps-query -l | wc -l))) - - type -p pkginfo >/dev/null 2>&1 && \ - packages=$((packages+=$(pkginfo -i | wc -l))) - - type -p pisi >/dev/null 2>&1 && \ - packages=$((packages+=$(pisi list-installed | wc -l))) - - type -p pkg >/dev/null 2>&1 && \ - packages=$((packages+=$(ls -1 /var/db/pkg | wc -l))) - - type -p emerge >/dev/null 2>&1 && \ - packages=$((packages+=$(ls -d /var/db/pkg/*/* | wc -l))) - - type -p nix-env >/dev/null 2>&1 && \ - packages=$((packages+=$(ls -d -1 /nix/store/*/ | wc -l))) - - type -p apk >/dev/null 2>&1 && \ - packages=$((packages+=$(apk info | wc -l))) - - type -p pacman-g2 >/dev/null 2>&1 && \ - packages=$((packages+=$(pacman-g2 -Q | wc -l))) - - type -p cave >/dev/null 2>&1 && \ - packages=$((packages+=$(ls -d -1 /var/db/paludis/repositories/cross-installed/*/data/* /var/db/paludis/repositories/installed/data/* | wc -l))) - ;; - - "Mac OS X") - [ -d "/usr/local/bin" ] && \ - packages=$(($(ls -l /usr/local/bin/ | grep -v "\(../Cellar/\|brew\)" | wc -l) - 1)) - - type -p port >/dev/null 2>&1 && \ - packages=$((packages + $(port installed 2>/dev/null | wc -l) - 1)) - - type -p brew >/dev/null 2>&1 && \ - packages=$((packages + $(find /usr/local/Cellar -maxdepth 1 2>/dev/null | wc -l) - 1)) - - type -p pkgin >/dev/null 2>&1 && \ - packages=$((packages + $(pkgin list 2>/dev/null | wc -l))) - ;; - - *"BSD") - if type -p pkg_info >/dev/null 2>&1; then - packages=$(pkg_info | wc -l) - - elif type -p pkg >/dev/null 2>&1; then - packages=$(pkg info | wc -l) - fi - ;; - - "Windows") - packages=$(cygcheck -cd | wc -l) - - # Count chocolatey packages - [ -d "/cygdrive/c/ProgramData/chocolatey/lib" ] && \ - packages=$((packages+=$(ls -1 /cygdrive/c/ProgramData/chocolatey/lib | wc -l))) - ;; - esac - packages=${packages// } -} - -# }}} - -# Shell {{{ - -getshell () { - case "$shell_path" in - "on") shell="$SHELL" ;; - "off") shell="${SHELL##*/}" ;; - esac - - if [ "$shell_version" == "on" ]; then - shell+=" " - case "$shell" in - *"bash"*) - shell+="$(bash --version | head -n 1)" - shell=${shell/ *, version} - ;; - - *"zsh"*) - shell+="$(zsh --version)" - shell=${shell/ zsh} - ;; - - *"mksh"* | *"ksh") - shell+="$("$SHELL" -c 'printf "%s" "$KSH_VERSION"')" - shell=${shell/ * KSH} - ;; - - *"tcsh"* | *"csh"*) - shell+="$("$SHELL" --version)" - shell=${shell/tcsh} - shell=${shell/\(*} - ;; - esac - - shell="${shell/\(*\)}" - fi -} - -# }}} - -# Desktop Environment {{{ -getde () { - case "$os" in - "Mac OS X") de="Aqua" ;; - *) - de="${XDG_CURRENT_DESKTOP/i3}" - de=${de/'X-'} - ;; - esac - - if [ -n "$DISPLAY" ] && [ -z "$de" ]; then - de="$(xprop -root | awk '/KDE_SESSION_VERSION|^_MUFFIN|xfce4|xfce5/' 2>/dev/null)" - - case "$de" in - "KDE_SESSION_VERSION"*) de="KDE${de/* = }" ;; - *"TDE_FULL_SESSION"*) de="Trinity" ;; - *"MUFFIN"*) de="Cinnamon" ;; - *"xfce4"*) de="XFCE4" ;; - *"xfce5"*) de="XFCE5" ;; - esac - fi -} - -# }}} - -# Window Manager {{{ - -getwm () { - if [ -n "$DISPLAY" ] && [ "$os" != "Mac OS X" ]; then - id="$(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}')" - wm="$(xprop -id "$id" -notype -f _NET_WM_NAME 8t)" - wm=${wm/*_NET_WM_NAME = } - wm=${wm/\"} - wm=${wm/\"*} - - # Fallback for Wayland wms - case "$wm" in - "xwlc") - wm="$(ps -e | grep -m 1 -oE "sway|orbment|velox|orbital")" - [ "$version" -ge 4 ] && wm=${wm^} - ;; - esac - - else - case "$os" in - "Mac OS X") wm="Quartz Compositor" ;; - "Windows") wm="Explorer" ;; - esac - fi -} - -# }}} - -# Window Manager Theme {{{ - -getwmtheme () { - [ -z "$wm" ] && getwm - [ -z "$de" ] && getde - - case "$wm" in - 'BudgieWM') wmtheme="$(gsettings get org.gnome.desktop.wm.preferences theme)" ;; - 'E16') wmtheme="$(awk -F "= " '/theme.name/ {print $2}' "$HOME/.e16/e_config--0.0.cfg")";; - 'Sawfish') wmtheme="$(awk -F ")" '/\(quote default-frame-style/ {print $2}' "$HOME/.sawfish/custom")" ;; - - 'Cinnamon' | 'Muffin' | 'Mutter (Muffin)') - detheme="$(gsettings get org.cinnamon.theme name)" - wmtheme="$(gsettings get org.cinnamon.desktop.wm.preferences theme)" - wmtheme="$detheme (${wmtheme})" - ;; - - 'Compiz' | 'Mutter'* | 'GNOME Shell' | 'Gala') - if type -p gsettings >/dev/null 2>&1; then - wmtheme="$(gsettings get org.gnome.desktop.wm.preferences theme)" - - elif type -p gconftool-2 >/dev/null 2>&1; then - wmtheme="$(gconftool-2 -g /apps/metacity/general/theme)" - fi - ;; - - 'Metacity'*) - if [ "$de" == "Deepin" ]; then - wmtheme="$(gsettings get com.deepin.wrap.gnome.desktop.wm.preferences theme 2>/dev/null)" - - else - wmtheme="$(gconftool-2 -g /apps/metacity/general/theme 2>/dev/null)" - fi - ;; - - 'E17' | 'Enlightenment') - if type -p eet >/dev/null 2>&1; then - wmtheme="$(eet -d $HOME/.e/e/config/standard/e.cfg config | awk '/value \"file\" string.*.edj/ {print $4}')" - wmtheme=${wmtheme##*/} - wmtheme=${wmtheme%.*} - fi - ;; - - 'Fluxbox') - [ -f $HOME/.fluxbox/init ] && \ - wmtheme="$(awk -F "/" '/styleFile/ {print $NF}' "$HOME/.fluxbox/init")" - ;; - - 'IceWM'*) - [ -f $HOME/.icewm/theme ] && \ - wmtheme="$(awk -F "[\",/]" '!/#/ {print $2}' "$HOME/.icewm/theme")" - ;; - - 'Openbox') - if [ "$de" == "LXDE" ] && [ -f "${HOME}/.config/openbox/lxde-rc.xml" ]; then - ob_file="lxde-rc" - - elif [ -f "${HOME}/.config/openbox/rc.xml" ]; then - ob_file="rc" - fi - - wmtheme="$(awk -F "[<,>]" '//dev/null)" - wmtheme="${wmtheme##*\\}" - wmtheme="${wmtheme%.*}" - wmtheme="${wmtheme^}" - ;; - - esac - - wmtheme="${wmtheme//\'}" - [ "$version" -ge 4 ] && wmtheme=${wmtheme^} -} - -# }}} - -# CPU {{{ - -getcpu () { - case "$os" in - "Mac OS X") - cpu="$(sysctl -n machdep.cpu.brand_string)" - cores=$(sysctl -n hw.ncpu) - ;; - - "iPhone OS") - ios_model=${ios_model:-$(uname -m)} - case "$ios_model" in - "iPhone1,1" | "iPhone1,2" | "iPod1,1") - cpu="Samsung S5L8900 @ 412MHz" - cores="1" - ;; - - "iPhone2,1") - cpu="Samsung S5PC100 @ 600MHz" - cores="1" - ;; - - "iPhone3,1" | "iPhone3,2" | "iPhone3,3" | "iPod4,1") - cpu="Apple A4 @ 800MHz" - cores="1" - ;; - - "iPhone4,1" | "iPod5,1") - cpu="Apple A5 @ 800MHz" - cores="2" - ;; - - "iPhone5,1" | "iPhone5,2" | "iPhone5,3" | "iPhone5,4") - cpu="Apple A6 @ 1.3GHz" - cores="2" - ;; - - "iPhone6,1" | "iPhone6,2") - cpu="Apple A7 @ 1.3GHz" - cores="2" - ;; - - "iPhone7,1" | "iPhone7,2") - cpu="Apple A8 @ 1.4GHz" - cores="2" - ;; - - "iPhone8,1" | "iPhone8,2" | "iPhone8,4") - cpu="Apple A9 @ 1.85GHz" - cores="2" - ;; - - "iPod2,1") - cpu="Samsung S5L8720 @ 533MHz" - cores="1" - ;; - - "iPod3,1") - cpu="Samsung S5L8922 @ 600MHz" - cores="1" - ;; - - "iPod7,1") - cpu="Apple A8 @ 1.1GHz" - cores="2" - ;; - - "iPad1,1") - cpu="Apple A4 @ 1GHz" - cores="1" - ;; - - "iPad2,1" | "iPad2,2" | "iPad2,3" | "iPad2,4" | "iPad2,5" | "iPad2,6" | "iPad2,7") - cpu="Apple A5 @ 1GHz" - cores="2" - ;; - - "iPad3,1" | "iPad3,2" | "iPad3,3") - cpu="Apple A5X @ 1GHz" - cores="2" - ;; - - "iPad3,4" | "iPad3,5" | "iPad3,6") - cpu="Apple A6X @ 1.4GHz" - cores="2" - ;; - - "iPad4,1" | "iPad4,2" | "iPad4,3") - cpu="Apple A7 @ 1.4GHz" - cores="2" - ;; - - "iPad4,4" | "iPad4,5" | "iPad4,6" | "iPad4,7" | "iPad4,8" | "iPad4,9") - cpu="Apple A7 @ 1.4GHz" - cores="2" - ;; - - "iPad5,1" | "iPad5,2") - cpu="Apple A8 @ 1.5GHz" - cores="2" - ;; - - "iPad5,3" | "iPad5,4") - cpu="Apple A8X @ 1.5GHz" - cores="3" - ;; - - "iPad6,3" | "iPad6,4") - cpu="Apple A9X @ 2.16GHz" - cores="2" - ;; - - "iPad6,7" | "iPad6,8") - cpu="Apple A9X @ 2.26GHz" - cores="2" - ;; - esac - ;; - - *) - case "$distro" in - "OpenBSD"* | "FreeBSD"*) - # Get cpu name - cpu="$(sysctl -n hw.model)" - cpu=${cpu/[0-9]\.*} - cpu=${cpu/ @*} - - # Get cpu speed - case "$distro" in - "OpenBSD"*) speed=$(sysctl -n hw.cpuspeed) ;; - "FreeBSD"*) speed=$(sysctl -n hw.clockrate) ;; - esac - speed=$((speed / 100)) - cores=$(sysctl -n hw.ncpu) - ;; - - *) - # Get cpu name - cpu="$(awk -F ': | @' '/model name/ {printf $2; exit}' /proc/cpuinfo)" - - # Get cpu speed - if [ -d "/sys/devices/system/cpu/cpu0/cpufreq" ]; then - case "$speed_type" in - current) speed_type="scaling_cur_freq" ;; - min) speed_type="scaling_min_freq" ;; - max) speed_type="scaling_max_freq" ;; - bios) speed_type="bios_limit" ;; - scaling_current) speed_type="scaling_cur_freq" ;; - scaling_min) speed_type="scaling_min_freq" ;; - scaling_max) speed_type="scaling_max_freq" ;; - esac - - read -t 1 -r speed < \ - /sys/devices/system/cpu/cpu0/cpufreq/${speed_type} - - speed=$((speed / 100000)) - else - speed=$(awk -F ': |\\.' '/cpu MHz/ {printf $2; exit}' /proc/cpuinfo) - speed=$((speed / 100)) - fi - - cores=$(awk -F ': ' '/siblings/ {printf $2; exit}' /proc/cpuinfo) - ;; - esac - - # Fix for speeds under 1ghz - if [ -z "${speed:1}" ]; then - speed="0.${speed}" - else - speed=${speed:0:1}.${speed:1} - fi - - cpu="$cpu @ ${speed}GHz" - ;; - esac - - # Remove uneeded patterns from cpu output - # This is faster than sed/gsub - cpu=${cpu//(tm)} - cpu=${cpu//(TM)} - cpu=${cpu//(r)} - cpu=${cpu//(R)} - cpu=${cpu//CPU} - cpu=${cpu//Processor} - cpu=${cpu//Six-Core} - cpu=${cpu//Eight-Core} - cpu=${cpu/Dual-Core} - cpu=${cpu/Quad-Core} - cpu=${cpu//with Radeon HD Graphics} - - # Add cpu cores to output - [ "$cpu_cores" == "on" ] && [ ! -z "$cores" ] && \ - cpu=${cpu/@/\(${cores}\) @} - - # Make the output of cpu shorter - case "$cpu_shorthand" in - "name") - cpu=${cpu/@*} - ;; - - "speed") - cpu=${cpu#*@ } - ;; - - "on" | "tiny") - cpu=${cpu/Intel } - cpu=${cpu/Core } - cpu=${cpu/Core? Duo } - cpu=${cpu/AMD } - - case "$cpu_shorthand" in - "tiny") cpu=${cpu/@*} ;; - esac - ;; - esac - - # Trim whitespace - cpu=${cpu//+( )/ } - - [ ! -z "$cpu" ] && prin "$subtitle" "$cpu" - - if [ "$cpu_display" != "off" ]; then - cpu_usage="$(ps aux | awk 'BEGIN { sum = 0 } { sum += $3 }; END { print sum }')" - cpu_usage="${cpu_usage/\.*}%" - - case "$cpu_display" in - "info") prin "$subtitle Usage" "$cpu_usage" ;; - "bar") prin "$subtitle Usage" "$(bar "${cpu_usage/'%'}" $(( 100 * cores )))" ;; - "infobar") prin "$subtitle Usage" "${cpu_usage} $(bar "${cpu_usage/'%'}" $(( 100 * cores )))" ;; - "barinfo") prin "$subtitle Usage" "$(bar "${cpu_usage/'%'}" $(( 100 * cores ))) $cpu_usage" ;; - esac - fi - [ "$stdout_mode" != "on" ] && unset cpu -} - -# }}} - -# GPU {{{ - -getgpu () { - case "$os" in - "Linux") - gpu="$(PATH="/sbin:$PATH" lspci | grep -F "3D")" - - # If a GPU with a prefix of '3D' doesn't exist - # fallback to looking for a prefix of 'VGA' - [ -z "$gpu" ] && \ - gpu="$(PATH="/sbin:$PATH" lspci | grep -F "VGA")" - - gpu=${gpu//??':'??'.'?} - - # Count the number of GPUs - count="$(printf "%s" "$gpu" | uniq -c)" - count=${count/ VGA*} - count=${count/ 3D*} - count=${count//[[:space:]]} - - # If there's more than one gpu - # Display the count. - if [ "$count" -gt 1 ]; then - count=" x $count" - else - unset count - fi - - # Format the output - gpu=${gpu/* VGA compatible controller: } - gpu=${gpu/* 3D controller: } - gpu=${gpu/(rev*)} - - case "$gpu" in - intel*) - gpu="Intel Integrated Graphics" - ;; - - advanced*) - gpu=${gpu/Advanced Micro Devices, Inc\. } - gpu=${gpu/'[AMD/ATI]' } - gpu=${gpu/Tahiti PRO} - gpu=${gpu/Seymour} - gpu=${gpu/Cayman} - gpu=${gpu/Richland} - gpu=${gpu/Pitcairn} - gpu=${gpu/Broadway} - gpu=${gpu/XTMobility} - gpu=${gpu/Mobility} - gpu=${gpu/Hawaii} - gpu=${gpu/Tobago} - gpu=${gpu/Thames} - gpu=${gpu/Kabini} - gpu=${gpu/Bonaire} - gpu=${gpu/XTX} - gpu=${gpu/ OEM} - gpu=${gpu/ Cape Verde} - gpu=${gpu/ \[} - gpu=${gpu/\]} - - brand="AMD " - ;; - - nvidia*) - gpu=${gpu/NVIDIA Corporation } - gpu=${gpu/G????M } - gpu=${gpu/G???? } - gpu=${gpu/\[} - gpu=${gpu/\] } - - brand="NVIDIA " - ;; - - *virtualbox*) - gpu="VirtualBox Graphics Adapter" - ;; - esac - - gpu="${brand}${gpu}" - ;; - - "Mac OS X") - # Use cache if it exists - if [ -f "/Library/Caches/neofetch/gpu" ]; then - source "/Library/Caches/neofetch/gpu" - else - gpu=$(system_profiler SPDisplaysDataType | awk -F': ' '/^\ *Chipset Model:/ {printf $2 ", "}') - gpu=${gpu//'/ $'} - gpu=${gpu%,*} - cache "gpu" "$gpu" "/Library/Caches/" - fi - ;; - - "iPhone OS") - ios_model=${ios_model:-$(uname -m)} - case "$ios_model" in - "iPhone1,1" | "iPhone1,2") - gpu="PowerVR MBX Lite 3D" - ;; - - "iPhone2,1" | "iPhone3,1" | "iPhone3,2" | "iPhone3,3" | "iPod3,1" | "iPod4,1" | "iPad1,1") - gpu="PowerVR SGX535" - ;; - - "iPhone4,1" | "iPad2,1" | "iPad2,2" | "iPad2,3" | "iPad2,4" | "iPad2,5" | "iPad2,6" | "iPad2,7" | "iPod5,1") - gpu="PowerVR SGX543MP2" - ;; - - "iPhone5,1" | "iPhone5,2" | "iPhone5,3" | "iPhone5,4") - gpu="PowerVR SGX543MP3" - ;; - - "iPhone6,1" | "iPhone6,2" | "iPad4,1" | "iPad4,2" | "iPad4,3" | "iPad4,4" | "iPad4,5" | "iPad4,6" | "iPad4,7" | "iPad4,8" | "iPad4,9") - gpu="PowerVR G6430" - ;; - - "iPhone7,1" | "iPhone7,2" | "iPod7,1" | "iPad5,1" | "iPad5,2") - gpu="PowerVR GX6450" - ;; - - "iPhone8,1" | "iPhone8,2" | "iPhone8,4") - gpu="PowerVR GT7600" - ;; - - "iPod1,1" | "iPod2,1") - gpu="PowerVR MBX Lite" - ;; - - "iPad3,1" | "iPad3,2" | "iPad3,3") - gpu="PowerVR SGX534MP4" - ;; - - "iPad3,4" | "iPad3,5" | "iPad3,6") - gpu="PowerVR SGX554MP4" - ;; - - "iPad5,3" | "iPad5,4") - gpu="PowerVR GXA6850" - ;; - - "iPad6,3" | "iPad6,4" | "iPad6,7" | "iPad6,8") - gpu="PowerVR 7XT" - ;; - esac - ;; - - *"BSD") - case "$distro" in - "FreeBSD"*) - gpu=$(pciconf -lv 2>/dev/null | grep -B 4 "VGA" | grep "device") - gpu=${gpu/device*= } - gpu=${gpu//\'} - ;; - - *) - gpu=$(glxinfo | grep -F 'OpenGL renderer string') - gpu=${gpu/'OpenGL renderer string: '} - ;; - esac - ;; - - - "Windows") - gpu=$(wmic path Win32_VideoController get caption /value) - gpu=${gpu/Caption'='} - gpu=${gpu//[[:space:]]/ } - gpu=${gpu// } - ;; - esac - - case "$gpu_shorthand" in - "on" | "tiny") - gpu=${gpu// Rev\. ?} - gpu=${gpu//AMD*\/ATI\]/AMD} - gpu=${gpu// Tahiti} - gpu=${gpu// PRO} - gpu=${gpu// OEM} - gpu=${gpu// Mars} - gpu=${gpu// Series} - gpu=${gpu// Controller} - gpu=${gpu/\/*} - - case "$gpu_shorthand" in - "tiny") - gpu=${gpu/Graphics } - gpu=${gpu/GeForce } - gpu=${gpu/Radeon } - ;; - esac - ;; - esac - - gpu=${gpu//+( )/ } - gpu="${gpu}${count}" -} - -# }}} - -# Memory {{{ - -getmemory () { - case "$os" in - "Linux" | "Windows") - if [ ! -z "$(grep -F "MemAvail" /proc/meminfo)" ]; then - mem=($(awk -F ':| kB' '/MemTotal|MemAvail/ {printf $2}' /proc/meminfo)) - memused=$((mem[0] - mem[1])) - else - mem=($(awk -F ':| kB' '/MemTotal|MemFree|Buffers|Cached/ {printf $2}' /proc/meminfo) 0 0) - memused=$((mem[0] - mem[1] - mem[2] - mem[3])) - fi - - memused=$((memused / 1024)) - memtotal=$((mem[0] / 1024)) - ;; - - "Mac OS X" | "iPhone OS") - memtotal=$(printf "%s\n" "$(sysctl -n hw.memsize)"/1024^2 | bc) - memwired=$(vm_stat | awk '/wired/ { print $4 }') - memactive=$(vm_stat | awk '/active / { printf $3 }') - memcompressed=$(vm_stat | awk '/occupied/ { printf $5 }') - memused=$(((${memwired//.} + ${memactive//.} + ${memcompressed//.}) * 4 / 1024)) - ;; - - "OpenBSD" | "BSD") - case "$distro" in - "OpenBSD"*) - mem=($(top -d 1 | awk -F ': |/| |M' '/Memory:/ {printf $4 " " $6 " " $11 "\n"}')) - memtotal=$((${mem[1]} + ${mem[2]})) - memused=$((memtotal - ${mem[0]})) - ;; - - "FreeBSD"*) - memtotal=$(dmesg | awk '/real mem/ {printf $5}') - memtotal=${memtotal/\(} - memtotal=${memtotal/MB\)} - memfree=$(top -d 1 | awk '/Mem:/ {printf $10}') - memfree=${memfree/M} - memused=$((memtotal - memfree)) - ;; - - "NetBSD"*) - memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) - memused=$(($(vmstat | awk 'END{printf $3}') / 1000)) - memtotal=$((memused + memfree)) - memused=$((memtotal - memfree)) - ;; - esac - - ;; - esac - memory="${memused}MB / ${memtotal}MB" - - # Progress bars - case "$memory_display" in - "bar") memory="$(bar "${memused}" "${memtotal}")" ;; - "infobar") memory="${memory} $(bar "${memused}" "${memtotal}")" ;; - "barinfo") memory="$(bar "${memused}" "${memtotal}") ${memory}" ;; - esac -} - -# }}} - -# Song {{{ - -getsong () { - if mpc version >/dev/null 2>&1; then - song="$(mpc current 2>/dev/null)" - state=$(mpc | awk -F '\\[|\\]' '/\[/ {printf $2}' 2>/dev/null) - - elif [ -n "$(ps x | awk '!(/awk/) && /cmus/')" ]; then - song="$(cmus-remote -Q | grep "tag artist\|title" 2>/dev/null)" - song=${song/tag artist } - song=${song/tag title/-} - song=${song//[[:space:]]/ } - state=$(cmus-remote -Q | awk -F ' ' '/status/ {printf $2}' 2>/dev/null) - - elif pgrep "mocp" >/dev/null 2>&1; then - song="$(mocp -Q "%artist - %song" 2>/dev/null)" - state="$(mocp -Q "%state" 2>/dev/null)" - - elif [ -n "$(ps x | awk '!(/awk/) && /spotify/')" ]; then - case "$os" in - "Linux") - # This command is way too long - song="$(\ - dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \ - org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' |\ - awk -F 'string "' '/string|array/ {printf "%s",$2; next}{print ""}' |\ - awk -F '"' '/artist|title/ {printf $2 " - "}' - )" - song=${song% - } - song=${song/'('*} - song=${song//'['*} - ;; - - "Mac OS X") - song="$(osascript -e 'tell application "Spotify" to artist of current track as string & " - " & name of current track as string')" - state="$(osascript -e 'tell application "Spotify" to player state as string')" - ;; - esac - - elif [ -n "$(ps x | awk '!(/awk/ || /Helper/) && /Google Play Music Desktop Player/')" ] && type -p gpmdp >/dev/null 2>&1; then - song="$(gpmdp current)" - state="$(gpmdp status)" - - elif [ -n "$(ps x | awk '!(/awk/ || /Helper/) && /iTunes/')" ]; then - song="$(osascript -e 'tell application "iTunes" to artist of current track as string & " - " name of current track as string')" - state="$(osascript -e 'tell application "iTunes" to player state as string')" - - else - song="Not Playing" - fi - - case "$state" in - "paused" | "PAUSE") - song="Paused" - ;; - - "stopped" | "STOP") - song="Stopped" - ;; - esac - - # Display Artist and Title on seperate lines. - if [ "$song_shorthand" == "on" ] && [ "$stdout_mode" != "on" ]; then - artist="${song/ -*}" - song=${song/$artist - } - - if [ "$song" != "$artist" ]; then - prin "Artist" "$artist" - prin "Song" "$song" - else - prin "$subtitle" "$song" - fi - unset song - fi -} - -# }}} - -# Resolution {{{ - -getresolution () { - case "$os" in - "Linux" | *"BSD") - if type -p xrandr >/dev/null 2>&1; then - case "$refresh_rate" in - "on") resolution=$(xrandr --nograb --current | awk 'match($0,/[0-9]{2,3}.[0-9]{2}\*/) {printf $1 " @ " substr($0,RSTART,RLENGTH) "Hz, "}') ;; - "off") resolution=$(xrandr --nograb --current | awk '/*/ {printf $1 ", "}') ;; - esac - resolution=${resolution//\*} - - elif type -p xdpyinfo >/dev/null 2>&1; then - resolution=$(xdpyinfo 2>/dev/null | awk '/dimensions:/ {printf $2}') - fi - ;; - - "Mac OS X") - if type -p screenresolution >/dev/null 2>&1; then - resolution=$(screenresolution get 2>&1 | awk '/Display/ {printf $6 "Hz, "}') - resolution=${resolution//x??@/ @ } - - else - resolution=$(system_profiler SPDisplaysDataType |\ - awk '/Resolution:/ {printf $2"x"$4" @ "$6"Hz, "}') - fi - - [[ "$refresh_rate" == "off" ]] && \ - resolution=${resolution// @ *([0-9])Hz} - ;; - - "Windows") - width=$(wmic desktopmonitor get screenwidth /value 2>/dev/null) - width=${width/ScreenWidth'='/} - width=${width//[[:space:]]} - - height=$(wmic desktopmonitor get screenheight /value 2>/dev/null) - height=${height/ScreenHeight'='/} - height=${height//[[:space:]]} - - [ ! -z "$width" ] && \ - resolution="${width}x${height}" - ;; - esac - - resolution=${resolution%,*} -} - -# }}} - -# Theme/Icons/Font {{{ - -getstyle () { - # Fix weird output when the function - # is run multiple times. - unset gtk2theme gtk3theme theme path - - case "$1" in - theme) - name="gtk-theme-name" - gsettings="gtk-theme" - gconf="gtk_theme" - xfconf="ThemeName" - kde="widgetStyle" - ;; - - icons) - name="gtk-icon-theme-name" - gsettings="icon-theme" - gconf="icon_theme" - xfconf="IconThemeName" - kde="Theme" - ;; - - font) - name="gtk-font-name" - gsettings="font-name" - gconf="font_theme" - xfconf="FontName" - kde="font" - ;; - esac - - if [ -n "$DISPLAY" ] && [ "$os" != "Mac OS X" ]; then - # Get DE if user has disabled the function. - [ -z "$de" ] && getde - - case "$de" in - "KDE"*) - kdeconfigdir - - if [ -f "${kde_config_dir}/share/config/kdeglobals" ]; then - kde_config_file="${kde_config_dir}/share/config/kdeglobals" - - theme=$(grep "^[^#]*$kde" "$kde_config_file") - theme=${theme/${kde}*=} - [ "$version" -ge 4 ] && theme=${theme^} - - gtk_shorthand="on" - return - fi - ;; - - *"Cinnamon") - if type -p gsettings >/dev/null 2>&1; then - gtk3theme=$(gsettings get org.cinnamon.desktop.interface $gsettings) - gtk3theme=${gtk3theme//"'"} - gtk2theme=${gtk3theme} - fi - ;; - - "Gnome"* | "Unity"* | "Budgie") - if type -p gsettings >/dev/null 2>&1; then - gtk3theme=$(gsettings get org.gnome.desktop.interface $gsettings) - gtk3theme=${gtk3theme//"'"} - gtk2theme=${gtk3theme} - - elif type -p gconftool-2 >/dev/null 2>&1; then - gtk2theme=$(gconftool-2 -g /desktop/gnome/interface/$gconf) - fi - ;; - - "Mate"*) - gtk3theme=$(gsettings get org.mate.interface $gsettings) - gtk2theme=${gtk3theme} - ;; - - "Xfce"*) - type -p xfconf-query >/dev/null 2>&1 && \ - gtk2theme=$(xfconf-query -c xsettings -p /Net/$xfconf) - ;; - esac - - # Check for gtk2 theme - if [ -z "$gtk2theme" ]; then - if [ -f "${GTK2_RC_FILES:-$HOME/.gtkrc-2.0}" ]; then - gtk2theme=$(grep "^[^#]*$name" "${GTK2_RC_FILES:-$HOME/.gtkrc-2.0}") - - elif [ -f "/usr/share/gtk-2.0/gtkrc" ]; then - gtk2theme=$(grep "^[^#]*$name" /usr/share/gtk-2.0/gtkrc) - - elif [ -f "/etc/gtk-2.0/gtkrc" ]; then - gtk2theme=$(grep "^[^#]*$name" /etc/gtk-2.0/gtkrc) - fi - - gtk2theme=${gtk2theme/${name}*=} - gtk2theme=${gtk2theme//\"} - fi - - # Check for gtk3 theme - if [ -z "$gtk3theme" ]; then - if [ -f "$XDG_CONFIG_HOME/gtk-3.0/settings.ini" ]; then - gtk3theme=$(grep "^[^#]*$name" "$XDG_CONFIG_HOME/gtk-3.0/settings.ini") - - elif type -p gsettings >/dev/null 2>&1; then - gtk3theme="$(gsettings get org.gnome.desktop.interface $gsettings)" - gtk3theme=${gtk3theme//\'} - - elif [ -f "/usr/share/gtk-3.0/settings.ini" ]; then - gtk3theme=$(grep "^[^#]*$name" /usr/share/gtk-3.0/settings.ini) - - elif [ -f "/etc/gtk-3.0/settings.ini" ]; then - gtk3theme=$(grep "^[^#]*$name" /etc/gtk-3.0/settings.ini) - fi - - gtk3theme=${gtk3theme/${name}*=} - gtk3theme=${gtk3theme//\"} - gtk3theme=${gtk3theme/[[:space:]]/ } - fi - - # Uppercase the first letter of each gtk theme - if [ "$version" -ge 4 ]; then - gtk2theme=${gtk2theme^} - gtk3theme=${gtk3theme^} - fi - - # Toggle visibility of gtk themes. - [ "$gtk2" == "off" ] && unset gtk2theme - [ "$gtk3" == "off" ] && unset gtk3theme - - # Format the string based on which themes exist - if [ "$gtk2theme" ] && [ "$gtk2theme" == "$gtk3theme" ]; then - gtk3theme+=" [GTK2/3]" - unset gtk2theme - - elif [ "$gtk2theme" ] && [ "$gtk3theme" ]; then - gtk2theme+=" [GTK2], " - gtk3theme+=" [GTK3] " - else - [ "$gtk2theme" ] && gtk2theme+=" [GTK2] " - [ "$gtk3theme" ] && gtk3theme+=" [GTK3] " - fi - - # Final string - theme="${gtk2theme}${gtk3theme}" - theme=${theme//\"} - theme=${theme//\'} - - # Make the output shorter by removing "[GTKX]" from the string - if [ "$gtk_shorthand" == "on" ]; then - theme=${theme/ '[GTK2]'} - theme=${theme/ '[GTK3]'} - theme=${theme/ '[GTK2/3]'} - fi - fi -} - -gettheme () { - getstyle theme -} - -geticons () { - getstyle icons - icons="$theme" -} - -getfont () { - getstyle font - font="$theme" -} - -# }}} - -# Disk Usage {{{ - -getdisk () { - # df flags - case "$os" in - "Linux" | "iPhone OS" | "Windows") df_flags="-h -l --total" ;; - "Mac OS X") df_flags="-H / -l" ;; - - *"BSD") - case "$distro" in - "FreeBSD"*) df_flags="-h -c -l" ;; - *) return ;; - esac - ;; - esac - - # Get the disk info - disk=$(df $df_flags 2>/dev/null | awk 'END{print $2 ":" $3 ":" $5}') - - # Format the output - disk_used=${disk#*:} - disk_used=${disk_used%%:*} - disk_total=${disk%%:*} - disk_total_per=${disk#*:*:} - - # Put it all together - disk="${disk_used} / ${disk_total} (${disk_total_per})" - - # Add info bar - disk_used=${disk_used/G} - disk_total=${disk_total/G} - - [[ "$disk_used" == *"T" ]] && \ - disk_used=$(printf "%s\n" "${disk_used/T} * 1000" | bc) - - [[ "$disk_total" == *"T" ]] && \ - disk_total=$(printf "%s\n" "${disk_total/T} * 1000" | bc) - - case "$disk_display" in - "bar") disk="$(bar "${disk_used/'.'*}" "${disk_total/'.'*}")" ;; - "infobar") disk+=" $(bar "${disk_used/'.'*}" "${disk_total/'.'*}")" ;; - "barinfo") disk="$(bar "${disk_used/'.'*}" "${disk_total/'.'*}") $disk" ;; - "perc") disk="$disk_total_per $(bar "${disk_used/'.'*}" "${disk_total/'.'*}")" ;; - esac -} - -# }}} - -# Battery Usage {{{ - -getbattery () { - case "$os" in - "Linux") - if [ "$(ls /sys/class/power_supply/)" ]; then - # Set the index to the battery number. - case "$battery_num" in - "all") battery_num="*" index=0 ;; - *) index="$battery_num" ;; - esac - - batteries=($(cat /sys/class/power_supply/BAT${battery_num}/capacity)) - battery_state=($(cat /sys/class/power_supply/BAT${battery_num}/status)) - - # Get the subtitle and reassign it so it doesn't change. - title="$subtitle" - - # If shorthand is on, print each value on the same line - if [ "$battery_shorthand" == "on" ] || [ "$stdout_mode" == "on" ]; then - battery=${batteries[*]} - battery=${battery// /%, } - battery="${battery}%" - - else - if [ "${#batteries[@]}" -gt 1 ]; then - unset battery - - # Print each battery on a separate line. - index=0 - for bat in "${batteries[@]}"; do - case "$battery_display" in - "bar") prin "${title}${index}" "$(bar ${bat/'%'} 100)" ;; - "infobar") prin "${title}${index}" "${bat}% $(bar "${bat/'%'}" 100)" ;; - "barinfo") prin "${title}${index}" "$(bar "${bat/'%'}" 100) ${bat}%" ;; - *) prin "${title}${index}" "${bat}%" ;; - esac - index=$((index + 1)) - done - return - fi - battery="${batteries[0]}%" - fi - fi - ;; - - "BSD") - case "$distro" in - "FreeBSD"*) - battery=$(acpiconf -i 0 | awk -F ':\t' '/Remaining capacity/ {print $2}') - battery_state=$(acpiconf -i 0 | awk -F ':\t\t\t' '/State/ {print $2}') - ;; - - "NetBSD"*) - battery=$(envstat | awk '\\(|\\)' '/charge:/ {print $2}') - battery="${battery/\.*}%" - ;; - esac - ;; - - "OpenBSD") - battery0full=$(sysctl -n hw.sensors.acpibat0.watthour0) - battery0full=${battery0full/ Wh*} - - battery0now=$(sysctl -n hw.sensors.acpibat0.watthour3) - battery0now="${battery0now/ Wh*}" - - [ ! -z "$battery0full" ] && \ - battery="$(printf "%s\n" "100 * $battery0now / $battery0full" | bc)%" - ;; - - "Mac OS X") - battery="$(pmset -g batt | grep -o '[0-9]*%')" - battery_state="$(pmset -g batt | awk 'NR==2 {print $3}')" - ;; - - "Windows") - battery="$(wmic Path Win32_Battery get EstimatedChargeRemaining /value)" - battery=${battery/EstimatedChargeRemaining'='} - battery=${battery//[[:space:]]/ } - battery=${battery// } - [ ! -z "$battery" ] && \ - battery+="%" - ;; - esac - - case "$battery_state" in - "charging"*) battery+=" Charging" ;; - esac - - case "$battery_display" in - "bar") battery="$(bar ${battery/'%'*} 100)" ;; - "infobar") battery="${battery} $(bar "${battery/'%'*}" 100)" ;; - "barinfo") battery="$(bar "${battery/'%'*}" 100) ${battery}" ;; - esac -} - -# }}} - -# IP Address {{{ - -getlocalip () { - case "$os" in - "Linux") - localip="$(ip route get 1 | awk '{print $NF;exit}')" - ;; - - "Mac OS X" | "iPhone OS") - localip="$(ipconfig getifaddr en0)" - [ -z "$localip" ] && localip="$(ipconfig getifaddr en1)" - ;; - - *"BSD") - localip="$(ifconfig | awk '/broadcast/ {print $2}')" - ;; - - "Windows") - localip="$(ipconfig | awk -F ': ' '/IPv4 Address/ {printf $2}')" - ;; - esac -} - -getpublicip () { - if type -p dig >/dev/null 2>&1; then - publicip="$(dig +time=1 +tries=1 +short myip.opendns.com @resolver1.opendns.com 2>/dev/null)" - fi - - if [ -z "$publicip" ] && type -p curl >/dev/null 2>&1; then - publicip="$(curl --max-time 10 -w '\n' "$public_ip_host" 2>/dev/null)" - fi - - if [ -z "$publicip" ] && type -p wget >/dev/null 2>&1; then - publicip="$(wget -T 10 -qO- "$public_ip_host" 2>/dev/null; printf "%s")" - fi -} - -# }}} - -# Logged In Users {{{ - -getusers () { - users="$(who | awk '!seen[$1]++ {printf $1 ", "}')" - users=${users%\,*} -} - -# }}} - -# Birthday {{{ - -getbirthday () { - case "$os" in - "linux" | "iPhone OS") - birthday="$(ls -alct --full-time / | awk '/lost\+found|private/ {printf $6 " " $7}')" - date_cmd="$(date -d"$birthday" "$birthday_format")" - ;; - - "Mac OS X") - birthday="$(ls -lUT /var/log/install.log | awk '{printf $6 " " $7 " " $9 " " $8}')" - - # Split the string into Date + time - time=${birthday/*???? } - birthday=${birthday/$time} - - case "${time/:*}" in - 0? | 10 | 11) time+=" AM" ;; - *) time+=" PM" ;; - esac - birthday+="$time" - birthday_shorthand="on" - ;; - - *"BSD") - case "$distro" in - "OpenBSD"*) - birthday="$(ls -alctT / | awk '/lost\+found/ {printf $6 " " $7 " " $9 " " $8}')" - birthday_shorthand="on" - ;; - - "FreeBSD"*) - birthday="$(ls -alctT /etc/hostid | awk '{printf $6 " " $7 " " $9 " " $8}')" - date_cmd="$(date -j -f "%b %d %Y" "$birthday" "$birthday_format")" - ;; - - "NetBSD"*) - birthday="$(ls -alctT /etc/defaults/rc.conf | awk '{printf $6 " " $7 " " $9 " " $8}')" - birthday_shorthand="on" - ;; - esac - ;; - - "Windows") - birthday="$(ls -alct --full-time /cygdrive/c/Windows/explorer.exe | awk '{printf $8 " " $9}')" - date_cmd="$(date -d"$birthday" "$birthday_format")" - ;; - esac - - # Strip seconds from time output - birthday=${birthday/:?? / } - - # Pretty output - [ "$birthday_shorthand" == "off" ] && \ - birthday=${date_cmd//+( )/ } - - # Toggle showing the time - [ "$birthday_time" == "off" ] && \ - birthday=${birthday/??:??*} -} - -# }}} - -# Terminal colors {{{ - -getcols () { - if [ "$color_blocks" == "on" ]; then - printf "${padding}%s" - while [ $start -le $end ]; do - case "$start" in - [0-6]) printf "\033[4${start}m%${block_width}s" ;; - 7) printf "\033[4${start}m%${block_width}s${clear}\n${padding}" ;; - *) printf "\033[48;5;${start}m%${block_width}s" ;; - esac - start=$((start + 1)) - done - - # Clear formatting - printf "%b%s" "$clear" - fi -} - -# }}} - -# }}} - - -# Images {{{ - - -# Wallpaper {{{ - -getwallpaper () { - case "$os" in - "Linux" | *"BSD") - if type -p feh >/dev/null 2>&1 && [ -f "$HOME/.fehbg" ]; then - img="$(awk -F\' '/feh/ {printf $2}' "$HOME/.fehbg")" - - elif type -p nitrogen >/dev/null 2>&1; then - img="$(awk -F'=' '/file/ {printf $2;exit;}' "$XDG_CONFIG_HOME/nitrogen/bg-saved.cfg")" - - elif type -p gsettings >/dev/null 2>&1; then - # Get DE if user has disabled the function. - [ -z "$de" ] && getde - - case "$de" in - "MATE"*) img="$(gsettings get org.mate.background picture-filename 2>/dev/null)" ;; - *) img="$(gsettings get org.gnome.desktop.background picture-uri 2>/dev/null)" ;; - esac - - # Strip quotes etc from the path. - img=${img/'file://'} - img=${img//\'} - fi - ;; - - "Mac OS X") - img="$(osascript -e 'tell application "System Events" to picture of current desktop')" - ;; - - "Windows") - case "$distro" in - "Windows XP") - img="/cygdrive/c/Documents and Settings/${USER}" - img+="/Local Settings/Application Data/Microsoft" - img+="/Wallpaper1.bmp" - ;; - - "Windows"*) - img="$APPDATA/Microsoft/Windows/Themes" - img+="/TranscodedWallpaper.jpg" - ;; - esac - ;; - esac - - # If img is an xml file don't use it. - [ "${img/*\./}" == "xml" ] && img="" - - # Error msg - [ -z "$img" ] && err "Wallpaper detection failed, falling back to ascii mode." -} - -# }}} - -# Ascii {{{ - -getascii () { - if [ ! -f "$ascii" ] || [ "$ascii" == "distro" ]; then - # Error message - [ "$ascii" != "distro" ] && \ - [ ! -f "$ascii" ] && err "Ascii file not found, using distro ascii" - - # Lowercase the distro name - if [ "$version" -le 3 ]; then - ascii=$(tr '[:upper:]' '[:lower:]' <<< "$ascii_distro") - else - ascii=${ascii_distro,,} - fi - - [ "$ascii_logo_size" == "small" ] && \ - ascii="${ascii/ *}_small" - - if [ -f "/usr/share/neofetch/ascii/distro/${ascii/ *}" ]; then - ascii="/usr/share/neofetch/ascii/distro/${ascii/ *}" - - elif [ -f "/usr/local/share/neofetch/ascii/distro/${ascii/ *}" ]; then - ascii="/usr/local/share/neofetch/ascii/distro/${ascii/ *}" - - else - getscriptdir - - # If the ascii file doesn't exist fallback to text mode. - if [ ! -f "$script_dir/ascii/distro/${ascii/ *}" ]; then - padding="\033[0C" - image="off" - err "Ascii file not found, falling back to text mode." - return - fi - - ascii="$script_dir/ascii/distro/${ascii/ *}" - fi - - # We only use eval in the distro ascii files. - print="$(eval printf "$(<"$ascii")")" - else - case "${ascii_colors[0]}" in - "distro") ascii_color="$c1" ;; - *) ascii_color="\033[38;5;${ascii_colors[0]}m" ;; - esac - - print="${ascii_color}$(<"$ascii")" - fi - - # Set locale to get correct padding - export LC_ALL="$SYS_LOCALE" - - # Turn the file into a variable and strip escape codes. - ascii_strip=$(<"$ascii") - ascii_strip=${ascii_strip//\$\{??\}} - ascii_strip=${ascii_strip//\\} - - # Get length of longest line - ascii_size=($(awk 'END {print NR}length>max{max=length}END{print max}' <<< "$ascii_strip")) - lines=$((ascii_size[0] + 1)) - ascii_length=${ascii_size[1]} - - padding="\033[$((ascii_length + gap))C" - printf "%b%s" "$print" - - export LC_ALL=C -} - - -# }}} - -# Image {{{ - -getimage () { - # Fallback to ascii mode if imagemagick isn't installed. - type -p convert >/dev/null 2>&1 || image="ascii" - - # Get terminal lines - lines=$(tput lines) - - case "$image" in - "wall") getwallpaper ;; - "ascii") getascii; return ;; - *) - if [ "${image: -1}" == "/" ]; then - files=("$image"*.png "$image"*.jpg) - img="$(printf "%s" "${files[RANDOM % ${#files[@]}]}")" - else - img="$image" - fi - ;; - esac - - # Get terminal width and height - stty -echo - if [ -n "$TMUX" ]; then - printf "%b%s" "\033Ptmux;\033\033[14t\033\033[c\033\\" - else - printf "%b%s" "\033[14t\033[c" - fi - - # The ascape code above prints the output AFTER the prompt so this - # loop below reads it as input. wtf xterm - read -t 1 -d c -s -r term_size; stty echo - - # Split the string - term_size=${term_size//'['} - term_size=${term_size/';'} - term_size=${term_size/$'\E4'} - term_size=${term_size/t*} - term_height=${term_size/';'*} - term_width=${term_size/*';'} - - - # If $img isn't a file or the terminal doesn't support xterm escape sequences, - # fallback to ascii mode. - if [ ! -f "$img" ] || [ ${#term_size} -le 5 ]; then - image="ascii" - getascii - - # Error messages - [ ! -f "$img" ] && err "\$img, isn't a file, falling back to ascii mode." - [ ${#term_size} -le 5 ] && err "Your terminal doesn't support \\\033[14t, falling back to ascii mode." - - return - fi - - # Get terminal columns - columns=$(tput cols) - - # Calculate font size - font_width=$((term_width / columns)) - - # Image size is half of the terminal - case "$image_size" in - "auto") - image_size=$((columns * font_width / 2)) - term_height=$((term_height - term_height / 4)) - - [ "$term_height" -lt "$image_size" ] && \ - image_size="$term_height" - ;; - - *"%") - percent=${image_size/\%} - image_size=$((percent * term_width / 100)) - - [ "$((percent * term_height / 50))" -lt "$image_size" ] && \ - image_size=$((percent * term_height / 100)) - ;; - - *) image_size=${image_size/px} ;; - esac - - # Where to draw the image - case "$image_position" in - "left") - # Padding is half the terminal width + gap - padding="\033[$((image_size / font_width + gap + xoffset/font_width))C" - ;; - - "right") - padding="\033[0C" - xoffset=$((columns * font_width / 2 - gap)) - ;; - esac - - # Make the directory if it doesn't exist - mkdir -p "$thumbnail_dir" - - # Check to see if the image has a file extension, if it doesn't - # then add one. - case "${img##*/}" in - *"."*) imgname="$crop_mode-$crop_offset-$image_size-${img##*/}" ;; - *) imgname="$crop_mode-$crop_offset-$image_size-${img##*/}.jpg" ;; - esac - - # Check to see if the thumbnail exists before we do any cropping. - if [ ! -f "$thumbnail_dir/$imgname" ]; then - # Get image size so that we can do a better crop - size=$(identify -format "%w %h" "$img") - width=${size%% *} - height=${size##* } - - # This checks to see if height is geater than width - # so we can do a better crop of portrait images. - size=$height - [ "$height" -gt "$width" ] && size=$width - - case "$crop_mode" in - fit) - c=$(convert "$img" \ - -colorspace srgb \ - -format "%[pixel:p{0,0}]" info:) - - convert \ - "$img" \ - -trim +repage \ - -gravity south \ - -background "$c" \ - -extent "$size"x"$size" \ - -scale "$image_size"x"$image_size" \ - "$thumbnail_dir/$imgname" - ;; - - fill) - convert \ - "$img" \ - -trim +repage \ - -scale "$image_size"x"$image_size"^ \ - -extent "$image_size"x"$image_size" \ - "$thumbnail_dir/$imgname" - ;; - - *) - convert \ - "$img" \ - -gravity $crop_offset \ - -crop "$size"x"$size"+0+0 \ - -quality 95 \ - -scale "$image_size"x"$image_size" \ - "$thumbnail_dir/$imgname" - ;; - esac - fi - - # The final image - img="$thumbnail_dir/$imgname" -} - -takescrot () { - $scrot_cmd "${scrot_dir}${scrot_name}" -} - -# }}} - -# Find w3m-img {{{ - -# Find w3mimgdisplay automatically -getw3m_img_path () { - if [ -x "$w3m_img_path" ]; then - return - - elif [ -x "/usr/lib/w3m/w3mimgdisplay" ]; then - w3m_img_path="/usr/lib/w3m/w3mimgdisplay" - - elif [ -x "/usr/libexec/w3m/w3mimgdisplay" ]; then - w3m_img_path="/usr/libexec/w3m/w3mimgdisplay" - - elif [ -x "/usr/lib64/w3m/w3mimgdisplay" ]; then - w3m_img_path="/usr/lib64/w3m/w3mimgdisplay" - - elif [ -x "/usr/libexec64/w3m/w3mimgdisplay" ]; then - w3m_img_path="/usr/libexec64/w3m/w3mimgdisplay" - - else - image="ascii" - err "w3m-img wasn't found on your system, falling back to ascii mode." - fi -} - -# }}} - - -# }}} - - -# Text Formatting {{{ - - -# Info {{{ - -info () { - # $1 is the subtitle - subtitle="$1" - - # Call the function and update variable - if [ -z "$2" ]; then - "get$1" 2>/dev/null - eval output="\$${1}" - - else - "get$2" 2>/dev/null - eval output="\$${2}" - fi - - # If the output is empty, don't print anything - [ -z "$output" ] && return - - case "$1" in - title) - string="${bold}${title_color}${output}" - string="${string/@/${at_color}@${title_color}}" - length=${#output} - ;; - - underline) - string="${underline_color}${output}" - ;; - - *) - string="${bold}${subtitle_color}${subtitle}${clear}" - string+="${colon_color}: ${info_color}${output}" - length=$((${#subtitle} + ${#output} + 2)) - ;; - esac - - # If there's no subtitle don't print one - [ -z "$2" ] && string=${string/*: } - - # Print the string - printf "%b%s\n" "${padding}${string}${clear}" -} - -# }}} - -# Prin {{{ - -prin () { - if [ -z "$2" ]; then - string="${info_color}${1}" - length=${#1} - - else - string="${bold}${subtitle_color}${1}${clear}" - string+="${colon_color}: ${info_color}${2}" - length=$((${#subtitle} + ${#2} + 1)) - fi - - # Print the info - printf "%b%s\n" "${padding}${string}${clear}" -} - -# }}} - -# Stdout {{{ - -stdout () { - # Read args early for the separator - stdout_separator_flag="$(awk -F '--stdout_separator ' '{printf $2}' <<< "${args[@]}")" - stdout_separator_flag=${stdout_separator_flag/ '--'*} - - [ ! -z "$stdout_separator_flag" ] && \ - stdout_separator="$stdout_separator_flag" - - for func in "${args[@]}"; do - case "$func" in - "--"*) break ;; - *) - "get$func" 2>/dev/null - eval output="\$$func" - stdout+="${output}${stdout_separator}" - ;; - esac - done - - printf "%s" "${stdout%%${stdout_separator}}" - exit -} - -# }}} - -# Underline {{{ - -getunderline () { - case "$underline_enabled" in - "on") - underline=$(printf %"$length"s) - underline=${underline// /$underline_char} - ;; - "off") underline="" ;; - esac -} - -# }}} - -# Colors {{{ - -colors () { - # Change color of logo based on distro - case "$ascii_distro" in - "Arch"* | "Antergos"*) - setcolors 6 4 - ;; - - "CentOS"*) - setcolors 3 2 4 5 7 - ;; - - "CRUX"* | "Chakra"* | "gNewSense"* | "SailfishOS"* | "Alpine"* | "Ubuntu-GNOME"* | "Qubes"*) - setcolors 4 5 7 - ;; - - "Chrom"*) - setcolors 2 1 3 4 7 - ascii_distro="chrome" - ;; - - "Debian"* | "FreeBSD"* | "Elementary"* | "CrunchBang"* | "Ubuntu"*) - setcolors 7 1 3 - ;; - - "Red"*) - setcolors 7 1 3 - ascii_distro="redhat" - ;; - - "Kogaion"*) - setcolors 4 7 - ;; - - "Fedora"* | "Sabayon"* | "Frugalware"* | "Exherbo"*) - setcolors 7 4 1 - ;; - - "Gentoo"* | "Funtoo"* | "SteamOS"*) - setcolors 7 5 - ;; - - "KDE"*) - setcolors 2 7 - ascii_distro="kde" - ;; - - "Kali"*) - setcolors 4 8 - ;; - - *"OS X"* | *"iOS"*) - setcolors 2 3 1 1 5 4 - ascii_distro="mac" - ;; - - "OpenMandriva"*) - setcolors 4 3 - ;; - - "Mageia"*) - setcolors 7 6 - ;; - - "Peppermint"*) - setcolors 7 1 - ;; - - *"Mint"*) - setcolors 7 2 - ascii_distro="mint" - ;; - - "LMDE"* | "Chapeau"*) - setcolors 7 2 - ;; - - "NetBSD"* | "Parabola"* | "Tails"* | "BLAG"*) - setcolors 5 7 - ;; - - "OpenBSD"*) - setcolors 3 7 6 1 8 - ;; - - "OpenSuse"* | "Manjaro"* | "Deepin"*) - setcolors 2 7 - ;; - - "PCLinuxOS"* | "Slackware"* | "KaOS"* | "Kubuntu"* | "Lubuntu"* | "Xubuntu"*) - setcolors 4 7 1 - ;; - - "Puppy"* | "Quirky Werewolf"* | "Precise Puppy"*) - setcolors 4 - ascii_distro="puppy" - ;; - - "Scientific"*) - setcolors 4 1 7 - ;; - - "Solus"*) - setcolors 7 8 - ;; - - "Trisquel"* | "NixOS"* | "Zorin"*) - setcolors 4 6 - ;; - - "Travis") - setcolors 3 1 0 7 4 - ;; - - "void"*) - setcolors 2 8 - ;; - - "Windows 8"* | "Windows 10"*) - setcolors 6 - ascii_distro="windows10" - ;; - - "Windows"*) - setcolors 1 2 4 3 - ;; - - "Raspbian"* | *) - setcolors 2 1 - ;; - esac - - # Overwrite distro colors if '$ascii_colors' doesn't - # equal 'distro'. - [ "${ascii_colors[0]}" != "distro" ] && \ - setcolors ${ascii_colors[@]} -} - -setcolors () { - c1="$(color $1)" - c2="$(color $2)" - c3="$(color $3)" - c4="$(color $4)" - c5="$(color $5)" - c6="$(color $6)" - - if [ "${colors[0]}" == "distro" ]; then - title_color="$c1" - at_color="\033[0m" - underline_color="\033[0m" - subtitle_color="$c2" - colon_color="\033[0m" - info_color="\033[0m" - - # If the second color is white use the first for the subtitle - [ "$2" == 7 ] && subtitle_color="\033[0m\033[3${1}m" - else - title_color="$(color ${colors[0]})" - at_color="$(color ${colors[1]})" - underline_color="$(color ${colors[2]})" - subtitle_color="$(color ${colors[3]})" - colon_color="$(color ${colors[4]})" - info_color="$(color ${colors[5]})" - fi - - if [ "$progress_color_elapsed" == "distro" ]; then - progress_color_elapsed="$(color fg)" - else - progress_color_elapsed="$(color $progress_color_elapsed)" - fi - - case "$progress_color_total $1" in - distro\ [736]) progress_color_total="$c2" ;; - distro\ [0-9]) progress_color_total="$c1" ;; - *) progress_color_total="$(color $progress_color_total)" ;; - esac -} - -color () { - case "$1" in - [0-7]) printf "%b%s" "\033[0m\033[3${1}m" ;; - "fg") printf "%b%s" "\033[0m" ;; - *) printf "%b%s" "\033[38;5;${1}m" ;; - esac -} - - -# }}} - -# Bold {{{ - -bold () { - case "$bold" in - "on") bold="\033[1m" ;; - "off") bold="" ;; - esac -} - -# }}} - -# Linebreak {{{ - -getlinebreak () { - linebreak=" " -} - -# }}} - -clear="\033[0m" - - -# }}} - - -# Other {{{ - - -# Get script directory {{{ - -getscriptdir () { - # Use $0 to get the script's physical path. - cd "${0%/*}" || exit - script_dir=${0##*/} - - # Iterate down a (possible) chain of symlinks. - while [ -L "$script_dir" ]; do - script_dir="$(readlink "$script_dir")" - cd "${script_dir%/*}" || exit - script_dir="${script_dir##*/}" - done - - # Final directory - script_dir="$(pwd -P)" -} - -# }}} - -# Source Config {{{ - -# Check for $config_file first -getconfig () { - # Check $config_file - if [ -f "$config_file" ]; then - source "$config_file" - return - fi - mkdir -p "$XDG_CONFIG_HOME/neofetch/" - - # Check $XDG_CONFIG_HOME/neofetch and create the - # dir/files if they don't exist. - if [ -f "$XDG_CONFIG_HOME/neofetch/config" ]; then - source "$XDG_CONFIG_HOME/neofetch/config" - - elif [ -f "/usr/share/neofetch/config" ]; then - cp "/usr/share/neofetch/config" "$XDG_CONFIG_HOME/neofetch" - source "$XDG_CONFIG_HOME/neofetch/config" - - elif [ -f "/usr/local/share/neofetch/config" ]; then - cp "/usr/local/share/neofetch/config" "$XDG_CONFIG_HOME/neofetch" - source "$XDG_CONFIG_HOME/neofetch/config" - - else - getscriptdir - - cp "$script_dir/config/config" "$XDG_CONFIG_HOME/neofetch" - source "$XDG_CONFIG_HOME/neofetch/config" - fi -} - -# Check the commandline flags early for '--config none/off' -case "$@" in - *"--config off"* | *'--config "off"'* | *"--config 'off'"* | \ - *"--config none"* | *'--config "none"'* | *"--config 'none'"* | *"--stdout"*) - config="off" - ;; -esac -[ "$config" == "on" ] && getconfig - -# }}} - -# Progress Bars {{{ - -bar() { - # Get the values - elapsed=$(($1 * progress_length / $2)) - - # Create the bar with spaces - prog=$(printf %"$elapsed"s) - total=$(printf %"$((progress_length - elapsed))"s) - - # Set the colors and swap the spaces for $progress_char - bar+="${progress_color_elapsed}${prog// /$progress_char_elapsed}" - bar+="${progress_color_total}${total// /$progress_char_total}" - - # Borders - if [ "$progress_border" == "on" ]; then - bar+="$(color fg)]" - bar="$(color fg)[$bar" - fi - - printf "%b%s\n" "${bar}${clear}" -} - -# }}} - -# Cache {{{ - -cache () { - mkdir -p "$3/neofetch" - echo "${1/*-}=\"$2\"" > "$3/neofetch/${1/*-}" -} - -# }}} - -# KDE Config directory {{{ - -kdeconfigdir () { - if [ -n "$KDE_CONFIG_DIR" ]; then - kde_config_dir="$KDE_CONFIG_DIR" - - elif type -p kde5-config >/dev/null 2>&1; then - kde_config_dir=$(kde5-config --localprefix) - - elif type -p kde4-config >/dev/null 2>&1; then - kde_config_dir=$(kde4-config --localprefix) - - elif type -p kde-config >/dev/null 2>&1; then - kde_config_dir=$(kde-config --localprefix) - fi -} - -# }}} - -err () { - err+="$(color 1)[!]$(color fg) $1 \n" -} - -# }}} - - -# Usage {{{ - - -usage () { cat << EOF - - usage: neofetch --option "value" --option "value" - - NOTE: There's also a config option for each flag below. - - Info: - --disable infoname Allows you to disable an info line from appearing - in the output. - NOTE: You can supply multiple args. eg. - 'neofetch --disable cpu gpu disk shell' - --osx_buildversion on/off Hide/Show Mac OS X build version. - --osx_codename on/off Hide/Show Mac OS X codename. - --os_arch on/off Hide/Show Windows architecture. - --speed_type type Change the type of cpu speed to display. - Possible values: current, min, max, bios, - scaling_current, scaling_min, scaling_max - NOTE: This only support Linux with cpufreq. - --cpu_shorthand type Shorten the output of CPU - Possible values: name, speed, tiny, on, off - --cpu_cores on/off Whether or not to display the number of CPU cores - --kernel_shorthand on/off Shorten the output of kernel - --uptime_shorthand on/off Shorten the output of uptime (tiny, on, off) - --refresh_rate on/off Whether to display the refresh rate of each monitor - Unsupported on Windows - --gpu_shorthand on/off Shorten the output of GPU (tiny, on, off) - --gtk_shorthand on/off Shorten output of gtk theme/icons - --gtk2 on/off Enable/Disable gtk2 theme/icons output - --gtk3 on/off Enable/Disable gtk3 theme/icons output - --shell_path on/off Enable/Disable showing \$SHELL path - --shell_version on/off Enable/Disable showing \$SHELL version - --battery_num num Which battery to display, default value is 'all' - --battery_shorthand on/off Whether or not each battery gets its own line/title - --ip_host url Url to ping for public IP - --song_shorthand on/off Print the Artist/Title on seperate lines - --birthday_shorthand on/off Shorten the output of birthday - --birthday_time on/off Enable/Disable showing the time in birthday output - --birthday_format format Format the birthday output. (Uses 'date' cmd format) - - - Text Formatting: - --colors x x x x x x Changes the text colors in this order: - title, @, underline, subtitle, colon, info - --underline on/off enable/disable the underline. - --underline_char char Character to use when underlining title - --line_wrap on/off Enable/Disable line wrapping - --bold on/off Enable/Disable bold text - --prompt_height num Set this to your prompt height to fix issues with - the text going off screen at the top - - - Color Blocks: - --color_blocks on/off Enable/Disable the color blocks - --block_width num Width of color blocks - --block_range start end Range of colors to print as blocks - - - Progress Bars: - --progress_char 'elapsed char' 'total char' - Characters to use when drawing progress bars. - --progress_border on/off Whether or not to surround the bar with '[]' - --progress_length num Length in spaces to make the progress bars. - --progress_colors num num Colors to make the progress bar. - Set in this order: elapsed, total - --cpu_display mode1 mode2 Which shorthand to use and how CPU usage should be printed - mode1 takes: name, speed, tiny, on, off - mode2 takes: info, bar, infobar, barinfo - --memory_display mode Which way should the memory progress bar be added - Takes bar, infobar, barinfo - --battery_display mode Which way should the battery progress bar be added - Takes bar, infobar, barinfo - --disk_display mode Which way should the disk progress bar be added - Takes bar, infobar, barinfo, perc - - - Image: - --image type Image source. Where and what image we display. - Possible values: wall, ascii, - /path/to/img, /path/to/dir/, off - --size 20px | --size 20% Size to make the image, takes pixels or a percentage. - --image_position left/right Where to display the image: (Left/Right) - --crop_mode mode Which crop mode to use - Takes the values: normal, fit, fill - --crop_offset value Change the crop offset for normal mode. - Possible values: northwest, north, northeast, - west, center, east, southwest, south, southeast - - --xoffset px How close the image will be to the left edge of the - window. This only works with w3m. - --yoffset px How close the image will be to the top edge of the - window. This only works with w3m. - --gap num Gap between image and text. - NOTE: --gap can take a negative value which will - move the text closer to the left side. - --clean Remove all cropped images - - - Ascii: - --ascii value Where to get the ascii from, Possible values: - distro, /path/to/ascii - --ascii_colors x x x x x x Colors to print the ascii art - --ascii_distro distro Which Distro's ascii art to print - --ascii_logo_size Size of ascii logo. - Supported distros: Arch, Gentoo, Crux, OpenBSD. - - - Stdout: - --stdout info info Launch neofetch in stdout mode which prints the info - in a plain-text format that you can use with - lemonbar etc. - --stdout_separator string String to use as a separator in stdout mode. - - - Screenshot: - --scrot /path/to/img Take a screenshot, if path is left empty the screen- - shot function will use \$scrot_dir and \$scrot_name. - --scrot_cmd cmd Screenshot program to launch - - - Other: - --config /path/to/config Specify a path to a custom config file - --config none Launch the script without a config file - --help Print this text and exit - --test Launch the script with all functions / options enabled. - This should only be used for testing purposes, ie Travis.CI. - -v Display error messages. - -vv Display a verbose log for error reporting. - -EOF -exit 1 -} - - -# }}} - - -# Args {{{ - - -while [ "$1" ]; do - case $1 in - # Info - --os_arch) os_arch="$2" ;; - --osx_buildversion) osx_buildversion="$2" ;; - --osx_codename) osx_codename="$2" ;; - --cpu_cores) cpu_cores="$2" ;; - --speed_type) speed_type="$2" ;; - --kernel_shorthand) kernel_shorthand="$2" ;; - --uptime_shorthand) uptime_shorthand="$2" ;; - --cpu_shorthand) cpu_shorthand="$2" ;; - --gpu_shorthand) gpu_shorthand="$2" ;; - --refresh_rate) refresh_rate="$2" ;; - --gtk_shorthand) gtk_shorthand="$2" ;; - --gtk2) gtk2="$2" ;; - --gtk3) gtk3="$2" ;; - --shell_path) shell_path="$2" ;; - --shell_version) shell_version="$2" ;; - --battery_num) battery_num="$2" ;; - --battery_shorthand) battery_shorthand="$2" ;; - --ip_host) public_ip_host="$2" ;; - --song_shorthand) song_shorthand="$2" ;; - --birthday_shorthand) birthday_shorthand="$2" ;; - --birthday_time) birthday_time="$2" ;; - --birthday_format) birthday_format="$2" ;; - --disable) - for func in "$@"; do - case "$func" in - "--disable") continue ;; - "--"*) return ;; - *) unset -f "get$func" ;; - esac - done - ;; - - # Text Colors - --colors) - unset colors - for arg in "$2" "$3" "$4" "$5" "$6" "$7"; do - case "$arg" in - "--"*) break ;; - *) colors+=($arg) - esac - done - colors+=(7 7 7 7 7 7) - ;; - - # Text Formatting - --underline) underline_enabled="$2" ;; - --underline_char) underline_char="$2" ;; - --line_wrap) line_wrap="$2" ;; - --bold) bold="$2" ;; - --prompt_height) prompt_height="$2" ;; - - # Color Blocks - --color_blocks) color_blocks="$2" ;; - --block_range) start=$2; end=$3 ;; - --block_width) block_width="$2" ;; - - # Progress Bars - --progress_char) - progress_char_elapsed="$2" - progress_char_total="$3" - ;; - --progress_border) progress_border="$2" ;; - --progress_length) progress_length="$2" ;; - --progress_colors) - progress_color_elapsed="$2" - progress_color_total="$3" - ;; - --cpu_display) - cpu_shorthand="$2" - cpu_display="$3" - ;; - --memory_display) memory_display="$2" ;; - --battery_display) battery_display="$2" ;; - --disk_display) disk_display="$2" ;; - - # Image - --image) - image="$2" - case "$2" in "--"* | "") image="ascii" ;; esac - ;; - - --size) image_size="$2" ;; - --image_position) image_position="$2" ;; - --crop_mode) crop_mode="$2" ;; - --crop_offset) crop_offset="$2" ;; - --xoffset) xoffset="$2" ;; - --yoffset) yoffset="$2" ;; - --gap) gap="$2" ;; - --clean) - rm -rf "$thumbnail_dir" - rm -rf "/Library/Caches/neofetch/" - exit - ;; - - # Ascii - --ascii) - image="ascii" - ascii="$2" - case "$2" in "--"* | "") ascii="distro" ;; esac - ;; - - --ascii_colors) - unset ascii_colors - for arg in "$2" "$3" "$4" "$5" "$6" "$7"; do - case "$arg" in - "--"*) break ;; - *) ascii_colors+=($arg) - esac - done - ascii_colors+=(7 7 7 7 7 7) - ;; - - --ascii_distro) - ascii_distro="$2" - case "$2" in "--"* | "") ascii_distro="$distro" ;; esac - ;; - - --ascii_logo_size) ascii_logo_size="$2" ;; - - # Screenshot - --scrot | -s) - scrot="on" - if [ "$2" ]; then - scrot_name="${2##*/}" - scrot_dir="${2/$scrot_name}" - fi - ;; - --scrot_cmd) scrot_cmd="$2" ;; - - # Stdout - --stdout) - unset info_color prin clear bar - stdout_mode="on" - config="off" - case "$2" in - "--"* | "") printf "%s\n" "--stdout requires at least one argument"; exit ;; - *) shift; args=("$@"); stdout ;; - esac - ;; - - # Other - --config) - case "$2" in - "none" | "off") config="off" ;; - *) config_file="$2"; config="on"; getconfig ;; - esac - ;; - --test) - info=(title underline distro kernel uptime packages shell resolution de wm wmtheme theme icons cpu gpu memory font disk battery song localip publicip users birthday) - - refresh_rate="on" - shell_version="on" - cpu_display="infobar" - memory_display="infobar" - disk_display="infobar" - - printinfo () { - if [ ! -z "$TRAVIS_OS_NAME" ]; then - info linebreak - info linebreak - fi - - for func in "${info[@]}"; do - info "$(tr '[:lower:]' '[:upper:]' <<< "$func")" $func - done - - info linebreak - info cols - info linebreak - printf "%b%s" "\033[$(tput lines)H" - } - ;; - - -v) verbose="on" ;; - -vv) set -x; verbose="on" ;; - --help) usage ;; - esac - - shift -done - - -# }}} - - -# Call Functions and Finish Up {{{ - - -# Restore cursor and clear screen on ctrl+c -trap 'printf "\033[?25h"; clear; exit' 2 - -# Distro detection -getdistro -[ -z "$ascii_distro" ] && ascii_distro="$distro" - -# Text formatting -colors -bold - -if [ "$image" != "off" ]; then - # If the script exits for any reason, unhide the cursor. - trap 'printf "\033[?25h"' EXIT - - # Clear the scren - clear - - # Hide the cursor - printf "\033[?25l" - - # If iterm2 is detected use iterm2 backend. - if [ -n "$ITERM_PROFILE" ]; then - image_backend="iterm2" - else - image_backend="w3m" - fi - - # Find w3mimgdisplay - [ "$image_backend" == "w3m" ] && \ - [ "$image" != "ascii" ] && \ - getw3m_img_path - - # Get the image - getimage -fi - -# Display the image if enabled -if [ "$image" != "off" ] && [ "$image" != "ascii" ]; then - case "$image_backend" in - "w3m") - printf "%b%s\n" "0;1;$xoffset;$yoffset;$image_size;$image_size;;;;;$img\n4;\n3;" |\ - $w3m_img_path 2>/dev/null || padding="\033[0C" - ;; - - "iterm2") - printf "%b%s\a\n" "\033]1337;File=width=${image_size}px;height=${image_size}px;inline=1:$(base64 < "$img")" - ;; - esac -fi - -# Disable line wrap -[ "$line_wrap" == "off" ] && printf "\033[?7l" - -# Move cursor to the top -[ "$image" != "off" ] && printf "\033[0H" - -# Print the info -printinfo - -if [ "$image" != "off" ]; then - # Get cursor position - info_height="$(stty -echo; IFS=';' read -rdR -t 1 -d c -p $'\033[6n\033[c' ROW COL; printf "%s" "${ROW#*[}"; stty echo)" - - # Set cursor position dynamically based on height of ascii/text. - [ "${lines:-0}" -lt "${info_height:-0}" ] && lines="$info_height" - - printf "%b%s" "\033[${lines}H\033[${prompt_height}A" -fi - -# Re-enable line wrap -[ "$line_wrap" == "off" ] && printf "%b%s" "\033[?7h" - -# If enabled take a screenshot -if [ "$scrot" == "on" ]; then - takescrot -fi - -# Show error messages -if [ "$verbose" == "on" ]; then - printf "$err" -fi - -# }}} From 83a2bd968c81e94ae7121d30a6f6dd86f4cb587d Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 20:21:27 +1000 Subject: [PATCH 03/30] DragonFly BSD ascii art --- ascii/distro/dragonfly | 20 ++++++++++++++++++++ neofetch | 4 ++++ 2 files changed, 24 insertions(+) create mode 100644 ascii/distro/dragonfly diff --git a/ascii/distro/dragonfly b/ascii/distro/dragonfly new file mode 100644 index 00000000..58b34fc1 --- /dev/null +++ b/ascii/distro/dragonfly @@ -0,0 +1,20 @@ +"\ + ${c1} | + ${c1} .-. + ${c3} ()${c1}I${c3}() + ${c1} \"==.__:-:__.==\" + ${c1}\"==.__/~|~\__.==\" + ${c1}\"==._( Y )_.==\" + ${c2}.-'~~\"\"~=--...,__${c1}\/|\/${c2}__,...--=~\"\"~~'-. +${c2}( ..=${c1}\\\\=${c1}/${c2}=.. ) + ${c2}\`'-. ,.-\"\`;${c1}/=\\\\${c2} ;\"-.,_ .-'\` + ${c2} \`~\"-=-~\` .-~\` ${c1}|=|${c2} \`~-. \`~-=-\"~\` + ${c2} .-~\` /${c1}|=|${c2}\ \`~-. + ${c2} .~\` / ${c1}|=|${c2} \ \`~. +${c2} .-~\` .' ${c1}|=|${c2} \\\\\`. \`~-. +${c2} (\` _,.-=\"\` ${c1} |=|${c2} \`\"=-.,_ \`) +${c2} \`~\"~\"\` ${c1} |=|${c2} \`\"~\"~\` + ${c1} /=\\\\ + ${c1} \\\=/ + ${c1} ^ +" diff --git a/neofetch b/neofetch index d9ef7afc..f71d6574 100755 --- a/neofetch +++ b/neofetch @@ -2471,6 +2471,10 @@ colors () { setcolors 7 1 3 ;; + "DragonFly"*) + setcolors 1 7 3 + ;; + "Red"*) setcolors 7 1 3 ascii_distro="redhat" From f09279db3bb4838ea31c24072c2566e5c317dfd3 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 20:26:35 +1000 Subject: [PATCH 04/30] Make DragonFly ascii art smaller --- ascii/distro/dragonfly | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ascii/distro/dragonfly b/ascii/distro/dragonfly index 58b34fc1..d3d352ac 100644 --- a/ascii/distro/dragonfly +++ b/ascii/distro/dragonfly @@ -1,20 +1,20 @@ "\ ${c1} | - ${c1} .-. + .-. ${c3} ()${c1}I${c3}() ${c1} \"==.__:-:__.==\" - ${c1}\"==.__/~|~\__.==\" - ${c1}\"==._( Y )_.==\" + \"==.__/~|~\__.==\" + \"==._( Y )_.==\" ${c2}.-'~~\"\"~=--...,__${c1}\/|\/${c2}__,...--=~\"\"~~'-. -${c2}( ..=${c1}\\\\=${c1}/${c2}=.. ) - ${c2}\`'-. ,.-\"\`;${c1}/=\\\\${c2} ;\"-.,_ .-'\` - ${c2} \`~\"-=-~\` .-~\` ${c1}|=|${c2} \`~-. \`~-=-\"~\` - ${c2} .-~\` /${c1}|=|${c2}\ \`~-. - ${c2} .~\` / ${c1}|=|${c2} \ \`~. -${c2} .-~\` .' ${c1}|=|${c2} \\\\\`. \`~-. -${c2} (\` _,.-=\"\` ${c1} |=|${c2} \`\"=-.,_ \`) -${c2} \`~\"~\"\` ${c1} |=|${c2} \`\"~\"~\` +( ..=${c1}\\\\=${c1}/${c2}=.. ) + \`'-. ,.-\"\`;${c1}/=\\\\${c2} ;\"-.,_ .-'\` + \`~\"-=-~\` .-~\` ${c1}|=|${c2} \`~-. \`~-=-\"~\` + .-~\` /${c1}|=|${c2}\ \`~-. + .~\` / ${c1}|=|${c2} \ \`~. + .-~\` .' ${c1}|=|${c2} \\\\\`. \`~-. + (\` _,.-=\"\` ${c1} |=|${c2} \`\"=-.,_ \`) + \`~\"~\"\` ${c1} |=|${c2} \`\"~\"~\` ${c1} /=\\\\ - ${c1} \\\=/ - ${c1} ^ + \\\=/ + ^ " From e67d6609d177c291e70f2997d43932dbe7b2860e Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 20:29:01 +1000 Subject: [PATCH 05/30] Turns out that BSD version number was incorrect --- neofetch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neofetch b/neofetch index f71d6574..04558a1a 100755 --- a/neofetch +++ b/neofetch @@ -507,7 +507,7 @@ getdistro () { ;; "BSD") - distro="$(uname -sr)" + distro="$(uname -s)" ;; "Windows") From db2824a8e18e9cace353585662d19cd124ba7013 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 20:31:36 +1000 Subject: [PATCH 06/30] Format CPU output on BSD --- neofetch | 2 ++ 1 file changed, 2 insertions(+) diff --git a/neofetch b/neofetch index 04558a1a..08a2abb7 100755 --- a/neofetch +++ b/neofetch @@ -1103,6 +1103,8 @@ getcpu () { # Get cpu cores cores=$(sysctl -n hw.ncpu) + + cpu="$cpu @ ${speed}GHz" ;; esac From 2b72944289385acb22d150d91c69f4abc91da9b5 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 20:34:36 +1000 Subject: [PATCH 07/30] Fix CPU speed on BSD --- neofetch | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/neofetch b/neofetch index 08a2abb7..20fe84ac 100755 --- a/neofetch +++ b/neofetch @@ -1104,10 +1104,18 @@ getcpu () { # Get cpu cores cores=$(sysctl -n hw.ncpu) + # Fix for speeds under 1ghz + if [ -z "${speed:1}" ]; then + speed="0.${speed}" + else + speed=${speed:0:1}.${speed:1} + fi + cpu="$cpu @ ${speed}GHz" ;; esac + # Remove uneeded patterns from cpu output # This is faster than sed/gsub cpu=${cpu//(tm)} From 2147ff9c05f26309c4e3f63d95bf56e93cc67686 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 20:36:46 +1000 Subject: [PATCH 08/30] Fix whitespace issues with BSD GPu suppot --- neofetch | 1 + 1 file changed, 1 insertion(+) diff --git a/neofetch b/neofetch index 20fe84ac..eaadd8c2 100755 --- a/neofetch +++ b/neofetch @@ -1329,6 +1329,7 @@ getgpu () { gpu=$(pciconf -lv 2>/dev/null | grep -B 4 "VGA" | grep "device") gpu=${gpu/device*= } gpu=${gpu//\'} + gpu=${gpu// / } ;; *) From 3489526637a96162bb5541110947655f3f964172 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Thu, 12 May 2016 20:39:00 +1000 Subject: [PATCH 09/30] Fix GPU whitespace issue --- neofetch | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/neofetch b/neofetch index eaadd8c2..995e3243 100755 --- a/neofetch +++ b/neofetch @@ -1327,9 +1327,8 @@ getgpu () { case "$distro" in "FreeBSD"*) gpu=$(pciconf -lv 2>/dev/null | grep -B 4 "VGA" | grep "device") - gpu=${gpu/device*= } + gpu=${gpu/*device*= } gpu=${gpu//\'} - gpu=${gpu// / } ;; *) From f48f5e92ab20aa341a273cdfa4955b6fe727214b Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:02:44 +1000 Subject: [PATCH 10/30] Fix CPU output on NetBSD --- neofetch | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/neofetch b/neofetch index 995e3243..4a095de3 100755 --- a/neofetch +++ b/neofetch @@ -938,6 +938,10 @@ getwmtheme () { # CPU {{{ getcpu () { + case "$distro" in + "NetBSD"*) local os="Linux" ;; + esac + case "$os" in "Linux" | "Windows") # Get cpu name From ea1ed4d2169343537ee29afb8a66a21674279056 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:06:51 +1000 Subject: [PATCH 11/30] Fix memory output on NetBSD --- neofetch | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/neofetch b/neofetch index 4a095de3..71af7d4f 100755 --- a/neofetch +++ b/neofetch @@ -938,6 +938,9 @@ getwmtheme () { # CPU {{{ getcpu () { + # NetBSD emulates the linux /proc filesystem instead of using sysctl for hw + # information so we have to use this block below which temporarily sets the + # OS to 'Linux' for the duration of this function. case "$distro" in "NetBSD"*) local os="Linux" ;; esac @@ -1382,6 +1385,13 @@ getgpu () { # Memory {{{ getmemory () { + # NetBSD emulates the linux /proc filesystem instead of using sysctl for hw + # information so we have to use this block below which temporarily sets the + # OS to 'Linux' for the duration of this function. + case "$distro" in + "NetBSD"*) local os="Linux" ;; + esac + case "$os" in "Linux" | "Windows") if [ ! -z "$(grep -F "MemAvail" /proc/meminfo)" ]; then From 454546be5e791bb481bb03553dc96e60015b6fda Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:09:56 +1000 Subject: [PATCH 12/30] Revert NetBSD memory fix --- neofetch | 7 ------- 1 file changed, 7 deletions(-) diff --git a/neofetch b/neofetch index 71af7d4f..dd58d9f6 100755 --- a/neofetch +++ b/neofetch @@ -1385,13 +1385,6 @@ getgpu () { # Memory {{{ getmemory () { - # NetBSD emulates the linux /proc filesystem instead of using sysctl for hw - # information so we have to use this block below which temporarily sets the - # OS to 'Linux' for the duration of this function. - case "$distro" in - "NetBSD"*) local os="Linux" ;; - esac - case "$os" in "Linux" | "Windows") if [ ! -z "$(grep -F "MemAvail" /proc/meminfo)" ]; then From 8aa2c0168cf3d8dca0178a02325c5324c9c14330 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:11:34 +1000 Subject: [PATCH 13/30] Disable disk function on NetBSD --- neofetch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neofetch b/neofetch index dd58d9f6..ac5e0e66 100755 --- a/neofetch +++ b/neofetch @@ -1755,7 +1755,7 @@ getdisk () { "Linux" | "iPhone OS" | "Windows") df_flags="-h -l --total" ;; "Mac OS X" | "BSD") case "$distro" in - "OpenBSD"*) return ;; + "OpenBSD"* | "NetBSD"*) return ;; "FreeBSD"* | *"OS X"* ) df_flags="-H / -l" ;; *) df_flags="-h -c -l" ;; esac From 33c3a21f37fc184ffdaef85491fc7fa0beb4c860 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:13:16 +1000 Subject: [PATCH 14/30] Fix stray percent sign on NetBSD battery --- neofetch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neofetch b/neofetch index ac5e0e66..6a9af725 100755 --- a/neofetch +++ b/neofetch @@ -1849,7 +1849,7 @@ getbattery () { "NetBSD"*) battery=$(envstat | awk '\\(|\\)' '/charge:/ {print $2}') - battery="${battery/\.*}%" + battery="${battery:+/\.*}%" ;; esac ;; From 5a87bed817142fd5125f440d5ed1c3e8ff81ab8a Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:14:02 +1000 Subject: [PATCH 15/30] NetBSD fix stray percent sign in battery output --- neofetch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neofetch b/neofetch index 6a9af725..bce32f3e 100755 --- a/neofetch +++ b/neofetch @@ -1849,7 +1849,7 @@ getbattery () { "NetBSD"*) battery=$(envstat | awk '\\(|\\)' '/charge:/ {print $2}') - battery="${battery:+/\.*}%" + battery="${battery/\.*/%}" ;; esac ;; From 11c869b50ecb30c26629e470bb3df33b8f3b5d5b Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:22:44 +1000 Subject: [PATCH 16/30] Fix blank cpu speed on DragonFlyBSD --- neofetch | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neofetch b/neofetch index bce32f3e..06ebbcd1 100755 --- a/neofetch +++ b/neofetch @@ -1105,7 +1105,8 @@ getcpu () { cpu=${cpu/ @*} # Get cpu speed - speed=$(sysctl -n hw.cpuspeed hw.clockrate 2>/dev/null) + speed=$(sysctl -n hw.cpuspeed) + [ -z "$speed" ] && speed=$(sysctl -n hw.clockrate) speed=$((speed / 100)) # Get cpu cores From 7a62379cec0a0f35bb87d2a68990f8aafc64010d Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:35:44 +1000 Subject: [PATCH 17/30] Simplify BSD memory function --- neofetch | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/neofetch b/neofetch index 06ebbcd1..5f1c4912 100755 --- a/neofetch +++ b/neofetch @@ -1409,30 +1409,9 @@ getmemory () { ;; "BSD") - case "$distro" in - "OpenBSD"*) - mem=($(top -d 1 | awk -F ': |/| |M' '/Memory:/ {printf $4 " " $6 " " $11 "\n"}')) - memtotal=$((${mem[1]} + ${mem[2]})) - memused=$((memtotal - ${mem[0]})) - ;; - - "FreeBSD"*) - memtotal=$(dmesg | awk '/real mem/ {printf $5}') - memtotal=${memtotal/\(} - memtotal=${memtotal/MB\)} - memfree=$(top -d 1 | awk '/Mem:/ {printf $10}') - memfree=${memfree/M} - memused=$((memtotal - memfree)) - ;; - - "NetBSD"*) - memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) - memused=$(($(vmstat | awk 'END{printf $3}') / 1000)) - memtotal=$((memused + memfree)) - memused=$((memtotal - memfree)) - ;; - esac - + memtotal=$(sysctl -n hw.physmem) + memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) + memused=$((memtotal - ${memfree/M})) ;; esac memory="${memused}MB / ${memtotal}MB" From b379106e357b8fd64aa9de41b4b3f6f3ce60f1ec Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:37:19 +1000 Subject: [PATCH 18/30] Forgot to divide the total memory by 1000 --- neofetch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neofetch b/neofetch index 5f1c4912..2abe24d8 100755 --- a/neofetch +++ b/neofetch @@ -1409,7 +1409,7 @@ getmemory () { ;; "BSD") - memtotal=$(sysctl -n hw.physmem) + memtotal=$(($(sysctl -n hw.physmem) / 1000)) memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) memused=$((memtotal - ${memfree/M})) ;; From 987c67fdd523fce46ef4fbd452ba24a99ee26115 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 09:57:40 +1000 Subject: [PATCH 19/30] Fix memory usage for all BSD distros we support --- neofetch | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/neofetch b/neofetch index 2abe24d8..1191a2a5 100755 --- a/neofetch +++ b/neofetch @@ -1409,7 +1409,21 @@ getmemory () { ;; "BSD") - memtotal=$(($(sysctl -n hw.physmem) / 1000)) + case "$distro" in + "OpenBSD"*) + memtotal=$(top -d 1 | awk -F ': |/| |M' '/Memory:/ {printf $4}') + ;; + + "FreeBSD"* | "DragonFly"*) + memtotal=$(dmesg | awk -F '\\(| ' '/real mem/ {printf $7}') + ;; + + "NetBSD"*) + memtotal=$(awk -F ':|kB' '/MemTotal:/ {printf $2}' /proc/meminfo) + memtotal=$((memtotal / 1024)) + ;; + esac + memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) memused=$((memtotal - ${memfree/M})) ;; From f3c4181d6dece782b55cbc7688c7f9e9fdd8163c Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:04:27 +1000 Subject: [PATCH 20/30] BSD revised memory function --- neofetch | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/neofetch b/neofetch index 1191a2a5..e5421b88 100755 --- a/neofetch +++ b/neofetch @@ -1409,23 +1409,9 @@ getmemory () { ;; "BSD") - case "$distro" in - "OpenBSD"*) - memtotal=$(top -d 1 | awk -F ': |/| |M' '/Memory:/ {printf $4}') - ;; - - "FreeBSD"* | "DragonFly"*) - memtotal=$(dmesg | awk -F '\\(| ' '/real mem/ {printf $7}') - ;; - - "NetBSD"*) - memtotal=$(awk -F ':|kB' '/MemTotal:/ {printf $2}' /proc/meminfo) - memtotal=$((memtotal / 1024)) - ;; - esac - + memtotal=$(($(sysctl -n hw.physmem) / 1024 / 1024)) memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) - memused=$((memtotal - ${memfree/M})) + memused=$((memtotal - memfree)) ;; esac memory="${memused}MB / ${memtotal}MB" From 33bb8ff4d37722a14fa40444dd2d875c51b55dac Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:15:59 +1000 Subject: [PATCH 21/30] We grabbed the wrong field --- neofetch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neofetch b/neofetch index e5421b88..f4262e10 100755 --- a/neofetch +++ b/neofetch @@ -1410,7 +1410,7 @@ getmemory () { "BSD") memtotal=$(($(sysctl -n hw.physmem) / 1024 / 1024)) - memfree=$(($(vmstat | awk 'END{printf $4}') / 1000)) + memfree=$(($(vmstat | awk 'END{printf $5}') / 1024)) memused=$((memtotal - memfree)) ;; esac From 239cede2215098c5a176fb6d24edbdb32d994361 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:18:49 +1000 Subject: [PATCH 22/30] Make NetBSD use the linux memory function --- neofetch | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/neofetch b/neofetch index f4262e10..8f7d5fe2 100755 --- a/neofetch +++ b/neofetch @@ -1386,6 +1386,13 @@ getgpu () { # Memory {{{ getmemory () { + # NetBSD emulates the linux /proc filesystem instead of using sysctl for hw + # information so we have to use this block below which temporarily sets the + # OS to 'Linux' for the duration of this function. + case "$distro" in + "NetBSD"*) local os="Linux" ;; + esac + case "$os" in "Linux" | "Windows") if [ ! -z "$(grep -F "MemAvail" /proc/meminfo)" ]; then From fcb128faac9144e6dbd1a1c0889648a0e87eaa9a Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:21:53 +1000 Subject: [PATCH 23/30] Check /proc/meminfo on NetBSD --- neofetch | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/neofetch b/neofetch index 8f7d5fe2..c00fa3c6 100755 --- a/neofetch +++ b/neofetch @@ -1386,13 +1386,6 @@ getgpu () { # Memory {{{ getmemory () { - # NetBSD emulates the linux /proc filesystem instead of using sysctl for hw - # information so we have to use this block below which temporarily sets the - # OS to 'Linux' for the duration of this function. - case "$distro" in - "NetBSD"*) local os="Linux" ;; - esac - case "$os" in "Linux" | "Windows") if [ ! -z "$(grep -F "MemAvail" /proc/meminfo)" ]; then @@ -1418,6 +1411,7 @@ getmemory () { "BSD") memtotal=$(($(sysctl -n hw.physmem) / 1024 / 1024)) memfree=$(($(vmstat | awk 'END{printf $5}') / 1024)) + [ "$distro" == "NetBSD" ] && memfree=$(($(awk -F ':|kB' '/MemFree:/ {printf $2}' /proc/meminfo) / 1024)) memused=$((memtotal - memfree)) ;; esac From 0a2a94c914b0a239ec4b91e55c8812df093f5610 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:23:07 +1000 Subject: [PATCH 24/30] Safer comparison --- neofetch | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/neofetch b/neofetch index c00fa3c6..f5024e8b 100755 --- a/neofetch +++ b/neofetch @@ -1409,9 +1409,12 @@ getmemory () { ;; "BSD") + case "$distro" in + "NetBSD"*) memfree=$(($(awk -F ':|kB' '/MemFree:/ {printf $2}' /proc/meminfo) / 1024)) ;; + *) memfree=$(($(vmstat | awk 'END{printf $5}') / 1024)) ;; + esac + memtotal=$(($(sysctl -n hw.physmem) / 1024 / 1024)) - memfree=$(($(vmstat | awk 'END{printf $5}') / 1024)) - [ "$distro" == "NetBSD" ] && memfree=$(($(awk -F ':|kB' '/MemFree:/ {printf $2}' /proc/meminfo) / 1024)) memused=$((memtotal - memfree)) ;; esac From c8694fa53a9255dfa6fd47fd2ace6c00760fcaf0 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:26:04 +1000 Subject: [PATCH 25/30] Fix disk usage --- neofetch | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/neofetch b/neofetch index f5024e8b..5071c9a6 100755 --- a/neofetch +++ b/neofetch @@ -1739,9 +1739,8 @@ getdisk () { "Linux" | "iPhone OS" | "Windows") df_flags="-h -l --total" ;; "Mac OS X" | "BSD") case "$distro" in - "OpenBSD"* | "NetBSD"*) return ;; "FreeBSD"* | *"OS X"* ) df_flags="-H / -l" ;; - *) df_flags="-h -c -l" ;; + *) return ;; esac ;; esac From 6c7164f3962023471aa926a4b5ee25b7a5e19ae8 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:27:23 +1000 Subject: [PATCH 26/30] suffix dragonfly with bsd --- neofetch | 1 + 1 file changed, 1 insertion(+) diff --git a/neofetch b/neofetch index 5071c9a6..8498ae2c 100755 --- a/neofetch +++ b/neofetch @@ -508,6 +508,7 @@ getdistro () { "BSD") distro="$(uname -s)" + distro=${distro/DragonFly/DragonFlyBSD} ;; "Windows") From 78cfd0a5aa5157d9312e5ddf93f0241f1be22386 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 13 May 2016 10:28:08 +1000 Subject: [PATCH 27/30] Rename dragonfly ascii art' --- ascii/distro/{dragonfly => dragonflybsd} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ascii/distro/{dragonfly => dragonflybsd} (100%) diff --git a/ascii/distro/dragonfly b/ascii/distro/dragonflybsd similarity index 100% rename from ascii/distro/dragonfly rename to ascii/distro/dragonflybsd From 77867e167168a4f797a8a571006533a6e1c73701 Mon Sep 17 00:00:00 2001 From: Dylan Date: Sat, 14 May 2016 15:19:09 +1000 Subject: [PATCH 28/30] Fix PCBSD detection --- neofetch | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/neofetch b/neofetch index 8498ae2c..271e2688 100755 --- a/neofetch +++ b/neofetch @@ -509,6 +509,9 @@ getdistro () { "BSD") distro="$(uname -s)" distro=${distro/DragonFly/DragonFlyBSD} + + # Workaround for PCBSD as uname still displays FreeBSD. + [ -f "/etc/pcdbsd-lang" ] && distro="PCBSD" ;; "Windows") @@ -2472,7 +2475,7 @@ colors () { setcolors 7 1 3 ;; - "DragonFly"*) + "DragonFly"* | "PCBSD"*) setcolors 1 7 3 ;; From 3def1d5ea680d65819f61900308b47d07867143a Mon Sep 17 00:00:00 2001 From: Dylan Date: Sat, 14 May 2016 15:24:18 +1000 Subject: [PATCH 29/30] Fix PCBSD filename --- neofetch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neofetch b/neofetch index 271e2688..5aa04ab3 100755 --- a/neofetch +++ b/neofetch @@ -511,7 +511,7 @@ getdistro () { distro=${distro/DragonFly/DragonFlyBSD} # Workaround for PCBSD as uname still displays FreeBSD. - [ -f "/etc/pcdbsd-lang" ] && distro="PCBSD" + [ -f "/etc/pcbsd-lang" ] && distro="PCBSD" ;; "Windows") From 7b8f4a1f90c568f2757b571f3cd313903f783a13 Mon Sep 17 00:00:00 2001 From: Dylan Date: Sat, 14 May 2016 15:44:05 +1000 Subject: [PATCH 30/30] PCBSD: Use FreeBSD logo --- neofetch | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/neofetch b/neofetch index 5aa04ab3..84df8811 100755 --- a/neofetch +++ b/neofetch @@ -2471,11 +2471,16 @@ colors () { ascii_distro="chrome" ;; - "Debian"* | "FreeBSD"* | "Elementary"* | "CrunchBang"* | "Ubuntu"*) + "Debian"* | "Elementary"* | "CrunchBang"* | "Ubuntu"*) setcolors 7 1 3 ;; - "DragonFly"* | "PCBSD"*) + "FreeBSD"* | "PCBSD"*) + setcolors 7 1 3 + ascii_distro="freebsd" + ;; + + "DragonFly"*) setcolors 1 7 3 ;;