A small point release, mainly to get some bug fixes, and a few minor issues, and

some ongoing updates to various matching rule features like CPU, Disk Vendors,
etc.

--------------------------------------------------------------------------------
SPECIAL THANKS:

1. mrmazda, for continuing to poke around and finding oddities on occasion.

2. The various packagers, for continuing to package inxi.

3. Nothing else really comes to mind, so I'm thankful that no real issues popped
up, and the ongoing attempt to stabilize and clean up the several year
aggressive development cycle of code is proceeding quite well.

--------------------------------------------------------------------------------
KNOWN ISSUES:

1. I'm currently getting no data samples from new server type CPU systems,
Nvidia Grace, Ampere, both ARM V2 based. The ARM cpu arch logic hasn't been
updated in many years since I have gotten no meaningful data, currently
Raspberry Pi 4 is the latest ARM generation I've seen data for, and no ARM
server type for many years. So support there is really not happening, and won't
be until I start getting real datasets on those server systems.

Nvidia uses Neoverse V2 ARM core, but I have no information on that yet. Also
nothing from the Amazon CPU, new Marvell datacenter type CPUs. But that's not
surprising.Also, nothing from the N1 (2019) or V1 Neoverse (2021) ARM CPU family
even though those have now been out a while.

A lot of the advanced CPU data should 'just work' because of the huge CPU
refactor done recently, but some of the more advanced data, particularly
cpu_arch type data, isn't going to be available until I get real data sets so I
can see what's going on. No idea how CPUID might work for ARM cpus, for example.

Objectively many of these datacenter/machine learning focused CPUs will never
see a system inxi will run on, though most I suspect will be running GNU/Linux
in some form, so inxi can in theory run on them, but those people all know what
their systems are doing, so the need isn't particularly pressing of course.

With this said, I did used to have more access to cutting edge server stuff, but
that has largely dried up, particularly ARM based chips.

--------------------------------------------------------------------------------
BUGS:

1. Found while resolving Fix 2, it turns out > 1 X Screens would not have shown
correctly due to failing to pass $j row counter by reference. This bug was
introduced when the big Monitor updates were done, since you almost never see
> 1 X Screens now, I never saw it until testing something for another reason.

This led to > 1 Screen showing on the same line as the last monitor of the
previous Screen.

See also Fixes 2, 3, 4, and Code 1, 2, 3.

--------------------------------------------------------------------------------
FIXES:

1. Changed Intel Saphire Rapids release data from 2021+ (what Intel had
initially announced) to 2023+ (the actual release date). Not my fault!! They
were too optimistic, inxi merely repeated their claims.

2. While trying to figure out extra Screen showing up, found a series of subtle
issues with how X Screens are handled. Added in more robust test for if Screen
ID has been added by xdpyinfo_data, and other weird corner cases that might
cause strange results in Display Screen-x.

Created check_screen() to allow for more granular and debugable testing.

This forum post helped focus attention on this issue:

https://forum.endeavouros.com/t/\
my-second-screen-is-not-working-after-installing-nvidia/33388

3. %monitors was not correctly assigned in xrandr screen fallback.

4. Set number of Screens found if no xdpyinfo or if xrandr found > xdpyinfo
number of screens.

5. Added Zhaoxin match to Centaur match, might show up on cpu string.

6. OpenBSD's package manager was listed as pkg_info, but it's slightly more
accurate to call it pkg_add. As far as I understand it, OpenBSD doesn't really
have a 'package manager' per se, it has a suite of tools to manage packages.

--------------------------------------------------------------------------------
ENHANCEMENTS:

1. Added some Zhaoxin/Centaur IDs, unlikely to show up, but you never know.

2. Added m68k to X display driver list. This was just added to kernel as a full
drm driver! Very legacy, but has users in vm, qemu, etc.

3. More disk vendors! I skipped updating this last time because, well,
collecting the data is really boring, and slightly tedious, and really serves to
simply remind that this is not the way towards a better world. Or are cheap SSDs
the true path after all? I doubt it, but you never know.

4. New AMD, Nvidia gpu ids.

5. New Intel Cpu Microarch IDs.

--------------------------------------------------------------------------------
CHANGES:

1. No changes to speak of, so I won't.

--------------------------------------------------------------------------------
DOCUMENTATION:

1. Various ongoing updates to inxi-perl/docs. These are very slowly being pulled
into a more useful form. Emphasis on slowly.

--------------------------------------------------------------------------------
CODE:

1. In Graphics::xdpyinfo_data() and Graphics::xrandr_data() got rid of extra
step, now just assign hash reference directly to push anonymous hash reference
into array. Had used intermidiate variable assignement of hash ref, but that is
pointless.

2. Added $fake{'xdpyinfo'}, hoping to get some debugger data to test weird
extra 'Screen' seen with Endeavor user (see Fix 2, 3, Bug 1).

3. Also, instead of using \%monitors, which creates a reference to the last
value of %monitors, used the correct and safer {%monitors}, which creates an
anonymous reference of the value %monitors had at that moment. This is a subtle
Perl error which is easy to make in cases where the hash or array reference is
almsot never > 1 instance, such as > 1 X Screens.

This should at least help resolve the repeated 'monitors' rows in the output
in Fixes 2, 3, 4.

4. Added 'source' to $graphics{'screens'} to log where each detected screen came
from, xdpyinfo or xrandr.
This commit is contained in:
Harald Hope 2022-12-10 16:04:04 -08:00
parent 029a331a06
commit 85f1720a93
3 changed files with 403 additions and 130 deletions

339
inxi
View file

@ -48,8 +48,8 @@ use POSIX qw(ceil uname strftime ttyname);
## INXI INFO ## ## INXI INFO ##
my $self_name='inxi'; my $self_name='inxi';
my $self_version='3.3.23'; my $self_version='3.3.24';
my $self_date='2022-10-31'; my $self_date='2022-12-10';
my $self_patch='00'; my $self_patch='00';
## END INXI INFO ## ## END INXI INFO ##
@ -514,7 +514,7 @@ sub set_os {
elsif ($cpu_arch =~ /(sparc|sun4[uv])/){ elsif ($cpu_arch =~ /(sparc|sun4[uv])/){
$risc{'sparc'} = 1; $risc{'sparc'} = 1;
$risc{'id'} = 'sparc';} $risc{'id'} = 'sparc';}
# aarch32 mips32 intel/amd handled in cpu, i386 # aarch32 mips32, i386. centaur/via/intel/amd handled in cpu
if ($cpu_arch =~ /(armv[1-7]|32|[23456]86)/){ if ($cpu_arch =~ /(armv[1-7]|32|[23456]86)/){
$bits_sys = 32; $bits_sys = 32;
} }
@ -5215,7 +5215,8 @@ sub get {
my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|elbrus|ipmi|logical|lspci|'; my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|elbrus|ipmi|logical|lspci|';
$wl .= 'partitions|pciconf|pcictl|pcidump|raid-btrfs|raid-hw|raid-lvm|'; $wl .= 'partitions|pciconf|pcictl|pcidump|raid-btrfs|raid-hw|raid-lvm|';
$wl .= 'raid-md|raid-soft|raid-zfs|sensors|sensors-sys|swaymsg|sysctl|'; $wl .= 'raid-md|raid-soft|raid-zfs|sensors|sensors-sys|swaymsg|sysctl|';
$wl .= 'uptime|usbconfig|usbdevs|vmstat|wl-info|wlr-randr|xorg-log|xrandr'; $wl .= 'uptime|usbconfig|usbdevs|vmstat|wl-info|wlr-randr|';
$wl .= 'xdpyinfo|xorg-log|xrandr';
for (split(',',$arg)){ for (split(',',$arg)){
if ($_ =~ /\b($wl)\b/){ if ($_ =~ /\b($wl)\b/){
$fake{lc($1)} = 1; $fake{lc($1)} = 1;
@ -9217,6 +9218,7 @@ sub cpuinfo_data {
next if !$block; next if !$block;
if ($b_block_1){ if ($b_block_1){
$b_block_1 = 0; $b_block_1 = 0;
# this may also kick in for centaur/via types, but no data available, guess
if (!$cpu->{'type'} && $block->{'vendor_id'}){ if (!$cpu->{'type'} && $block->{'vendor_id'}){
$cpu->{'type'} = cpu_vendor($block->{'vendor_id'}); $cpu->{'type'} = cpu_vendor($block->{'vendor_id'});
} }
@ -11079,7 +11081,7 @@ sub cp_cpu_arch {
if ($model =~ /^(1.|6.|7.|A.)$/){ if ($model =~ /^(1.|6.|7.|A.)$/){
$arch = 'Zen 4'; $arch = 'Zen 4';
$gen = '5'; $gen = '5';
$process = 'TSMC n5 (5nm)'; $process = 'TSMC n5 (5nm)'; # Epyc Bergamo 4nm, no model IDs yet
$year = '2022';} $year = '2022';}
# double check 40, 44 # double check 40, 44
elsif ($model =~ /^(4.)$/){ elsif ($model =~ /^(4.)$/){
@ -11100,7 +11102,10 @@ sub cp_cpu_arch {
$year = '2021-22';} $year = '2021-22';}
# Zen 5: TSMC n3 # Zen 5: TSMC n3
} }
## Roadmap: check to verify, AMD is usually closer to target than Intel
# Epyc 4 genoa: zen 4, nm, 2022+ (dec 2022), cxl-1.1,pcie-5, ddr-5
} }
# we have no advanced data for ARM cpus, this is an area that could be improved?
elsif ($type eq 'arm'){ elsif ($type eq 'arm'){
if ($family ne ''){ if ($family ne ''){
$arch="ARMv$family";} $arch="ARMv$family";}
@ -11128,26 +11133,44 @@ sub cp_cpu_arch {
} }
elsif ($family eq '6'){ elsif ($family eq '6'){
if ($model =~ /^(6)$/){ if ($model =~ /^(6)$/){
$arch = 'WinChip-based'; $arch = 'Via Cyrix III (WinChip 5)';
$process = '150nm'; # guess $process = '150nm'; # guess
$year = '';} $year = '';}
elsif ($model =~ /^(7|8)$/){ elsif ($model =~ /^(7|8)$/){
$arch = 'C3'; $arch = 'Via C3';
$process = '150nm'; $process = '150nm';
$year = '';} $year = '';}
elsif ($model =~ /^(9)$/){ elsif ($model =~ /^(9)$/){
$arch = 'C3-2'; $arch = 'Via C3-2';
$process = '130nm'; $process = '130nm';
$year = '';} $year = '';}
elsif ($model =~ /^(A|D)$/){ elsif ($model =~ /^(A|D)$/){
$arch = 'C7'; $arch = 'Via C7';
$process = '90nm'; $process = '90nm';
$year = '';} $year = '';}
elsif ($model =~ /^(F)$/){ elsif ($model =~ /^(F)$/){
$arch = 'Isaiah'; if ($stepping <= 1){
$arch = 'Via CN Nano (Isaah)';}
elsif ($stepping <= 2){
$arch = 'Via Nano (Isaah)';}
elsif ($stepping <= 10){
$arch = 'Via Nano (Isaah)';}
elsif ($stepping <= 12){
$arch = 'Via Isaah';}
elsif ($stepping <= 13){
$arch = 'Via Eden';}
elsif ($stepping <= 14){
$arch = 'Zhaoxin ZX';}
$process = '90nm'; # guess $process = '90nm'; # guess
$year = '';} $year = '';}
} }
elsif ($family eq '7'){
if ($model =~ /^(1.|3.)$/){
$arch = 'Zhaoxin ZX';
$process = '90nm'; # guess
$year = '';
}
}
} }
# note, to test uncoment $cpu{'type'} = Elbrus in proc/cpuinfo logic # note, to test uncoment $cpu{'type'} = Elbrus in proc/cpuinfo logic
# ExpLicit Basic Resources Utilization Scheduling # ExpLicit Basic Resources Utilization Scheduling
@ -11516,15 +11539,11 @@ sub cp_cpu_arch {
elsif ($model =~ /^(8F)$/){ elsif ($model =~ /^(8F)$/){
$arch = 'Sapphire Rapids'; $arch = 'Sapphire Rapids';
$process = 'Intel 7 (10nm ESF)'; $process = 'Intel 7 (10nm ESF)';
$year = '2021+';} # server $year = '2023+';} # server
elsif ($model =~ /^(97|9A|BE)$/){ elsif ($model =~ /^(97|9A|9C|BE)$/){
$arch = 'Alder Lake'; # socket LG 1700 $arch = 'Alder Lake'; # socket LG 1700
$process = 'Intel 7 (10nm ESF)'; $process = 'Intel 7 (10nm ESF)';
$year = '2021+';} $year = '2021+';}
elsif ($model =~ /^(9A|9C)$/){
$arch = 'Tremont Jasper Lake';
$process = 'Intel 10nm';
$year = '2021+';} # ?
elsif ($model =~ /^(9E)$/){ elsif ($model =~ /^(9E)$/){
if ($stepping == 9){ if ($stepping == 9){
$arch = 'Kaby Lake'; $arch = 'Kaby Lake';
@ -11566,10 +11585,18 @@ sub cp_cpu_arch {
elsif ($model =~ /^(B7|BA|BF)$/){ elsif ($model =~ /^(B7|BA|BF)$/){
$arch = 'Raptor Lake'; # 13 gen, socket LG 1700,1800 $arch = 'Raptor Lake'; # 13 gen, socket LG 1700,1800
$process = 'Intel 7 (10nm)'; $process = 'Intel 7 (10nm)';
$year = '2022+';} $year = '2022+';}
elsif ($model =~ /^(CF)$/){
$arch = 'Emerald Rapids'; # 5th gen xeon
$process = 'Intel 7 (10nm)';
$year = '2023+';}
## roadmaps: check and update, since Intel misses their targets often
# Sapphire Rapids: 13 gen (?), Intel 7 (10nm), 2023
# Emerald Rapids: Intel 7 (10nm), 2023 # Emerald Rapids: Intel 7 (10nm), 2023
# Granite Rapids: Intel 3 (7nm+), 2024 # Granite Rapids: Intel 3 (7nm+), 2024
# Diamond Rapids: Intel 3 (7nm+), 2025 # Diamond Rapids: Intel 3 (7nm+), 2025
# Raptor Lake: 13 gen, Intel 7 (10nm), 2022
# Meteor Lake: 14 gen, Intel 4 (7nm+)
# Arrow Lake - 15 gen, Intel 20A (2nm), 2024 # Arrow Lake - 15 gen, Intel 20A (2nm), 2024
# Lunar Lake - 16 gen, Intel 18A (1.8nm), 2025 # Lunar Lake - 16 gen, Intel 18A (1.8nm), 2025
# Nova Lake - 17 gen, Intel 18A (1.8nm), 2026 # Nova Lake - 17 gen, Intel 18A (1.8nm), 2026
@ -12029,17 +12056,17 @@ sub cpu_vendor {
my ($vendor) = (''); my ($vendor) = ('');
$string = lc($string); $string = lc($string);
if ($string =~ /intel/){ if ($string =~ /intel/){
$vendor = "intel" $vendor = "intel";
} }
elsif ($string =~ /amd/){ elsif ($string =~ /amd/){
$vendor = "amd" $vendor = "amd";
} }
# via # via/centaur/zhaoxin branding
elsif ($string =~ /centaur/){ elsif ($string =~ /centaur|zhaoxin/){
$vendor = "centaur" $vendor = "centaur";
} }
elsif ($string eq 'elbrus'){ elsif ($string eq 'elbrus'){
$vendor = "elbrus" $vendor = "elbrus";
} }
eval $end if $b_log; eval $end if $b_log;
return $vendor; return $vendor;
@ -13471,6 +13498,7 @@ sub set_disk_vendors {
['^AEGO','^AEGO','AEGO',''], ['^AEGO','^AEGO','AEGO',''],
['^AFOX','^AFOX','AFOX',''], ['^AFOX','^AFOX','AFOX',''],
['^(Agile|AGI)','^(AGI|Agile\s?Gear\s?Int[a-z]*)','AGI',''], ['^(Agile|AGI)','^(AGI|Agile\s?Gear\s?Int[a-z]*)','AGI',''],
['^Aigo','^Aigo','Aigo',''],
['^Aireye','^Aireye','Aireye',''], ['^Aireye','^Aireye','Aireye',''],
['^Alcatel','^Alcatel','Alcatel',''], ['^Alcatel','^Alcatel','Alcatel',''],
['^(Alcor(\s?Micro)?|058F)','^(Alcor(\s?Micro)?|058F)','Alcor Micro',''], ['^(Alcor(\s?Micro)?|058F)','^(Alcor(\s?Micro)?|058F)','Alcor Micro',''],
@ -13506,12 +13534,14 @@ sub set_disk_vendors {
['^Bory','^Bory','Bory',''], ['^Bory','^Bory','Bory',''],
['^Braveeagle','^Braveeagle','BraveEagle',''], ['^Braveeagle','^Braveeagle','BraveEagle',''],
['^(BUFFALO|BSC)','^BUFFALO','Buffalo',''], # usb: BSCR05TU2 ['^(BUFFALO|BSC)','^BUFFALO','Buffalo',''], # usb: BSCR05TU2
['^Bugatek','^Bugatek','Bugatek',''],
['^Bulldozer','^Bulldozer','Bulldozer',''], ['^Bulldozer','^Bulldozer','Bulldozer',''],
['^BUSlink','^BUSlink','BUSlink',''], ['^BUSlink','^BUSlink','BUSlink',''],
['^(Canon|MP49)','^Canon','Canon',''], ['^(Canon|MP49)','^Canon','Canon',''],
['^Centerm','^Centerm','Centerm',''], ['^Centerm','^Centerm','Centerm',''],
['^(Centon|DS pro)','^Centon','Centon',''], ['^(Centon|DS pro)','^Centon','Centon',''],
['^(CFD|CSSD)','^CFD','CFD',''], ['^(CFD|CSSD)','^CFD','CFD',''],
['^CHIPAL','^CHIPAL','CHIPAL',''],
['^(Chipsbank|CHIPSBNK)','^Chipsbank','Chipsbank',''], ['^(Chipsbank|CHIPSBNK)','^Chipsbank','Chipsbank',''],
['^Clover','^Clover','Clover',''], ['^Clover','^Clover','Clover',''],
['^CODi','^CODi','CODi',''], ['^CODi','^CODi','CODi',''],
@ -13536,6 +13566,7 @@ sub set_disk_vendors {
['^(DICOM|MAESTRO)','^DICOM','DICOM',''], ['^(DICOM|MAESTRO)','^DICOM','DICOM',''],
['^Digifast','^Digifast','Digifast',''], ['^Digifast','^Digifast','Digifast',''],
['^DIGITAL\s?FILM','DIGITAL\s?FILM','Digital Film',''], ['^DIGITAL\s?FILM','DIGITAL\s?FILM','Digital Film',''],
['^(Digma|Run(\sY2)?\b)','^Digma','Digma',''],
['^Dikom','^Dikom','Dikom',''], ['^Dikom','^Dikom','Dikom',''],
['^Disain','^Disain','Disain',''], ['^Disain','^Disain','Disain',''],
['^(Disney|PIX[\s]?JR)','^Disney','Disney',''], ['^(Disney|PIX[\s]?JR)','^Disney','Disney',''],
@ -13544,6 +13575,7 @@ sub set_disk_vendors {
['^DragonDiamond','^DragonDiamond','DragonDiamond',''], ['^DragonDiamond','^DragonDiamond','DragonDiamond',''],
['^(DREVO\b|X1\s\d+[GT])','^DREVO','Drevo',''], ['^(DREVO\b|X1\s\d+[GT])','^DREVO','Drevo',''],
['^DSS','^DSS DAHUA','DSS DAHUA',''], ['^DSS','^DSS DAHUA','DSS DAHUA',''],
['^(Duex|DX\b)','^Duex','Duex',''], # DX\d may be starter for sandisk string
['^(Dynabook|AE[1-3]00)','^Dynabook','Dynabook',''], ['^(Dynabook|AE[1-3]00)','^Dynabook','Dynabook',''],
# DX1100 is probably sandisk, but could be HP, or it could be hp branded sandisk # DX1100 is probably sandisk, but could be HP, or it could be hp branded sandisk
['^(Eaget|V8$)','^Eaget','Eaget',''], ['^(Eaget|V8$)','^Eaget','Eaget',''],
@ -13578,6 +13610,7 @@ sub set_disk_vendors {
['^(FOXLINE|FLD)','^FOXLINE','Foxline',''], # russian vendor? ['^(FOXLINE|FLD)','^FOXLINE','Foxline',''], # russian vendor?
['^(GALAX\b|Gamer\s?L|TA\dD|Gamer[\s-]?V)','^GALAX','GALAX',''], ['^(GALAX\b|Gamer\s?L|TA\dD|Gamer[\s-]?V)','^GALAX','GALAX',''],
['^Freecom','^Freecom(\sFreecom)?','Freecom',''], ['^Freecom','^Freecom(\sFreecom)?','Freecom',''],
['^Gaiver','^Gaiver','Gaiver',''],
['^Galaxy\b','^Galaxy','Galaxy',''], ['^Galaxy\b','^Galaxy','Galaxy',''],
['^Gamer[_\s-]?Black','^Gamer[_\s-]?Black','Gamer Black',''], ['^Gamer[_\s-]?Black','^Gamer[_\s-]?Black','Gamer Black',''],
['^(Garmin|Fenix|Nuvi|Zumo)','^Garmin','Garmin',''], ['^(Garmin|Fenix|Nuvi|Zumo)','^Garmin','Garmin',''],
@ -13602,7 +13635,6 @@ sub set_disk_vendors {
# supertalent also has FM: |FM # supertalent also has FM: |FM
['^(G[\.]?SKILL)','^G[\.]?SKILL','G.SKILL',''], ['^(G[\.]?SKILL)','^G[\.]?SKILL','G.SKILL',''],
['^G[\s-]*Tech','^G[\s-]*Tech(nology)?','G-Technology',''], ['^G[\s-]*Tech','^G[\s-]*Tech(nology)?','G-Technology',''],
['^Gaiver','^Gaiver','Gaiver',''],
['^(Hajaan|HS[1-9])','^Haajan','Haajan',''], ['^(Hajaan|HS[1-9])','^Haajan','Haajan',''],
['^Haizhide','^Haizhide','Haizhide',''], ['^Haizhide','^Haizhide','Haizhide',''],
['^(Hama|FlashPen\s?Fancy)','^Hama','Hama',''], ['^(Hama|FlashPen\s?Fancy)','^Hama','Hama',''],
@ -13648,14 +13680,17 @@ sub set_disk_vendors {
['^Jingyi','^Jingyi','Jingyi',''], ['^Jingyi','^Jingyi','Jingyi',''],
# NOTE: ITY2 120GB hard to find # NOTE: ITY2 120GB hard to find
['^JMicron','^JMicron(\s?Tech(nology)?)?','JMicron Tech',''], #JMicron H/W raid ['^JMicron','^JMicron(\s?Tech(nology)?)?','JMicron Tech',''], #JMicron H/W raid
['^JSYERA','^JSYERA','Jsyera',''],
['^(Jual|RX7)','^Jual','Jual',''], ['^(Jual|RX7)','^Jual','Jual',''],
['^Kazuk','^Kazuk','Kazuk',''], ['^Kazuk','^Kazuk','Kazuk',''],
['(\bKDI\b|^OM3P)','\bKDI\b','KDI',''], ['(\bKDI\b|^OM3P)','\bKDI\b','KDI',''],
['^KEEPDATA','^KEEPDATA','KeepData',''],
['^KLLISRE','^KLLISRE','KLLISRE',''], ['^KLLISRE','^KLLISRE','KLLISRE',''],
['^KimMIDI','^KimMIDI','KimMIDI',''], ['^KimMIDI','^KimMIDI','KimMIDI',''],
['^Kimtigo','^Kimtigo','Kimtigo',''], ['^Kimtigo','^Kimtigo','Kimtigo',''],
['^Kingbank','^Kingbank','Kingbank',''], ['^Kingbank','^Kingbank','Kingbank',''],
['^Kingchux[\s-]?ing','^Kingchux[\s-]?ing','Kingchuxing',''], ['^Kingchux[\s-]?ing','^Kingchux[\s-]?ing','Kingchuxing',''],
['^KINGCOMP','^KINGCOMP','KingComp',''],
['(KingDian|^NGF|S(280|400))','KingDian','KingDian',''], ['(KingDian|^NGF|S(280|400))','KingDian','KingDian',''],
['^(Kingfast|TYFS)','^Kingfast','Kingfast',''], ['^(Kingfast|TYFS)','^Kingfast','Kingfast',''],
['^KingMAX','^KingMAX','KingMAX',''], ['^KingMAX','^KingMAX','KingMAX',''],
@ -13667,6 +13702,7 @@ sub set_disk_vendors {
# kingwin docking, not actual drive # kingwin docking, not actual drive
['^(EZD|EZ-Dock)','','Kingwin Docking Station',''], ['^(EZD|EZ-Dock)','','Kingwin Docking Station',''],
['^Kingwin','^Kingwin','Kingwin',''], ['^Kingwin','^Kingwin','Kingwin',''],
['^KLLISRE','^KLLISRE','KLLISRE',''],
['(KIOXIA|^K[BX]G\d)','KIOXIA','KIOXIA',''], # company name comes after product ID ['(KIOXIA|^K[BX]G\d)','KIOXIA','KIOXIA',''], # company name comes after product ID
['^(KLEVV|NEO\sN|CRAS)','^KLEVV','KLEVV',''], ['^(KLEVV|NEO\sN|CRAS)','^KLEVV','KLEVV',''],
['^Kodak','^Kodak','Kodak',''], ['^Kodak','^Kodak','Kodak',''],
@ -13695,7 +13731,9 @@ sub set_disk_vendors {
['^(LSI|MegaRAID)','^LSI\b','LSI',''], ['^(LSI|MegaRAID)','^LSI\b','LSI',''],
['^(M-Systems|DiskOnKey)','^M-Systems','M-Systems',''], ['^(M-Systems|DiskOnKey)','^M-Systems','M-Systems',''],
['^(Mach\s*Xtreme|MXSSD|MXU|MX[\s-])','^Mach\s*Xtreme','Mach Xtreme',''], ['^(Mach\s*Xtreme|MXSSD|MXU|MX[\s-])','^Mach\s*Xtreme','Mach Xtreme',''],
['^(MacroVIP|MV\d)','^MacroVIP','MacroVIP',''],
['^Mainic','^Mainic','Mainic',''], ['^Mainic','^Mainic','Mainic',''],
['^Maxell','^Maxell','Maxell',''],
['^Maximus','^Maximus','Maximus',''], ['^Maximus','^Maximus','Maximus',''],
['^Maxone','^Maxone','Maxone',''], ['^Maxone','^Maxone','Maxone',''],
['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''], ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''],
@ -13763,12 +13801,15 @@ sub set_disk_vendors {
['^(-?Pretec|UltimateGuard)','-?Pretec','Pretec',''], ['^(-?Pretec|UltimateGuard)','-?Pretec','Pretec',''],
['^(Prolific)','^Prolific( Technolgy Inc\.)?','Prolific',''], ['^(Prolific)','^Prolific( Technolgy Inc\.)?','Prolific',''],
# PS3109S9 is the result of an error condition with ssd drive # PS3109S9 is the result of an error condition with ssd drive
['^PUSKILL','^PUSKILL','Puskill',''],
['QEMU','^\d*QEMU( QEMU)?','QEMU',''], # 0QUEMU QEMU HARDDISK ['QEMU','^\d*QEMU( QEMU)?','QEMU',''], # 0QUEMU QEMU HARDDISK
['(^Quantum|Fireball)','^Quantum','Quantum',''], ['(^Quantum|Fireball)','^Quantum','Quantum',''],
['^QUMO','^QUMO','Qumo',''], ['^QUMO','^QUMO','Qumo',''],
['^Qunion','^Qunion','Qunion',''],
['^(R[3-9]|AMD\s?(RADEON)?|Radeon)','AMD\s?(RADEON)?','AMD Radeon',''], # ssd ['^(R[3-9]|AMD\s?(RADEON)?|Radeon)','AMD\s?(RADEON)?','AMD Radeon',''], # ssd
['^(Ramaxel|RT|RM|RPF|RDM)','^Ramaxel','Ramaxel',''], ['^(Ramaxel|RT|RM|RPF|RDM)','^Ramaxel','Ramaxel',''],
['^(Ramsta|R[1-9])','^Ramsta','Ramsta',''], ['^(Ramsta|R[1-9])','^Ramsta','Ramsta',''],
['^RCESSD','^RCESSD','RCESSD',''],
['^(Realtek|RTL)','^Realtek','Realtek',''], ['^(Realtek|RTL)','^Realtek','Realtek',''],
['^(Reletech)','^Reletech','Reletech',''], # id: P400 but that's too short ['^(Reletech)','^Reletech','Reletech',''], # id: P400 but that's too short
['^RENICE','^RENICE','Renice',''], ['^RENICE','^RENICE','Renice',''],
@ -13833,6 +13874,7 @@ sub set_disk_vendors {
['^TEUTONS','^TEUTONS','TEUTONS',''], ['^TEUTONS','^TEUTONS','TEUTONS',''],
['^(Textorm)','^Textorm','Textorm',''], # B5 too short ['^(Textorm)','^Textorm','Textorm',''], # B5 too short
['^THU','^THU','THU',''], ['^THU','^THU','THU',''],
['^Tiger[\s_-]?Jet','^Tiger[\s_-]?Jet','TigerJet',''],
['^Tigo','^Tigo','Tigo',''], ['^Tigo','^Tigo','Tigo',''],
['^(Timetec|35TT)','^Timetec','Timetec',''], ['^(Timetec|35TT)','^Timetec','Timetec',''],
['^TKD','^TKD','TKD',''], ['^TKD','^TKD','TKD',''],
@ -13854,6 +13896,7 @@ sub set_disk_vendors {
['^(OOS[1-9]|Utania)','Utania','Utania',''], ['^(OOS[1-9]|Utania)','Utania','Utania',''],
['^U-TECH','U-TECH','U-Tech',''], ['^U-TECH','U-TECH','U-Tech',''],
['^VBOX','','VirtualBox',''], ['^VBOX','','VirtualBox',''],
['^(Veno|Scorp)','^Veno','Veno',''],
['^(Verbatim|STORE\s?\'?N\'?\s?(FLIP|GO)|Vi[1-9]|OTG\s?Tiny)','^Verbatim','Verbatim',''], ['^(Verbatim|STORE\s?\'?N\'?\s?(FLIP|GO)|Vi[1-9]|OTG\s?Tiny)','^Verbatim','Verbatim',''],
['^V-GEN','^V-GEN','V-Gen',''], ['^V-GEN','^V-GEN','V-Gen',''],
['^V[\s-]?(7|Seven)','^V[\s-]?(7|Seven)\b','VSeven',''], ['^V[\s-]?(7|Seven)','^V[\s-]?(7|Seven)\b','VSeven',''],
@ -13885,6 +13928,7 @@ sub set_disk_vendors {
['^(YingChu|YGC)','^YingChu','YingChu',''], ['^(YingChu|YGC)','^YingChu','YingChu',''],
['^(YUCUN|R880)','^YUCUN','YUCUN',''], ['^(YUCUN|R880)','^YUCUN','YUCUN',''],
['^(ZALMAN|ZM\b)','^ZALMAN','Zalman',''], ['^(ZALMAN|ZM\b)','^ZALMAN','Zalman',''],
# Zao/J.Zau: marvell ssd controller
['^ZXIC','^ZXIC','ZXIC',''], ['^ZXIC','^ZXIC','ZXIC',''],
['^(Zebronics|ZEB)','^Zebronics','Zebronics',''], ['^(Zebronics|ZEB)','^Zebronics','Zebronics',''],
['^Zenfast','^Zenfast','Zenfast',''], ['^Zenfast','^Zenfast','Zenfast',''],
@ -14614,7 +14658,7 @@ sub display_output(){
} }
else { else {
monitors_output_full('screen',$main->{'monitors'}, monitors_output_full('screen',$main->{'monitors'},
$j,$rows,\$num); \$j,$rows,\$num);
} }
} }
elsif (!$show{'graphic-basic'} && $graphics{'no-monitors'}){ elsif (!$show{'graphic-basic'} && $graphics{'no-monitors'}){
@ -14633,7 +14677,7 @@ sub display_output(){
monitors_output_basic('monitor',$monitor_ids,'',$j,$rows,\$num); monitors_output_basic('monitor',$monitor_ids,'',$j,$rows,\$num);
} }
else { else {
monitors_output_full('monitor',$monitor_ids,$j,$rows,\$num); monitors_output_full('monitor',$monitor_ids,\$j,$rows,\$num);
} }
} }
} }
@ -14683,28 +14727,28 @@ sub monitors_output_full {
my ($m1,$m2,$m3,$m4) = ($type eq 'screen') ? (3,4,5,6) : (2,3,4,5); my ($m1,$m2,$m3,$m4) = ($type eq 'screen') ? (3,4,5,6) : (2,3,4,5);
# note: in case where mapped id != sys id, the key will not match 'monitor' # note: in case where mapped id != sys id, the key will not match 'monitor'
foreach my $key (sort keys %{$monitors}){ foreach my $key (sort keys %{$monitors}){
$j++; $$j++;
$rows->[$j]{main::key($$num++,1,$m1,'Monitor')} = $monitors->{$key}{'monitor'}; $rows->[$$j]{main::key($$num++,1,$m1,'Monitor')} = $monitors->{$key}{'monitor'};
if ($monitors->{$key}{'monitor-mapped'}){ if ($monitors->{$key}{'monitor-mapped'}){
$rows->[$j]{main::key($$num++,0,$m2,'mapped')} = $monitors->{$key}{'monitor-mapped'}; $rows->[$$j]{main::key($$num++,0,$m2,'mapped')} = $monitors->{$key}{'monitor-mapped'};
} }
if ($monitors->{$key}{'disabled'}){ if ($monitors->{$key}{'disabled'}){
$rows->[$j]{main::key($$num++,0,$m2,'note')} = $monitors->{$key}{'disabled'}; $rows->[$$j]{main::key($$num++,0,$m2,'note')} = $monitors->{$key}{'disabled'};
} }
if ($monitors->{$key}{'position'}){ if ($monitors->{$key}{'position'}){
$rows->[$j]{main::key($$num++,0,$m2,'pos')} = $monitors->{$key}{'position'}; $rows->[$$j]{main::key($$num++,0,$m2,'pos')} = $monitors->{$key}{'position'};
} }
if ($monitors->{$key}{'model'}){ if ($monitors->{$key}{'model'}){
$rows->[$j]{main::key($$num++,0,$m2,'model')} = $monitors->{$key}{'model'}; $rows->[$$j]{main::key($$num++,0,$m2,'model')} = $monitors->{$key}{'model'};
} }
elsif ($monitors->{$key}{'model-id'}){ elsif ($monitors->{$key}{'model-id'}){
$rows->[$j]{main::key($$num++,0,$m2,'model-id')} = $monitors->{$key}{'model-id'}; $rows->[$$j]{main::key($$num++,0,$m2,'model-id')} = $monitors->{$key}{'model-id'};
} }
if ($extra > 2 && $monitors->{$key}{'serial'}){ if ($extra > 2 && $monitors->{$key}{'serial'}){
$rows->[$j]{main::key($$num++,0,$m2,'serial')} = main::filter($monitors->{$key}{'serial'}); $rows->[$$j]{main::key($$num++,0,$m2,'serial')} = main::filter($monitors->{$key}{'serial'});
} }
if ($b_admin && $monitors->{$key}{'build-date'}){ if ($b_admin && $monitors->{$key}{'build-date'}){
$rows->[$j]{main::key($$num++,0,$m2,'built')} = $monitors->{$key}{'build-date'}; $rows->[$$j]{main::key($$num++,0,$m2,'built')} = $monitors->{$key}{'build-date'};
} }
if ($monitors->{$key}{'res-x'} || $monitors->{$key}{'res-y'} || if ($monitors->{$key}{'res-x'} || $monitors->{$key}{'res-y'} ||
$monitors->{$key}{'hz'} || $monitors->{$key}{'size-x'} || $monitors->{$key}{'hz'} || $monitors->{$key}{'size-x'} ||
@ -14713,7 +14757,7 @@ sub monitors_output_full {
$resolution = $monitors->{$key}{'res-x'} . 'x' . $monitors->{$key}{'res-y'}; $resolution = $monitors->{$key}{'res-x'} . 'x' . $monitors->{$key}{'res-y'};
} }
$resolution ||= 'N/A'; $resolution ||= 'N/A';
$rows->[$j]{main::key($$num++,0,$m2,'res')} = $resolution; $rows->[$$j]{main::key($$num++,0,$m2,'res')} = $resolution;
} }
else { else {
if ($b_display){ if ($b_display){
@ -14723,50 +14767,50 @@ sub monitors_output_full {
$resolution = main::message('monitor-console'); $resolution = main::message('monitor-console');
} }
$b_no_size = 1; $b_no_size = 1;
$rows->[$j]{main::key($$num++,0,$m2,'size-res')} = $resolution; $rows->[$$j]{main::key($$num++,0,$m2,'size-res')} = $resolution;
} }
if ($extra > 2 && $monitors->{$key}{'hz'}){ if ($extra > 2 && $monitors->{$key}{'hz'}){
$rows->[$j]{main::key($$num++,0,$m2,'hz')} = $monitors->{$key}{'hz'}; $rows->[$$j]{main::key($$num++,0,$m2,'hz')} = $monitors->{$key}{'hz'};
} }
if ($monitors->{$key}{'dpi'}){ if ($monitors->{$key}{'dpi'}){
$rows->[$j]{main::key($$num++,0,$m2,'dpi')} = $monitors->{$key}{'dpi'}; $rows->[$$j]{main::key($$num++,0,$m2,'dpi')} = $monitors->{$key}{'dpi'};
} }
if ($b_admin && $monitors->{$key}{'gamma'}){ if ($b_admin && $monitors->{$key}{'gamma'}){
$rows->[$j]{main::key($$num++,0,$m2,'gamma')} = $monitors->{$key}{'gamma'}; $rows->[$$j]{main::key($$num++,0,$m2,'gamma')} = $monitors->{$key}{'gamma'};
} }
if ($show{'edid'} && $monitors->{$key}{'colors'}){ if ($show{'edid'} && $monitors->{$key}{'colors'}){
$rows->[$j]{main::key($$num++,1,$m2,'chroma')} = ''; $rows->[$$j]{main::key($$num++,1,$m2,'chroma')} = '';
$rows->[$j]{main::key($$num++,1,$m3,'red')} = ''; $rows->[$$j]{main::key($$num++,1,$m3,'red')} = '';
$rows->[$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'red_x'}; $rows->[$$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'red_x'};
$rows->[$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'red_y'}; $rows->[$$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'red_y'};
$rows->[$j]{main::key($$num++,1,$m3,'green')} = ''; $rows->[$$j]{main::key($$num++,1,$m3,'green')} = '';
$rows->[$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'green_x'}; $rows->[$$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'green_x'};
$rows->[$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'green_y'}; $rows->[$$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'green_y'};
$rows->[$j]{main::key($$num++,1,$m3,'blue')} = ''; $rows->[$$j]{main::key($$num++,1,$m3,'blue')} = '';
$rows->[$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'blue_x'}; $rows->[$$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'blue_x'};
$rows->[$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'blue_y'}; $rows->[$$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'blue_y'};
$rows->[$j]{main::key($$num++,1,$m3,'white')} = ''; $rows->[$$j]{main::key($$num++,1,$m3,'white')} = '';
$rows->[$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'white_x'}; $rows->[$$j]{main::key($$num++,0,$m4,'x')} = $monitors->{$key}{'colors'}{'white_x'};
$rows->[$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'white_y'}; $rows->[$$j]{main::key($$num++,0,$m4,'y')} = $monitors->{$key}{'colors'}{'white_y'};
} }
if ($extra > 2 && $monitors->{$key}{'scale'}){ if ($extra > 2 && $monitors->{$key}{'scale'}){
$rows->[$j]{main::key($$num++,0,$m2,'scale')} = $monitors->{$key}{'scale'}; $rows->[$$j]{main::key($$num++,0,$m2,'scale')} = $monitors->{$key}{'scale'};
} }
if ($extra > 2 && $monitors->{$key}{'size-x'} && $monitors->{$key}{'size-y'}){ if ($extra > 2 && $monitors->{$key}{'size-x'} && $monitors->{$key}{'size-y'}){
my $size = $monitors->{$key}{'size-x'} . 'x' . $monitors->{$key}{'size-y'} . my $size = $monitors->{$key}{'size-x'} . 'x' . $monitors->{$key}{'size-y'} .
'mm ('. $monitors->{$key}{'size-x-i'} . 'x' . $monitors->{$key}{'size-y-i'} . '")'; 'mm ('. $monitors->{$key}{'size-x-i'} . 'x' . $monitors->{$key}{'size-y-i'} . '")';
$rows->[$j]{main::key($$num++,0,$m2,'size')} = $size; $rows->[$$j]{main::key($$num++,0,$m2,'size')} = $size;
} }
if ($monitors->{$key}{'diagonal'}){ if ($monitors->{$key}{'diagonal'}){
my $diag = $monitors->{$key}{'diagonal-m'} . 'mm ('. $monitors->{$key}{'diagonal'} . '")'; my $diag = $monitors->{$key}{'diagonal-m'} . 'mm ('. $monitors->{$key}{'diagonal'} . '")';
$rows->[$j]{main::key($$num++,0,$m2,'diag')} = $diag; $rows->[$$j]{main::key($$num++,0,$m2,'diag')} = $diag;
} }
elsif ($b_display && !$b_no_size && !$monitors->{$key}{'size-x'} && elsif ($b_display && !$b_no_size && !$monitors->{$key}{'size-x'} &&
!$monitors->{$key}{'size-y'}){ !$monitors->{$key}{'size-y'}){
$rows->[$j]{main::key($$num++,0,$m2,'size')} = main::message('monitor-na');; $rows->[$$j]{main::key($$num++,0,$m2,'size')} = main::message('monitor-na');;
} }
if ($b_admin && $monitors->{$key}{'ratio'}){ if ($b_admin && $monitors->{$key}{'ratio'}){
$rows->[$j]{main::key($$num++,0,$m2,'ratio')} = $monitors->{$key}{'ratio'}; $rows->[$$j]{main::key($$num++,0,$m2,'ratio')} = $monitors->{$key}{'ratio'};
} }
if ($extra > 2){ if ($extra > 2){
if (!$monitors->{$key}{'modes'} || !@{$monitors->{$key}{'modes'}}){ if (!$monitors->{$key}{'modes'} || !@{$monitors->{$key}{'modes'}}){
@ -14774,30 +14818,30 @@ sub monitors_output_full {
} }
my $cnt = scalar @{$monitors->{$key}{'modes'}}; my $cnt = scalar @{$monitors->{$key}{'modes'}};
if ($cnt == 1 || ($cnt > 2 && $show{'edid'})){ if ($cnt == 1 || ($cnt > 2 && $show{'edid'})){
$rows->[$j]{main::key($$num++,0,$m2,'modes')} = join(', ', @{$monitors->{$key}{'modes'}}); $rows->[$$j]{main::key($$num++,0,$m2,'modes')} = join(', ', @{$monitors->{$key}{'modes'}});
} }
else { else {
$rows->[$j]{main::key($$num++,1,$m2,'modes')} = ''; $rows->[$$j]{main::key($$num++,1,$m2,'modes')} = '';
$rows->[$j]{main::key($$num++,0,$m3,'max')} = ${$monitors->{$key}{'modes'}}[0]; $rows->[$$j]{main::key($$num++,0,$m3,'max')} = ${$monitors->{$key}{'modes'}}[0];
$rows->[$j]{main::key($$num++,0,$m3,'min')} = ${$monitors->{$key}{'modes'}}[-1]; $rows->[$$j]{main::key($$num++,0,$m3,'min')} = ${$monitors->{$key}{'modes'}}[-1];
} }
} }
if ($show{'edid'}){ if ($show{'edid'}){
if ($monitors->{$key}{'edid-errors'}){ if ($monitors->{$key}{'edid-errors'}){
$j++; $$j++;
my $cnt = 1; my $cnt = 1;
$rows->[$j]{main::key($$num++,1,$m2,'EDID-Errors')} = ''; $rows->[$$j]{main::key($$num++,1,$m2,'EDID-Errors')} = '';
foreach my $err (@{$monitors->{$key}{'edid-errors'}}){ foreach my $err (@{$monitors->{$key}{'edid-errors'}}){
$rows->[$j]{main::key($$num++,0,$m3,$cnt)} = $err; $rows->[$$j]{main::key($$num++,0,$m3,$cnt)} = $err;
$cnt++; $cnt++;
} }
} }
if ($monitors->{$key}{'edid-warnings'}){ if ($monitors->{$key}{'edid-warnings'}){
$j++; $$j++;
my $cnt = 1; my $cnt = 1;
$rows->[$j]{main::key($$num++,1,$m2,'EDID-Warnings')} = ''; $rows->[$$j]{main::key($$num++,1,$m2,'EDID-Warnings')} = '';
foreach my $warn (@{$monitors->{$key}{'edid-warnings'}}){ foreach my $warn (@{$monitors->{$key}{'edid-warnings'}}){
$rows->[$j]{main::key($$num++,0,$m3,$cnt)} = $warn; $rows->[$$j]{main::key($$num++,0,$m3,$cnt)} = $warn;
$cnt++; $cnt++;
} }
} }
@ -15563,9 +15607,16 @@ sub xdpyinfo_data {
eval $start if $b_log; eval $start if $b_log;
my ($program) = @_; my ($program) = @_;
my ($diagonal,$diagonal_m,$dpi) = ('','',''); my ($diagonal,$diagonal_m,$dpi) = ('','','');
my ($screen_id,$screen,@working); my ($screen_id,$xdpyinfo,@working);
my ($res_x,$res_y,$size_x,$size_x_i,$size_y,$size_y_i); my ($res_x,$res_y,$size_x,$size_x_i,$size_y,$size_y_i);
my $xdpyinfo = main::grabber("$program $display_opt 2>/dev/null","\n",'strip','ref'); if (!$fake{'xdpyinfo'}){
$xdpyinfo = main::grabber("$program $display_opt 2>/dev/null","\n",'strip','ref');
}
else {
# my $file;
# $file = "$ENV{HOME}/bin/scripts/inxi/data/xdpyinfo/xdpyinfo-1-screen-2-in-inxi.txt";
# $xdpyinfo = main::reader($file,'strip','ref');
}
# @$xdpyinfo = map {s/^\s+//;$_} @$xdpyinfo if @$xdpyinfo; # @$xdpyinfo = map {s/^\s+//;$_} @$xdpyinfo if @$xdpyinfo;
# print join("\n",@$xdpyinfo), "\n"; # print join("\n",@$xdpyinfo), "\n";
# X vendor and version detection. # X vendor and version detection.
@ -15607,7 +15658,7 @@ sub xdpyinfo_data {
elsif ($working[0] eq 'number of screens'){ elsif ($working[0] eq 'number of screens'){
$graphics{'display-screens'} = $working[1]; $graphics{'display-screens'} = $working[1];
} }
elsif ($working[0] =~ /^screen #([0-9]+):/){ elsif ($working[0] =~ /^screen #([0-9]+):/){
$screen_id = $1; $screen_id = $1;
} }
elsif ($working[0] eq 'resolution'){ elsif ($working[0] eq 'resolution'){
@ -15632,19 +15683,19 @@ sub xdpyinfo_data {
$diagonal = ($size_x && $size_y) ? sprintf("%.2f", (sqrt($size_x**2 + $size_y**2)/25.4)) + 0 : ''; $diagonal = ($size_x && $size_y) ? sprintf("%.2f", (sqrt($size_x**2 + $size_y**2)/25.4)) + 0 : '';
$diagonal_m = ($size_x && $size_y) ? sprintf("%.0f", (sqrt($size_x**2 + $size_y**2))) : ''; $diagonal_m = ($size_x && $size_y) ? sprintf("%.0f", (sqrt($size_x**2 + $size_y**2))) : '';
} }
$screen = { push(@{$graphics{'screens'}}, {
'screen' => $screen_id, 'diagonal' => $diagonal,
'diagonal-m' => $diagonal_m,
'res-x' => $res_x, 'res-x' => $res_x,
'res-y' => $res_y, 'res-y' => $res_y,
'screen' => $screen_id,
's-dpi' => $dpi,
'size-x' => $size_x, 'size-x' => $size_x,
'size-x-i' => $size_x_i, 'size-x-i' => $size_x_i,
'size-y' => $size_y, 'size-y' => $size_y,
'size-y-i' => $size_y_i, 'size-y-i' => $size_y_i,
's-dpi' => $dpi, 'source' => 'xdpyinfo',
'diagonal' => $diagonal, });
'diagonal-m' => $diagonal_m,
};
push(@{$graphics{'screens'}}, $screen);
} }
} }
print 'Data: xdpyinfo: ', Data::Dumper::Dumper $graphics{'screens'} if $dbg[17]; print 'Data: xdpyinfo: ', Data::Dumper::Dumper $graphics{'screens'} if $dbg[17];
@ -15656,49 +15707,52 @@ sub xrandr_data {
my ($program) = @_; my ($program) = @_;
my ($diagonal,$diagonal_m,$dpi,$monitor_id,$pos_x,$pos_y,$primary); my ($diagonal,$diagonal_m,$dpi,$monitor_id,$pos_x,$pos_y,$primary);
my ($res_x,$res_x_max,$res_y,$res_y_max); my ($res_x,$res_x_max,$res_y,$res_y_max);
my ($screen_id,$set_as,$size_x,$size_x_i,$size_y,$size_y_i,$x_screen); my ($screen_id,$set_as,$size_x,$size_x_i,$size_y,$size_y_i);
my (@ids,%monitors,@xrandr_screens,$xrandr); my (@ids,%monitors,@xrandr_screens,$xrandr);
if (!$fake{'xrandr'}){ if (!$fake{'xrandr'}){
$xrandr = main::grabber("$program $display_opt 2>/dev/null",'','strip','ref'); $xrandr = main::grabber("$program $display_opt 2>/dev/null",'','strip','ref');
} }
else { else {
# $xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-4-displays-1.txt",'strip','ref'); # my $file;
$xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-3-display-primary-issue.txt",'strip','ref'); # $file = ""$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-4-displays-1.txt";
# $xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-test-1.txt",'strip','ref'); # $file = "$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-3-display-primary-issue.txt";
# $xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-test-2.txt",'strip','ref'); # $file = "$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-test-1.txt";
# $file = "$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-test-2.txt";
# $file = "$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-1-screen-2-in-inxi.txt";
# $xrandr = main::reader($file,'strip','ref');
} }
# $graphics{'dimensions'} = (\@dimensions); # $graphics{'dimensions'} = (\@dimensions);
# we get a bit more info from xrandr than xdpyinfo, but xrandr fails to handle # we get a bit more info from xrandr than xdpyinfo, but xrandr fails to handle
# multiple screens from different video cards # multiple screens from different video cards
# $graphics{'screens'} = undef;
foreach (@$xrandr){ foreach (@$xrandr){
# note: no mm as with xdpyinfo # note: no mm as with xdpyinfo
# Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192 # Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
if (/^Screen ([0-9]+):/){ if (/^Screen ([0-9]+):/){
$screen_id = $1; $screen_id = $1;
# handle no xdpyinfo Screen data # handle no xdpyinfo Screen data, multiple xscreens, etc
if ((!$graphics{'screens'} || if (check_screens($screen_id) &&
scalar @{$graphics{'screens'}} != (scalar @xrandr_screens + 1)) && /:\s.*?current\s+(\d+)\s*x\s*(\d+),\smaximum\s+(\d+)\s*x\s*(\d+)/){
/:\s.*?current\s+(\d+)\s*x\s*(\d+),\smaximum\s+(\d+)\s*x\s*(\d+)/){
$res_x = $1; $res_x = $1;
$res_y = $2; $res_y = $2;
$res_x_max = $3; $res_x_max = $3;
$res_y_max = $4; $res_y_max = $4;
$x_screen = { push(@{$graphics{'screens'}}, {
'screen' => $screen_id, 'diagonal' => undef,
'diagonal-m' => undef,
'res-x' => $res_x, 'res-x' => $res_x,
'res-y' => $res_y, 'res-y' => $res_y,
'screen' => $screen_id,
's-dpi' => undef,
'size-x' => undef, 'size-x' => undef,
'size-x-i' => undef, 'size-x-i' => undef,
'size-y' => undef, 'size-y' => undef,
'size-y-i' => undef, 'size-y-i' => undef,
's-dpi' => undef, 'source' => 'xrandr',
'diagonal' => undef, });
'diagonal-m' => undef,
};
push(@{$graphics{'screens'}}, $x_screen);
} }
if (%monitors){ if (%monitors){
push(@xrandr_screens,\%monitors); push(@xrandr_screens,{%monitors});
%monitors = (); %monitors = ();
} }
} }
@ -15758,6 +15812,7 @@ sub xrandr_data {
} }
my @working = split(/\s+/,$_); my @working = split(/\s+/,$_);
# this is the monitor current dimensions # this is the monitor current dimensions
# 5120x1440 59.98* 29.98
if ($working[1] =~ /\*/){ if ($working[1] =~ /\*/){
$working[1] =~ s/\*|\+//g; $working[1] =~ s/\*|\+//g;
$working[1] = sprintf("%.0f",$working[1]); $working[1] = sprintf("%.0f",$working[1]);
@ -15769,11 +15824,13 @@ sub xrandr_data {
} }
} }
if (%monitors){ if (%monitors){
push(@xrandr_screens,\%monitors); push(@xrandr_screens,{%monitors});
} }
my $i = 0; my $i = 0;
my $layouts; my $layouts;
if (!defined $graphics{'display-screens'} && $graphics{'screens'}){ # corner cases, xrandr screens > xdpyinfo screen, no xdpyinfo counts
if ($graphics{'screens'} && (!defined $graphics{'display-screens'} ||
$graphics{'display-screens'} < scalar @{$graphics{'screens'}})){
$graphics{'display-screens'} = scalar @{$graphics{'screens'}}; $graphics{'display-screens'} = scalar @{$graphics{'screens'}};
} }
map_monitor_ids(\@ids) if @ids; map_monitor_ids(\@ids) if @ids;
@ -15808,6 +15865,29 @@ sub xrandr_data {
main::log_data('dump','$graphics{screens}',$graphics{'screens'}) if $b_log; main::log_data('dump','$graphics{screens}',$graphics{'screens'}) if $b_log;
eval $end if $b_log; eval $end if $b_log;
} }
# handle some strange corner cases with more robust testing
sub check_screens {
my ($id) = @_;
my $b_use;
# used: scalar @{$graphics{'screens'}} != (scalar @$xrandr_screens + 1)
# before but that test can fail in some cases.
# no screens set in xdpyinfo. If xrandr has > 1 xscreen, this would be false
if (!$graphics{'screens'}){
$b_use = 1;
}
# verify that any xscreen set so far does not exist in $graphics{'screens'}
else {
my $b_detected;
foreach my $screen (@{$graphics{'screens'}}){
if ($screen->{'screen'} eq $id){
$b_detected = 1;
last;
}
}
$b_use = 1 if !$b_detected;
}
return $b_use;
}
# case where no xpdyinfo display server/version data exists, or to set Wayland # case where no xpdyinfo display server/version data exists, or to set Wayland
# Xwayland version, or Xvesa data. # Xwayland version, or Xvesa data.
sub display_server_data { sub display_server_data {
@ -15965,7 +16045,7 @@ sub display_drivers_x {
my $list = join('|', qw(amdgpu apm ark armsoc atimisc my $list = join('|', qw(amdgpu apm ark armsoc atimisc
chips cirrus cyrix etnaviv fbdev fbturbo fglrx geode glide glint chips cirrus cyrix etnaviv fbdev fbturbo fglrx geode glide glint
i128 i740 i810-dec100 i810e i810 i815 i830 i845 i855 i865 i915 i945 i965 i128 i740 i810-dec100 i810e i810 i815 i830 i845 i855 i865 i915 i945 i965
iftv imstt intel ivtv mach64 mesa mga modesetting neomagic newport iftv imstt intel ivtv mach64 mesa mga m68k modesetting neomagic newport
nouveau nsc nvidia nv openchrome r128 radeonhd radeon rendition nouveau nsc nvidia nv openchrome r128 radeonhd radeon rendition
s3virge s3 savage siliconmotion sisimedia sisusb sis s3virge s3 savage siliconmotion sisimedia sisusb sis
sunbw2 suncg14 suncg3 suncg6 sunffb sunleo suntcx tdfx tga trident tseng sunbw2 suncg14 suncg3 suncg6 sunffb sunleo suntcx tdfx tga trident tseng
@ -16252,7 +16332,7 @@ sub set_amd_data {
'years' => '2020-22', 'years' => '2020-22',
}, },
{'arch' => 'RDNA-3', {'arch' => 'RDNA-3',
'ids' => '15bf|164f', 'ids' => '15bf|164f|744c',
'code' => 'Navi-3x', 'code' => 'Navi-3x',
'process' => 'TSMC n5 (5nm)', 'process' => 'TSMC n5 (5nm)',
'years' => '2022+', 'years' => '2022+',
@ -16636,9 +16716,13 @@ sub set_nv_data {
'1617|1618|1619|161a|1667|174d|174e|179c|17c8|17f0|17f1|17fd|1c8c|1c8d|1c90|' . '1617|1618|1619|161a|1667|174d|174e|179c|17c8|17f0|17f1|17fd|1c8c|1c8d|1c90|' .
'1c91|1d10|1d12|1e91|1ed1|1ed3|1f14|1f54', '1c91|1d10|1d12|1e91|1ed1|1ed3|1f14|1f54',
'code' => 'GMxxx', 'code' => 'GMxxx',
'kernel' => '',
'legacy' => 0,
'process' => 'TSMC 28nm', 'process' => 'TSMC 28nm',
'series' => '520.xx+', 'release' => '',
'series' => '525.xx+',
'status' => $status_current, 'status' => $status_current,
'xorg' => '',
'years' => '2014-19', 'years' => '2014-19',
}, },
{'arch' => 'Pascal', {'arch' => 'Pascal',
@ -16649,18 +16733,26 @@ sub set_nv_data {
'1cb2|1cb3|1cb6|1cba|1cbb|1cbc|1cbd|1cfa|1cfb|1d01|1d02|1d11|1d13|1d16|1d33|' . '1cb2|1cb3|1cb6|1cba|1cbb|1cbc|1cbd|1cfa|1cfb|1d01|1d02|1d11|1d13|1d16|1d33|' .
'1d34|1d52', '1d34|1d52',
'code' => 'GP10x', 'code' => 'GP10x',
'kernel' => '',
'legacy' => 0,
'process' => 'TSMC 16nm', 'process' => 'TSMC 16nm',
'series' => '520.xx+', 'release' => '',
'series' => '525.xx+',
'status' => $status_current, 'status' => $status_current,
'xorg' => '',
'years' => '2016-21', 'years' => '2016-21',
}, },
{'arch' => 'Volta', {'arch' => 'Volta',
'ids' => '1d81|1db1|1db3|1db4|1db5|1db6|1db7|1db8|1dba|1df0|1df2|1df6|1fb0|' . 'ids' => '1d81|1db1|1db3|1db4|1db5|1db6|1db7|1db8|1dba|1df0|1df2|1df6|1fb0|' .
'20b0|20b3|20b6', '20b0|20b3|20b6',
'code' => 'GV1xx', 'code' => 'GV1xx',
'kernel' => '',
'legacy' => 0,
'process' => 'TSMC 12nm', 'process' => 'TSMC 12nm',
'series' => '520.xx+', 'release' => '',
'series' => '525.xx+',
'status' => $status_current, 'status' => $status_current,
'xorg' => '',
'years' => '2017-20', 'years' => '2017-20',
}, },
{'arch' => 'Turing', {'arch' => 'Turing',
@ -16671,39 +16763,54 @@ sub set_nv_data {
'1fb1|1fb2|1fb6|1fb7|1fb8|1fb9|1fba|1fbb|1fbc|1fdd|1ff0|1ff2|1ff9|2182|2184|' . '1fb1|1fb2|1fb6|1fb7|1fb8|1fb9|1fba|1fbb|1fbc|1fdd|1ff0|1ff2|1ff9|2182|2184|' .
'2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa', '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa',
'code' => 'TUxxx', 'code' => 'TUxxx',
'process' => 'TSMC 12nm', 'kernel' => '',
'series' => '520.xx+', 'legacy' => 0,
'process' => 'TSMC 12nm FF',
'release' => '',
'series' => '525.xx+',
'status' => $status_current, 'status' => $status_current,
'xorg' => '',
'years' => '2018-22', 'years' => '2018-22',
}, },
{'arch' => 'Ampere', {'arch' => 'Ampere',
'ids' => '20b0|20b2|20b5|20b7|20f1|2203|2204|2206|2207|2208|220a|220d|2216|' . 'ids' => '20b0|20b2|20b5|20b7|20f1|20f3|20f5|2203|2204|2206|2207|2208|220a|' .
'2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|2438|2460|2482|2484|2486|' . '220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|2438|2460|2482|' .
'2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|24b7|24b8|24b9|24ba|24bb|' . '2484|2486|2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|24b7|24b8|24b9|' .
'24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|2520|2521|2523|2531|2544|2560|' . '24ba|24bb|24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|2520|2521|2523|2531|' .
'2563|2571|25a0|25a2|25a5|25b6|25b8|25b9|25ba|25bb|25e0|25e2|25e5|25f9|25fa', '2544|2560|2563|2571|25a0|25a2|25a5|25b6|25b8|25b9|25ba|25bb|25e0|25e2|25e5|' .
'25f9|25fa|25fb',
'code' => 'GAxxx', 'code' => 'GAxxx',
'kernel' => '',
'legacy' => 0,
'process' => 'TSMC n7 (7nm)', 'process' => 'TSMC n7 (7nm)',
'series' => '520.xx+', 'release' => '',
'series' => '525.xx+',
'status' => $status_current, 'status' => $status_current,
'xorg' => '',
'years' => '2020-22', 'years' => '2020-22',
}, },
{'arch' => 'Hopper', {'arch' => 'Hopper',
'ids' => '2331', 'ids' => '2331',
'code' => 'GH1xx', 'code' => 'GH1xx',
'pattern' => '\bG?H[12]\d{2}', 'kernel' => '',
'legacy' => 0,
'process' => 'TSMC n4 (5nm)', 'process' => 'TSMC n4 (5nm)',
'series' => '520.xx+', 'release' => '',
'series' => '525.xx+',
'status' => $status_current, 'status' => $status_current,
'xorg' => '',
'years' => '2022+', 'years' => '2022+',
}, },
{'arch' => 'Lovelace', {'arch' => 'Lovelace',
'ids' => '2684', 'ids' => '2684|26b1|26b5|2704',
'code' => 'AD1xx', 'code' => 'AD1xx',
'pattern' => '\bG?L\d{1,4}|\bAD1\d{2}|RTX [6-8]0\d{2}', 'kernel' => '',
'legacy' => 0,
'process' => 'TSMC n4 (5nm)', 'process' => 'TSMC n4 (5nm)',
'series' => '520.xx+', 'release' => '',
'series' => '525.xx+',
'status' => $status_current, 'status' => $status_current,
'xorg' => '',
'years' => '2022-23+', 'years' => '2022-23+',
}, },
]; ];
@ -30144,7 +30251,7 @@ sub package_counts {
'pikaur','trizen','yaourt','yay','yup']], 'pikaur','trizen','yaourt','yay','yup']],
['pacman-g2','pacman-g2','p','-Q',1,0,'','',], ['pacman-g2','pacman-g2','p','-Q',1,0,'','',],
['pkg','pkg','d','/var/db/pkg/*',1,0,''], # 'pkg list' returns non programs ['pkg','pkg','d','/var/db/pkg/*',1,0,''], # 'pkg list' returns non programs
['pkg_info','pkg_info','p','',1,0,''], ['pkg_add','pkg_info','p','',1,0,''], # OpenBSD has set of tools, not 1 pm
# like cards, avoid pkginfo directly due to python pm being so slow # like cards, avoid pkginfo directly due to python pm being so slow
# but pkgadd is also found in scratch # but pkgadd is also found in scratch
['pkgutils','pkginfo','p','-i',1,0,'','main::check_program(\'pkgadd\')'], ['pkgutils','pkginfo','p','-i',1,0,'','main::check_program(\'pkgadd\')'],

20
inxi.1
View file

@ -15,7 +15,7 @@
.\" with this program; if not, write to the Free Software Foundation, Inc., .\" with this program; if not, write to the Free Software Foundation, Inc.,
.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. .\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
.\" .\"
.TH INXI 1 "2022\-10\-31" "inxi" "inxi manual" .TH INXI 1 "2022\-11\-02" "inxi" "inxi manual"
.SH NAME .SH NAME
inxi \- Command line system information script for console and IRC inxi \- Command line system information script for console and IRC
@ -2870,15 +2870,17 @@ File an issue report:
Post on inxi forums: Post on inxi forums:
.I https://techpatterns.com/forums/forum\-33.html .I https://techpatterns.com/forums/forum\-33.html
.TP .TP
.B IRC irc.oftc.net#smxi .B IRC irc.oftc.net\fR / \fBirc.libera.chat\fR
You can also visit You can also visit \fRchannel:\fI #smxi\fR to post issues on either network.
.I irc.oftc.net
\fRchannel:\fI #smxi\fR to post issues.
.SH HOMEPAGE .SH HOMEPAGE
.I https://github.com/smxi/inxi .I https://github.com/smxi/inxi\fR \- Home of the source code, and tech docs
(\fIinxi\-perl/docs\fR).
.I https://smxi.org/docs/inxi.htm .I https://smxi.org/docs/inxi.htm\fR \- The main docs for inxi. See
\fIinxi\-perl/docs\fR for more technical docs.
.I https://fosstodon.org/@smxi\fR \- Follow @smxi on Mastodon!
.SH AUTHOR AND CONTRIBUTORS TO CODE .SH AUTHOR AND CONTRIBUTORS TO CODE
@ -2936,6 +2938,10 @@ inconsistencies is much appreciated.
For a huge boost to BSD support, Stan Vandiver, who did a lot of testing For a huge boost to BSD support, Stan Vandiver, who did a lot of testing
and setup many remote access systems for testing and development. and setup many remote access systems for testing and development.
For testing, bug finding, suggestions, feature requests, MrMazda. He has over
the years has helped shape inxi into what it is today, in particular but not
limited to, the Graphics features.
All the inxi package maintainers, distro support people, forum moderators, All the inxi package maintainers, distro support people, forum moderators,
and in particular, sys admins with their particular issues, which almost always and in particular, sys admins with their particular issues, which almost always
help make inxi better, and any others who contribute ideas, suggestions, and help make inxi better, and any others who contribute ideas, suggestions, and

View file

@ -1,3 +1,151 @@
================================================================================
Version: 3.3.24
Patch: 00
Date: 2022-12-10
--------------------------------------------------------------------------------
RELEASE NOTES:
--------------------------------------------------------------------------------
A small point release, mainly to get some bug fixes, and a few minor issues, and
some ongoing updates to various matching rule features like CPU, Disk Vendors,
etc.
--------------------------------------------------------------------------------
SPECIAL THANKS:
1. mrmazda, for continuing to poke around and finding oddities on occasion.
2. The various packagers, for continuing to package inxi.
3. Nothing else really comes to mind, so I'm thankful that no real issues popped
up, and the ongoing attempt to stabilize and clean up the several year
aggressive development cycle of code is proceeding quite well.
--------------------------------------------------------------------------------
KNOWN ISSUES:
1. I'm currently getting no data samples from new server type CPU systems,
Nvidia Grace, Ampere, both ARM V2 based. The ARM cpu arch logic hasn't been
updated in many years since I have gotten no meaningful data, currently
Raspberry Pi 4 is the latest ARM generation I've seen data for, and no ARM
server type for many years. So support there is really not happening, and won't
be until I start getting real datasets on those server systems.
Nvidia uses Neoverse V2 ARM core, but I have no information on that yet. Also
nothing from the Amazon CPU, new Marvell datacenter type CPUs. But that's not
surprising.Also, nothing from the N1 (2019) or V1 Neoverse (2021) ARM CPU family
even though those have now been out a while.
A lot of the advanced CPU data should 'just work' because of the huge CPU
refactor done recently, but some of the more advanced data, particularly
cpu_arch type data, isn't going to be available until I get real data sets so I
can see what's going on. No idea how CPUID might work for ARM cpus, for example.
Objectively many of these datacenter/machine learning focused CPUs will never
see a system inxi will run on, though most I suspect will be running GNU/Linux
in some form, so inxi can in theory run on them, but those people all know what
their systems are doing, so the need isn't particularly pressing of course.
With this said, I did used to have more access to cutting edge server stuff, but
that has largely dried up, particularly ARM based chips.
--------------------------------------------------------------------------------
BUGS:
1. Found while resolving Fix 2, it turns out > 1 X Screens would not have shown
correctly due to failing to pass $j row counter by reference. This bug was
introduced when the big Monitor updates were done, since you almost never see
> 1 X Screens now, I never saw it until testing something for another reason.
This led to > 1 Screen showing on the same line as the last monitor of the
previous Screen.
See also Fixes 2, 3, 4, and Code 1, 2, 3.
--------------------------------------------------------------------------------
FIXES:
1. Changed Intel Saphire Rapids release data from 2021+ (what Intel had
initially announced) to 2023+ (the actual release date). Not my fault!! They
were too optimistic, inxi merely repeated their claims.
2. While trying to figure out extra Screen showing up, found a series of subtle
issues with how X Screens are handled. Added in more robust test for if Screen
ID has been added by xdpyinfo_data, and other weird corner cases that might
cause strange results in Display Screen-x.
Created check_screen() to allow for more granular and debugable testing.
This forum post helped focus attention on this issue:
https://forum.endeavouros.com/t/\
my-second-screen-is-not-working-after-installing-nvidia/33388
3. %monitors was not correctly assigned in xrandr screen fallback.
4. Set number of Screens found if no xdpyinfo or if xrandr found > xdpyinfo
number of screens.
5. Added Zhaoxin match to Centaur match, might show up on cpu string.
6. OpenBSD's package manager was listed as pkg_info, but it's slightly more
accurate to call it pkg_add. As far as I understand it, OpenBSD doesn't really
have a 'package manager' per se, it has a suite of tools to manage packages.
--------------------------------------------------------------------------------
ENHANCEMENTS:
1. Added some Zhaoxin/Centaur IDs, unlikely to show up, but you never know.
2. Added m68k to X display driver list. This was just added to kernel as a full
drm driver! Very legacy, but has users in vm, qemu, etc.
3. More disk vendors! I skipped updating this last time because, well,
collecting the data is really boring, and slightly tedious, and really serves to
simply remind that this is not the way towards a better world. Or are cheap SSDs
the true path after all? I doubt it, but you never know.
4. New AMD, Nvidia gpu ids.
5. New Intel Cpu Microarch IDs.
--------------------------------------------------------------------------------
CHANGES:
1. No changes to speak of, so I won't.
--------------------------------------------------------------------------------
DOCUMENTATION:
1. Various ongoing updates to inxi-perl/docs. These are very slowly being pulled
into a more useful form. Emphasis on slowly.
--------------------------------------------------------------------------------
CODE:
1. In Graphics::xdpyinfo_data() and Graphics::xrandr_data() got rid of extra
step, now just assign hash reference directly to push anonymous hash reference
into array. Had used intermidiate variable assignement of hash ref, but that is
pointless.
2. Added $fake{'xdpyinfo'}, hoping to get some debugger data to test weird
extra 'Screen' seen with Endeavor user (see Fix 2, 3, Bug 1).
3. Also, instead of using \%monitors, which creates a reference to the last
value of %monitors, used the correct and safer {%monitors}, which creates an
anonymous reference of the value %monitors had at that moment. This is a subtle
Perl error which is easy to make in cases where the hash or array reference is
almsot never > 1 instance, such as > 1 X Screens.
This should at least help resolve the repeated 'monitors' rows in the output
in Fixes 2, 3, 4.
4. Added 'source' to $graphics{'screens'} to log where each detected screen came
from, xdpyinfo or xrandr.
--------------------------------------------------------------------------------
-- Harald Hope - Sat, 12 Dec 2022 13:28:23 -0700
================================================================================ ================================================================================
Version: 3.3.23 Version: 3.3.23
Patch: 00 Patch: 00
@ -7,11 +155,9 @@ RELEASE NOTES:
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
This release fixes another very long standing bug, which I was not sure was an This release fixes another very long standing bug, which I was not sure was an
inxi or a Konversation bug, which made tracking it down very difficult. Special inxi or a Konversation bug, which made tracking it down very difficult. The bug
thanks to argonel of Konversation for helping solve this problem, or at least, was that inxi simply did not run in Konversation, it would exit with error when
for directing my attention towards the likely cause area, and away from wrong run with /cmd or /inxi via symbolic links.
ideas. The bug was that inxi simply did not run in Konversation, it would exit
with error when run with /cmd or /inxi via symbolic links.
This may not seem like a huge deal to many of you, but the actual history of This may not seem like a huge deal to many of you, but the actual history of
inxi was directly linked to user support in mainly Konversation, so this feature inxi was directly linked to user support in mainly Konversation, so this feature
@ -40,6 +186,21 @@ fixes and bugs. In other words, the code is taking a long needed, and well
deserved, breather, to recover after huge increases in the overall LOC and deserved, breather, to recover after huge increases in the overall LOC and
feature sets. feature sets.
--------------------------------------------------------------------------------
SPECIAL THANKS:
1. MrMazda, for finding even more failure and corner case issues. See Bug 1.
2. Github Issue #275, for finding and reporting and testing some WSL failures.
3. argonel of Konversation, for helping me finally track down the inxi / pinxi
failing to run in Konversation issue. Done, appropriately, on IRC channel
#Konversation. And in particular, for directing my attention towards the likely
cause area, and away from wrong ideas.
4. Thanks delanym, who filed Gitbub issue #276 for reporting a ZFS problem,
which also exposed some harder to trigger bugs in ZFS (Bug 3).
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
KNOWN ISSUES: KNOWN ISSUES:
@ -123,8 +284,7 @@ PYTHONPATH is not present with konversation string present as well.
5. Fix for ZFS using /dev/disk/by-partuuid for partition id in zfs, 5. Fix for ZFS using /dev/disk/by-partuuid for partition id in zfs,
which can lead to wrong usable disk total size report, along with failure which can lead to wrong usable disk total size report, along with failure
to show components. Thanks delanym, issue #276 for reporting this problem, which to show components.
also exposed some harder to trigger bugs in ZFS (Bug 3).
6. Exposed by issue #276, case where line was wrapping value when value was too 6. Exposed by issue #276, case where line was wrapping value when value was too
short visually to value: used: 34.4 GiB (4.5%) due to the 3 or more words short visually to value: used: 34.4 GiB (4.5%) due to the 3 or more words