26 Commits
0.2 ... iOS

Author SHA1 Message Date
Dylan Araps
987d3b61fd pfetch: iOS support 2019-10-01 10:01:02 +03:00
Dylan Araps
c20823937c pfetch: added Android ascii 2019-10-01 09:50:08 +03:00
Dylan Araps
177f30b72f docs: update 2019-10-01 09:27:58 +03:00
Dylan Araps
aea34f832c docs: update 2019-10-01 02:01:10 +03:00
Dylan Araps
6829866ba9 docs: update 2019-10-01 02:00:36 +03:00
Dylan Araps
f7180ec8a7 docs: update 2019-10-01 01:59:01 +03:00
Dylan Araps
777a64b4b1 docs: update 2019-10-01 01:58:16 +03:00
Dylan Araps
765dc077e7 docs: update 2019-10-01 01:55:53 +03:00
Dylan Araps
2e3da189ca pfetch: smarter terminal sequence handling 2019-10-01 01:52:32 +03:00
Dylan Araps
344086b464 github: check st-256color value 2019-10-01 01:38:19 +03:00
Dylan Araps
e0b082423f github: abuse CI to test escape sequence detection 2019-10-01 01:06:07 +03:00
Dylan Araps
66e0bfe709 github: abuse CI to test escape sequence detection 2019-10-01 01:05:17 +03:00
Dylan Araps
c97120b82f docs: update 2019-10-01 00:54:16 +03:00
Dylan Araps
46b68022a3 pfetch: Simpler WSL2 detection. 2019-10-01 00:49:54 +03:00
Dylan Araps
146c6b6bae pfetch: Fix WSL2 detection. 2019-10-01 00:44:22 +03:00
Dylan Araps
d8becf6692 docs: update 2019-10-01 00:19:33 +03:00
Dylan Araps
887df06b6a pfetch: wm support for Xorg 2019-10-01 00:18:58 +03:00
Dylan Araps
a6b4b085fb docs: update 2019-10-01 00:00:27 +03:00
Dylan Araps
cfc0e8e4d0 docs: update 2019-09-30 23:55:57 +03:00
Dylan Araps
29b09c8622 pfetch: de and editor support 2019-09-30 23:53:25 +03:00
Dylan Araps
6c2ffdd07e docs: update 2019-09-30 23:38:24 +03:00
Dylan Araps
8974dad27a docs: update 2019-09-30 23:37:36 +03:00
Dylan Araps
9442360c09 docs: update 2019-09-30 23:20:07 +03:00
Dylan Araps
ee265316d9 docs: update 2019-09-30 23:19:27 +03:00
Dylan Araps
442a2ba217 docs: update 2019-09-30 23:18:56 +03:00
Dylan Araps
120e8a8760 docs: update 2019-09-30 23:16:03 +03:00
3 changed files with 233 additions and 66 deletions

View File

@@ -8,4 +8,4 @@ jobs:
- name: Run shellcheck.
run: |
shellcheck pfetch
sh pfetch
TERM=dumb sh pfetch

View File

@@ -21,7 +21,18 @@ _/\ __)/_) pkgs 130
## OS support
- Linux
- **Haiku**
- **MacOS**
- **Minix**
- **Solaris**
- **BSD**
- DragonflyBSD
- FreeBSD
- NetBSD
- OpenBSD
- **Windows**
- Windows subsystem for Linux.
- **Linux**
- Alpine Linux
- Arch Linux
- Arco Linux
@@ -47,28 +58,16 @@ _/\ __)/_) pkgs 130
- Slackware
- Ubuntu
- Void Linux
- BSD
- DragonflyBSD
- FreeBSD
- NetBSD
- OpenBSD
- MacOS
- Haiku
- Minix
- Solaris
- Other distributions are supported with a generic penguin logo.
## TODO
- [ ] Add optional and additional information detection.
- [ ] CPU
- [ ] Terminal Emulator ([#12](https://github.com/dylanaraps/pfetch/pull/12))
- The way I implement this in `neofetch` is interesting.
- [x] Terminal colors ([commit](https://github.com/dylanaraps/pfetch/commit/ba03cb3cf4dfbc767abce6acd53c07ab5568e23d))
- [ ] Window manager ([#13](https://github.com/dylanaraps/pfetch/pull/13))
- [ ] ???
- [ ] Expand operating system support.
- [x] Solaris ([#5](https://github.com/dylanaraps/pfetch/issues/5))
- [x] MINIX ([#6](https://github.com/dylanaraps/pfetch/issues/6))
- [ ] Android
- [ ] iOS
- [ ] AIX ([#7](https://github.com/dylanaraps/pfetch/issues/7))
- [ ] IRIX ([#8](https://github.com/dylanaraps/pfetch/issues/8))
- [ ] FreeMiNT ([#9](https://github.com/dylanaraps/pfetch/issues/9))
@@ -76,7 +75,6 @@ _/\ __)/_) pkgs 130
- [ ] CYGWIN
- [ ] MSYS
- [ ] MINGW
- [x] WSL (*this is fairly simple*)
## Configuration
@@ -88,7 +86,7 @@ _/\ __)/_) pkgs 130
# Default: first example below
# Valid: space separated string
#
# OFF by default: shell palette
# OFF by default: shell editor wm de palette
PF_INFO="ascii title os host kernel uptime pkgs memory"
# Example: Only ASCII.
@@ -126,6 +124,26 @@ PF_ALIGN=""
# Default: unset (auto)
# Valid: string
PF_ASCII="openbsd"
# The below environment variables control more
# than just 'pfetch' and can be passed using
# 'HOSTNAME=cool_pc pfetch' to restrict their
# usage solely to 'pfetch'.
# Which user to display.
USER=""
# Which hostname to display.
HOSTNAME=""
# Which editor to display.
EDITOR=""
# Which shell to display.
SHELL=""
# Which desktop environment to display.
XDG_CURRENT_DESKTOP=""
```
## Credit

243
pfetch
View File

@@ -156,7 +156,7 @@ get_os() {
else
# This used to be a simple '. /etc/os-release' but I believe
# this is insecure as we blindly execute whatever is in the
# this is insecure as we blindly executed whatever was in the
# file. This parser instead simply handles 'key=val', treating
# the file contents as plain-text.
while IFS='=' read -r key val; do
@@ -177,17 +177,22 @@ get_os() {
command -v guix && distro='Guix System'
# Check to see if Linux is running in Windows 10 under
# WSL (Windows subsystem for Linux) and append a string
# accordingly.
# WSL1 (Windows subsystem for Linux [version 1]) and
# append a string accordingly.
#
# If the kernel version string ends in "-Microsoft",
# we're very likely running under Windows 10 in WSL.
#
# This also acts as a means of allowing the user to
# fake this by changing their kernel version to end in
# "Microsoft".
# we're very likely running under Windows 10 in WSL1.
[ "${kernel%%*-Microsoft}" ] ||
distro="$distro on Windows 10"
distro="$distro on Windows 10 [WSL1]"
# Check to see if Linux is running in Windows 10 under
# WSL2 (Windows subsystem for Linux [version 2]) and
# append a string accordingly.
#
# This checks to see if '$WSLENV' is defined. This
# appends the Windows 10 string even if '$WSLENV' is
# empty. We only need to check that is has been _exported_.
distro="${distro}${WSLENV+ on Windows 10 [WSL2]}"
;;
Darwin*)
@@ -205,35 +210,45 @@ get_os() {
# says "populate $line with the third field's contents".
while IFS='<>' read -r _ _ line _; do
case $line in
# Match 'ProductVersion' and read the next line
# Match the key and read the next line
# directly as it contains the key's value.
ProductVersion)
IFS='<>' read -r _ _ mac_version _
#
# Define a shell variable using the key's value.
ProductName|ProductVersion)
IFS='<>' read -r _ _ "${line?}" _
break
;;
esac
done < /System/Library/CoreServices/SystemVersion.plist
# Use the ProductVersion to determine which macOS/OS X codename
# the system has. As far as I'm aware there's no "dynamic" way
# of grabbing this information.
case $mac_version in
10.4*) distro='Mac OS X Tiger' ;;
10.5*) distro='Mac OS X Leopard' ;;
10.6*) distro='Mac OS X Snow Leopard' ;;
10.7*) distro='Mac OS X Lion' ;;
10.8*) distro='OS X Mountain Lion' ;;
10.9*) distro='OS X Mavericks' ;;
10.10*) distro='OS X Yosemite' ;;
10.11*) distro='OS X El Capitan' ;;
10.12*) distro='macOS Sierra' ;;
10.13*) distro='macOS High Sierra' ;;
10.14*) distro='macOS Mojave' ;;
10.15*) distro='macOS Catalina' ;;
*) distro='macOS' ;;
esac
case ${ProductName?} in
iPhone*)
distro="iOS ${ProductVersion?}"
;;
distro="$distro $mac_version"
*)
# Use the ProductVersion to determine which macOS/OS X
# codename the system has. As far as I'm aware there's
# no "dynamic" way of grabbing this information.
case ${ProductVersion?} in
10.4*) distro='Mac OS X Tiger' ;;
10.5*) distro='Mac OS X Leopard' ;;
10.6*) distro='Mac OS X Snow Leopard' ;;
10.7*) distro='Mac OS X Lion' ;;
10.8*) distro='OS X Mountain Lion' ;;
10.9*) distro='OS X Mavericks' ;;
10.10*) distro='OS X Yosemite' ;;
10.11*) distro='OS X El Capitan' ;;
10.12*) distro='macOS Sierra' ;;
10.13*) distro='macOS High Sierra' ;;
10.14*) distro='macOS Mojave' ;;
10.15*) distro='macOS Catalina' ;;
*) distro='macOS' ;;
esac
distro="$distro ${ProductVersion?}"
;;
esac
;;
Haiku)
@@ -277,10 +292,6 @@ get_kernel() {
esac
}
get_shell() {
log shell "${SHELL##*/}" >&6
}
get_host() {
case $os in
Linux*)
@@ -444,7 +455,7 @@ get_pkgs() {
has emerge && printf '%s\n' /var/db/pkg/*/*/
has pkgtool && printf '%s\n' /var/log/packages/*
# NIX requires two commands.
# 'nix' requires two commands.
has nix-store && {
nix-store -q --requisites /run/current-system/sw
nix-store -q --requisites ~.nix-profile
@@ -644,6 +655,15 @@ get_memory() {
SunOS)
hw_pagesize=$(pagesize)
# 'kstat' outputs memory in the following format:
# unix:0:system_pages:pagestotal 1046397
# unix:0:system_pages:pagesfree 885018
#
# This simply uses the first "element" (white-space
# separated) as the key and the second element as the
# value.
#
# A variable is then assigned based on the key.
while read -r key val; do
case $key in
*total) pages_full=$val ;;
@@ -663,6 +683,115 @@ get_memory() {
log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6
}
get_wm() {
case $os in
# Don't display window manager on macOS.
Darwin*) ;;
*)
# xprop can be used to grab the window manager's properties
# which contains the window manager's name under '_NET_WM_NAME'.
#
# The upside to using 'xprop' is that you don't need to hardcode
# a list of known window manager names. The downside is that
# not all window managers conform to setting the '_NET_WM_NAME'
# atom..
#
# List of window managers which fail to set the name atom:
# catwm, fvwm, dwm, 2bwm and monster.
#
# The final downside to this approach is that it does _not_
# support Wayland environments. The only solution which supports
# Wayland is the 'ps' parsing mentioned below.
#
# A more naive implementation is to parse the last line of
# '~/.xinitrc' to extract the second white-space separated
# element.
#
# The issue with an approach like this is that this line data
# does not always equate to the name of the window manager and
# could in theory be _anything_.
#
# This also fails when the user launches xorg through a display
# manager or other means.
#
#
# Another naive solution is to parse 'ps' with a hardcoded list
# of window managers to detect the current window manager (based
# on what is running).
#
# The issue with this approach is the need to hardcode and
# maintain a list of known window managers.
#
# Another issue is that process names do not always equate to
# the name of the window manager. False-positives can happen too.
#
# This is the only solution which supports Wayland based
# environments sadly. It'd be nice if some kind of standard were
# established to identify Wayland environments.
#
# pfetch's goal is to remain _simple_, if you'd like a "full"
# implementation of window manager detection use 'neofetch'.
#
# Neofetch use a combination of 'xprop' and 'ps' parsing to
# support all window managers (including non-conforming and
# Wayland) though it's a lot more complicated!
# Don't display window manager if X isn't running.
[ "$DISPLAY" ] || return
# This is a two pass call to xprop. One call to get the window
# manager's ID and another to print its properties.
command -v xprop && {
# The output of the ID command is as follows:
# _NET_SUPPORTING_WM_CHECK: window id # 0x400000
#
# To extract the ID, everything before the last space
# is removed.
id=$(xprop -root -notype _NET_SUPPORTING_WM_CHECK)
id=${id##* }
# The output of the property command is as follows:
# _NAME 8t
# _NET_WM_PID = 252
# _NET_WM_NAME = "bspwm"
# _NET_SUPPORTING_WM_CHECK: window id # 0x400000
# WM_CLASS = "wm", "Bspwm"
#
# To extract the name, everything before '_NET_WM_NAME = \"'
# is removed and everything after the next '"' is removed.
wm=$(xprop -id "$id" -notype -len 25 -f _NET_WM_NAME 8t)
wm=${wm##*_NET_WM_NAME = \"}
wm=${wm%%\"*}
}
;;
esac
log wm "$wm" >&6
}
get_de() {
# This only supports Xorg related desktop environments though
# this is fine as knowing the desktop envrionment on Windows,
# macOS etc is useless (they'll always report the same value).
#
# Display the value of '$XDG_CURRENT_DESKTOP', if it's empty,
# display the value of '$DESKTOP_SESSION'.
log de "${XDG_CURRENT_DESKTOP:-$DESKTOP_SESSION}" >&6
}
get_shell() {
# Display the basename of the '$SHELL' environment variable.
log shell "${SHELL##*/}" >&6
}
get_editor() {
# Display the value of '$VISUAL', if it's empty, display the
# value of '$EDITOR'.
log editor "${VISUAL:-$EDITOR}" >&6
}
get_palette() {
# Print the first 8 terminal colors. This uses the existing
# sequences to change text color with a sequence prepended
@@ -726,6 +855,17 @@ get_ascii() {
EOF
;;
[Aa]ndroid*)
read_ascii 2 <<-EOF
${c2} ;, ,;
';,.-----.,;'
,' ',
/ O O \\
| |
'-----------------'
EOF
;;
[Aa]rch*)
read_ascii 4 <<-EOF
${c6} /\\
@@ -1150,12 +1290,6 @@ get_ascii() {
# Add a gap between the ascii art and the information.
ascii_width=$((ascii_width + 4))
# Minix and DragonFly don't support these!
# '[?7l': Disable line-wrapping.
# '[?25l': Hide the cursor.
[ "$os" != Minix ] && [ "$os" != DragonFly ] &&
printf '[?7l[?25l' >&6
# Print the ascii art and position the cursor back where we
# started prior to printing it.
# '[1m': Print the ascii in bold.
@@ -1165,11 +1299,6 @@ get_ascii() {
}
main() {
# Leave the terminal how we found it on exit or Ctrl+C.
# '[?7h': Enable line-wrapping.
# '[?25h': Un-hide the cursor.
trap 'printf [?7h[?25h >&6' EXIT
# Hide 'stderr' unless the first argument is '-v'. This saves
# polluting the script with '2>/dev/null'.
[ "$1" = -v ] || exec 2>/dev/null
@@ -1188,6 +1317,26 @@ main() {
c7=''; c8=''
}
# Avoid text-wrapping from wrecking the program output
# and hide the cursor to hide its moving around during
# the printing process.
#
# Some terminals don't support these sequences, nor do they
# silently conceal them if they're printed resulting in
# partial sequences being printed to the terminal!
[ "$TERM" = dumb ] ||
[ "$TERM" = minix ] ||
[ "$TERM" = cons25 ] || {
# '[?7l': Disable line-wrapping.
# '[?25l': Hide the cursor.
printf '[?7l[?25l' >&6
# Leave the terminal how we found it on exit or Ctrl+C.
# '[?7h': Enable line-wrapping.
# '[?25h': Show the cursor.
trap 'printf [?7h[?25h >&6' EXIT
}
# Store the output of 'uname' to avoid calling it multiple times
# throughout the script. 'read <<EOF' is the simplest way of reading
# a command into a list of variables.