mirror of https://github.com/aristocratos/bpytop
				
				
				
			Added: Support for non truecolor terminals through 24-bit to 256-color conversion
							parent
							
								
									b80217e63c
								
							
						
					
					
						commit
						50ef08ef58
					
				
							
								
								
									
										28
									
								
								README.md
								
								
								
								
							
							
						
						
									
										28
									
								
								README.md
								
								
								
								
							| 
						 | 
				
			
			@ -98,6 +98,7 @@ Upgrade psutil with `sudo pip3 install psutil --upgrade`
 | 
			
		|||
For correct display, a terminal with support for:
 | 
			
		||||
 | 
			
		||||
* 24-bit truecolor ([See list of terminals with truecolor support](https://gist.github.com/XVilka/8346728))
 | 
			
		||||
* 256-color terminals are supported through 24-bit to 256-color conversion when setting "truecolor" to False in the options or with "-lc/--low-color" argument.
 | 
			
		||||
* Wide characters (Are sometimes problematic in web-based terminals)
 | 
			
		||||
 | 
			
		||||
Also needs a UTF8 locale and a font that covers:
 | 
			
		||||
| 
						 | 
				
			
			@ -346,14 +347,17 @@ Config files stored in "$HOME/.config/bpytop" folder
 | 
			
		|||
"/etc/bpytop.conf" will be used as default seed for config file creation if it exists.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
#? Config file for bpytop v. 1.0.54
 | 
			
		||||
#? Config file for bpytop v. 1.0.57
 | 
			
		||||
 | 
			
		||||
#* Color theme, looks for a .theme file in "/usr/[local/]share/bpytop/themes" and "~/.config/bpytop/themes", "Default" for builtin default theme.
 | 
			
		||||
#* Prefix name by a plus sign (+) for a theme located in user themes folder, i.e. color_theme="+monokai"
 | 
			
		||||
color_theme="monokai"
 | 
			
		||||
color_theme="Default"
 | 
			
		||||
 | 
			
		||||
#* If the theme set background should be shown, set to False if you want terminal background transparency
 | 
			
		||||
theme_background=True
 | 
			
		||||
theme_background=False
 | 
			
		||||
 | 
			
		||||
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
 | 
			
		||||
truecolor=True
 | 
			
		||||
 | 
			
		||||
#* Manually set which boxes to show. Available values are "cpu mem net proc", seperate values with whitespace.
 | 
			
		||||
shown_boxes="cpu mem net proc"
 | 
			
		||||
| 
						 | 
				
			
			@ -424,6 +428,12 @@ swap_disk=True
 | 
			
		|||
#* If mem box should be split to also show disks info.
 | 
			
		||||
show_disks=True
 | 
			
		||||
 | 
			
		||||
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
 | 
			
		||||
only_physical=True
 | 
			
		||||
 | 
			
		||||
#* Read disks list from /etc/fstab. This also disables only_physical.
 | 
			
		||||
use_fstab=False
 | 
			
		||||
 | 
			
		||||
#* Set fixed values for network graphs, default "10M" = 10 Mibibytes, possible units "K", "M", "G", append with "bit" for bits instead of bytes, i.e "100mbit"
 | 
			
		||||
net_download="100Mbit"
 | 
			
		||||
net_upload="100Mbit"
 | 
			
		||||
| 
						 | 
				
			
			@ -437,6 +447,9 @@ net_sync=True
 | 
			
		|||
#* If the network graphs color gradient should scale to bandwith usage or auto scale, bandwith usage is based on "net_download" and "net_upload" values
 | 
			
		||||
net_color_fixed=False
 | 
			
		||||
 | 
			
		||||
#* Starts with the Network Interface specified here.
 | 
			
		||||
net_iface=""
 | 
			
		||||
 | 
			
		||||
#* Show battery stats in top right if battery is present
 | 
			
		||||
show_battery=True
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -455,14 +468,15 @@ log_level=DEBUG
 | 
			
		|||
#### Command line options:
 | 
			
		||||
 | 
			
		||||
``` text
 | 
			
		||||
usage: bpytop.py [-h] [-b BOXES] [-v] [--debug]
 | 
			
		||||
usage: bpytop.py [-h] [-b BOXES] [-lc] [-v] [--debug]
 | 
			
		||||
 | 
			
		||||
optional arguments:
 | 
			
		||||
  -h, --help            show this help message and exit
 | 
			
		||||
  -b BOXES, --boxes BOXES
 | 
			
		||||
                        Which boxes to show at start, example: -b "cpu mem net proc"
 | 
			
		||||
  -v, --version         Show version info and exit
 | 
			
		||||
  --debug               Start with loglevel set to DEBUG overriding value set in config
 | 
			
		||||
                        which boxes to show at start, example: -b "cpu mem net proc"
 | 
			
		||||
  -lc, --low-color      disable truecolor, converts 24-bit colors to 256-color
 | 
			
		||||
  -v, --version         show version info and exit
 | 
			
		||||
  --debug               start with loglevel set to DEBUG overriding value set in config
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## TODO
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										64
									
								
								bpytop.py
								
								
								
								
							
							
						
						
									
										64
									
								
								bpytop.py
								
								
								
								
							| 
						 | 
				
			
			@ -59,9 +59,10 @@ VERSION: str = "1.0.56"
 | 
			
		|||
 | 
			
		||||
#? Argument parser ------------------------------------------------------------------------------->
 | 
			
		||||
args = argparse.ArgumentParser()
 | 
			
		||||
args.add_argument("-b", "--boxes",		action="store",	dest="boxes", help ="Which boxes to show at start, example: -b \"cpu mem net proc\"")
 | 
			
		||||
args.add_argument("-v", "--version",	action="store_true" ,help ="Show version info and exit")
 | 
			
		||||
args.add_argument("--debug",			action="store_true" ,help ="Start with loglevel set to DEBUG overriding value set in config")
 | 
			
		||||
args.add_argument("-b", "--boxes",		action="store",	dest="boxes", 	help = "which boxes to show at start, example: -b \"cpu mem net proc\"")
 | 
			
		||||
args.add_argument("-lc", "--low-color", action="store_true", 			help = "disable truecolor, converts 24-bit colors to 256-color")
 | 
			
		||||
args.add_argument("-v", "--version",	action="store_true", 			help = "show version info and exit")
 | 
			
		||||
args.add_argument("--debug",			action="store_true", 			help = "start with loglevel set to DEBUG overriding value set in config")
 | 
			
		||||
stdargs = args.parse_args()
 | 
			
		||||
 | 
			
		||||
if stdargs.version:
 | 
			
		||||
| 
						 | 
				
			
			@ -70,8 +71,8 @@ if stdargs.version:
 | 
			
		|||
	raise SystemExit(0)
 | 
			
		||||
 | 
			
		||||
ARG_BOXES: str = stdargs.boxes
 | 
			
		||||
 | 
			
		||||
DEBUG = stdargs.debug
 | 
			
		||||
LOW_COLOR: bool = stdargs.low_color
 | 
			
		||||
DEBUG: bool = stdargs.debug
 | 
			
		||||
 | 
			
		||||
#? Variables ------------------------------------------------------------------------------------->
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -94,6 +95,9 @@ color_theme="$color_theme"
 | 
			
		|||
#* If the theme set background should be shown, set to False if you want terminal background transparency
 | 
			
		||||
theme_background=$theme_background
 | 
			
		||||
 | 
			
		||||
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
 | 
			
		||||
truecolor=$truecolor
 | 
			
		||||
 | 
			
		||||
#* Manually set which boxes to show. Available values are "cpu mem net proc", seperate values with whitespace.
 | 
			
		||||
shown_boxes="$shown_boxes"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -183,7 +187,7 @@ net_sync=$net_sync
 | 
			
		|||
net_color_fixed=$net_color_fixed
 | 
			
		||||
 | 
			
		||||
#* Starts with the Network Interface specified here.
 | 
			
		||||
net_iface=$net_iface
 | 
			
		||||
net_iface="$net_iface"
 | 
			
		||||
 | 
			
		||||
#* Show battery stats in top right if battery is present
 | 
			
		||||
show_battery=$show_battery
 | 
			
		||||
| 
						 | 
				
			
			@ -367,10 +371,12 @@ class Config:
 | 
			
		|||
	keys: List[str] = ["color_theme", "update_ms", "proc_sorting", "proc_reversed", "proc_tree", "check_temp", "draw_clock", "background_update", "custom_cpu_name",
 | 
			
		||||
						"proc_colors", "proc_gradient", "proc_per_core", "proc_mem_bytes", "disks_filter", "update_check", "log_level", "mem_graphs", "show_swap",
 | 
			
		||||
						"swap_disk", "show_disks", "use_fstab", "net_download", "net_upload", "net_auto", "net_color_fixed", "show_init", "theme_background",
 | 
			
		||||
						"net_sync", "show_battery", "tree_depth", "cpu_sensor", "show_coretemp", "proc_update_mult", "shown_boxes", "net_iface", "only_physical"]
 | 
			
		||||
						"net_sync", "show_battery", "tree_depth", "cpu_sensor", "show_coretemp", "proc_update_mult", "shown_boxes", "net_iface", "only_physical",
 | 
			
		||||
						"truecolor"]
 | 
			
		||||
	conf_dict: Dict[str, Union[str, int, bool]] = {}
 | 
			
		||||
	color_theme: str = "Default"
 | 
			
		||||
	theme_background: bool = True
 | 
			
		||||
	truecolor: bool = True
 | 
			
		||||
	shown_boxes: str = "cpu mem net proc"
 | 
			
		||||
	update_ms: int = 2000
 | 
			
		||||
	proc_update_mult: int = 2
 | 
			
		||||
| 
						 | 
				
			
			@ -1067,6 +1073,9 @@ class Color:
 | 
			
		|||
			self.red, self.green, self.blue = self.dec
 | 
			
		||||
			self.escape = f'\033[{38 if self.depth == "fg" else 48};2;{";".join(str(c) for c in self.dec)}m'
 | 
			
		||||
 | 
			
		||||
		if not CONFIG.truecolor or LOW_COLOR:
 | 
			
		||||
			self.escape = f'{self.truecolor_to_256(rgb=self.dec, depth=self.depth)}'
 | 
			
		||||
 | 
			
		||||
	def __str__(self) -> str:
 | 
			
		||||
		return self.escape
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1080,6 +1089,19 @@ class Color:
 | 
			
		|||
		if len(args) < 1: return ""
 | 
			
		||||
		return f'{self.escape}{"".join(args)}{getattr(Term, self.depth)}'
 | 
			
		||||
 | 
			
		||||
	@staticmethod
 | 
			
		||||
	def truecolor_to_256(rgb: Tuple[int, int, int], depth: str="fg") -> str:
 | 
			
		||||
		out: str = ""
 | 
			
		||||
		pre: str = f'\033[{"38" if depth == "fg" else "48"};5;'
 | 
			
		||||
 | 
			
		||||
		greyscale: Tuple[int, int, int] = ( rgb[0] // 11, rgb[1] // 11, rgb[2] // 11 )
 | 
			
		||||
		if greyscale[0] == greyscale[1] == greyscale[2]:
 | 
			
		||||
			out = f'{pre}{232 + greyscale[0]}m'
 | 
			
		||||
		else:
 | 
			
		||||
			out = f'{pre}{round(rgb[0] / 51) * 36 + round(rgb[1] / 51) * 6 + round(rgb[2] / 51) + 16}m'
 | 
			
		||||
 | 
			
		||||
		return out
 | 
			
		||||
 | 
			
		||||
	@staticmethod
 | 
			
		||||
	def escape_color(hexa: str = "", r: int = 0, g: int = 0, b: int = 0, depth: str = "fg") -> str:
 | 
			
		||||
		"""Returns escape sequence to set color
 | 
			
		||||
| 
						 | 
				
			
			@ -1093,13 +1115,22 @@ class Color:
 | 
			
		|||
			try:
 | 
			
		||||
				if len(hexa) == 3:
 | 
			
		||||
					c = int(hexa[1:], base=16)
 | 
			
		||||
					color = f'\033[{dint};2;{c};{c};{c}m'
 | 
			
		||||
					if CONFIG.truecolor and not LOW_COLOR:
 | 
			
		||||
						color = f'\033[{dint};2;{c};{c};{c}m'
 | 
			
		||||
					else:
 | 
			
		||||
						color = f'{Color.truecolor_to_256(rgb=(c, c, c), depth=depth)}'
 | 
			
		||||
				elif len(hexa) == 7:
 | 
			
		||||
					color = f'\033[{dint};2;{int(hexa[1:3], base=16)};{int(hexa[3:5], base=16)};{int(hexa[5:7], base=16)}m'
 | 
			
		||||
					if CONFIG.truecolor and not LOW_COLOR:
 | 
			
		||||
						color = f'\033[{dint};2;{int(hexa[1:3], base=16)};{int(hexa[3:5], base=16)};{int(hexa[5:7], base=16)}m'
 | 
			
		||||
					else:
 | 
			
		||||
						color = f'{Color.truecolor_to_256(rgb=(int(hexa[1:3], base=16), int(hexa[3:5], base=16), int(hexa[5:7], base=16)), depth=depth)}'
 | 
			
		||||
			except ValueError as e:
 | 
			
		||||
				errlog.exception(f'{e}')
 | 
			
		||||
		else:
 | 
			
		||||
			color = f'\033[{dint};2;{r};{g};{b}m'
 | 
			
		||||
			if CONFIG.truecolor and not LOW_COLOR:
 | 
			
		||||
				color = f'\033[{dint};2;{r};{g};{b}m'
 | 
			
		||||
			else:
 | 
			
		||||
				color = f'{Color.truecolor_to_256(rgb=(r, g, b), depth=depth)}'
 | 
			
		||||
		return color
 | 
			
		||||
 | 
			
		||||
	@classmethod
 | 
			
		||||
| 
						 | 
				
			
			@ -3961,6 +3992,16 @@ class Menu:
 | 
			
		|||
					'',
 | 
			
		||||
					'Set to False if you want terminal background',
 | 
			
		||||
					'transparency.'],
 | 
			
		||||
				"truecolor" : [
 | 
			
		||||
					'Sets if 24-bit truecolor should be used.',
 | 
			
		||||
					'(Requires restart to take effect!)',
 | 
			
		||||
					'',
 | 
			
		||||
					'Will convert 24-bit colors to 256 color',
 | 
			
		||||
					'(6x6x6 color cube) if False.',
 | 
			
		||||
					'',
 | 
			
		||||
					'Set to False if your terminal doesn\'t have',
 | 
			
		||||
					'truecolor support and can\'t convert to',
 | 
			
		||||
					'256-color.'],
 | 
			
		||||
				"shown_boxes" : [
 | 
			
		||||
					'Manually set which boxes to show.',
 | 
			
		||||
					'',
 | 
			
		||||
| 
						 | 
				
			
			@ -3978,7 +4019,7 @@ class Menu:
 | 
			
		|||
					'Max value: 86400000 ms = 24 hours.'],
 | 
			
		||||
				"draw_clock" : [
 | 
			
		||||
					'Draw a clock at top of screen.',
 | 
			
		||||
					'Only visible if cpu box is enabled.'
 | 
			
		||||
					'(Only visible if cpu box is enabled!)',
 | 
			
		||||
					'',
 | 
			
		||||
					'Formatting according to strftime, empty',
 | 
			
		||||
					'string to disable.',
 | 
			
		||||
| 
						 | 
				
			
			@ -4001,6 +4042,7 @@ class Menu:
 | 
			
		|||
					'too much for a comfortable experience.'],
 | 
			
		||||
				"show_battery" : [
 | 
			
		||||
					'Show battery stats.',
 | 
			
		||||
					'(Only visible if cpu box is enabled!)',
 | 
			
		||||
					'',
 | 
			
		||||
					'Show battery stats in the top right corner',
 | 
			
		||||
					'if a battery is present.'],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue