diff --git a/inxi b/inxi index aa128a5..836a27f 100755 --- a/inxi +++ b/inxi @@ -48,8 +48,8 @@ use POSIX qw(ceil uname strftime ttyname); ## INXI INFO ## my $self_name='inxi'; -my $self_version='3.3.23'; -my $self_date='2022-10-31'; +my $self_version='3.3.24'; +my $self_date='2022-12-10'; my $self_patch='00'; ## END INXI INFO ## @@ -514,7 +514,7 @@ sub set_os { elsif ($cpu_arch =~ /(sparc|sun4[uv])/){ $risc{'sparc'} = 1; $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)/){ $bits_sys = 32; } @@ -5215,7 +5215,8 @@ sub get { my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|elbrus|ipmi|logical|lspci|'; $wl .= 'partitions|pciconf|pcictl|pcidump|raid-btrfs|raid-hw|raid-lvm|'; $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)){ if ($_ =~ /\b($wl)\b/){ $fake{lc($1)} = 1; @@ -9217,6 +9218,7 @@ sub cpuinfo_data { next if !$block; if ($b_block_1){ $b_block_1 = 0; + # this may also kick in for centaur/via types, but no data available, guess if (!$cpu->{'type'} && $block->{'vendor_id'}){ $cpu->{'type'} = cpu_vendor($block->{'vendor_id'}); } @@ -11079,7 +11081,7 @@ sub cp_cpu_arch { if ($model =~ /^(1.|6.|7.|A.)$/){ $arch = 'Zen 4'; $gen = '5'; - $process = 'TSMC n5 (5nm)'; + $process = 'TSMC n5 (5nm)'; # Epyc Bergamo 4nm, no model IDs yet $year = '2022';} # double check 40, 44 elsif ($model =~ /^(4.)$/){ @@ -11100,7 +11102,10 @@ sub cp_cpu_arch { $year = '2021-22';} # 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'){ if ($family ne ''){ $arch="ARMv$family";} @@ -11128,26 +11133,44 @@ sub cp_cpu_arch { } elsif ($family eq '6'){ if ($model =~ /^(6)$/){ - $arch = 'WinChip-based'; + $arch = 'Via Cyrix III (WinChip 5)'; $process = '150nm'; # guess $year = '';} elsif ($model =~ /^(7|8)$/){ - $arch = 'C3'; + $arch = 'Via C3'; $process = '150nm'; $year = '';} elsif ($model =~ /^(9)$/){ - $arch = 'C3-2'; + $arch = 'Via C3-2'; $process = '130nm'; $year = '';} elsif ($model =~ /^(A|D)$/){ - $arch = 'C7'; + $arch = 'Via C7'; $process = '90nm'; $year = '';} 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 $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 # ExpLicit Basic Resources Utilization Scheduling @@ -11516,15 +11539,11 @@ sub cp_cpu_arch { elsif ($model =~ /^(8F)$/){ $arch = 'Sapphire Rapids'; $process = 'Intel 7 (10nm ESF)'; - $year = '2021+';} # server - elsif ($model =~ /^(97|9A|BE)$/){ + $year = '2023+';} # server + elsif ($model =~ /^(97|9A|9C|BE)$/){ $arch = 'Alder Lake'; # socket LG 1700 $process = 'Intel 7 (10nm ESF)'; $year = '2021+';} - elsif ($model =~ /^(9A|9C)$/){ - $arch = 'Tremont Jasper Lake'; - $process = 'Intel 10nm'; - $year = '2021+';} # ? elsif ($model =~ /^(9E)$/){ if ($stepping == 9){ $arch = 'Kaby Lake'; @@ -11566,10 +11585,18 @@ sub cp_cpu_arch { elsif ($model =~ /^(B7|BA|BF)$/){ $arch = 'Raptor Lake'; # 13 gen, socket LG 1700,1800 $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 # Granite Rapids: Intel 3 (7nm+), 2024 # 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 # Lunar Lake - 16 gen, Intel 18A (1.8nm), 2025 # Nova Lake - 17 gen, Intel 18A (1.8nm), 2026 @@ -12029,17 +12056,17 @@ sub cpu_vendor { my ($vendor) = (''); $string = lc($string); if ($string =~ /intel/){ - $vendor = "intel" + $vendor = "intel"; } elsif ($string =~ /amd/){ - $vendor = "amd" + $vendor = "amd"; } - # via - elsif ($string =~ /centaur/){ - $vendor = "centaur" + # via/centaur/zhaoxin branding + elsif ($string =~ /centaur|zhaoxin/){ + $vendor = "centaur"; } elsif ($string eq 'elbrus'){ - $vendor = "elbrus" + $vendor = "elbrus"; } eval $end if $b_log; return $vendor; @@ -13471,6 +13498,7 @@ sub set_disk_vendors { ['^AEGO','^AEGO','AEGO',''], ['^AFOX','^AFOX','AFOX',''], ['^(Agile|AGI)','^(AGI|Agile\s?Gear\s?Int[a-z]*)','AGI',''], + ['^Aigo','^Aigo','Aigo',''], ['^Aireye','^Aireye','Aireye',''], ['^Alcatel','^Alcatel','Alcatel',''], ['^(Alcor(\s?Micro)?|058F)','^(Alcor(\s?Micro)?|058F)','Alcor Micro',''], @@ -13506,12 +13534,14 @@ sub set_disk_vendors { ['^Bory','^Bory','Bory',''], ['^Braveeagle','^Braveeagle','BraveEagle',''], ['^(BUFFALO|BSC)','^BUFFALO','Buffalo',''], # usb: BSCR05TU2 + ['^Bugatek','^Bugatek','Bugatek',''], ['^Bulldozer','^Bulldozer','Bulldozer',''], ['^BUSlink','^BUSlink','BUSlink',''], ['^(Canon|MP49)','^Canon','Canon',''], ['^Centerm','^Centerm','Centerm',''], ['^(Centon|DS pro)','^Centon','Centon',''], ['^(CFD|CSSD)','^CFD','CFD',''], + ['^CHIPAL','^CHIPAL','CHIPAL',''], ['^(Chipsbank|CHIPSBNK)','^Chipsbank','Chipsbank',''], ['^Clover','^Clover','Clover',''], ['^CODi','^CODi','CODi',''], @@ -13536,6 +13566,7 @@ sub set_disk_vendors { ['^(DICOM|MAESTRO)','^DICOM','DICOM',''], ['^Digifast','^Digifast','Digifast',''], ['^DIGITAL\s?FILM','DIGITAL\s?FILM','Digital Film',''], + ['^(Digma|Run(\sY2)?\b)','^Digma','Digma',''], ['^Dikom','^Dikom','Dikom',''], ['^Disain','^Disain','Disain',''], ['^(Disney|PIX[\s]?JR)','^Disney','Disney',''], @@ -13544,6 +13575,7 @@ sub set_disk_vendors { ['^DragonDiamond','^DragonDiamond','DragonDiamond',''], ['^(DREVO\b|X1\s\d+[GT])','^DREVO','Drevo',''], ['^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',''], # DX1100 is probably sandisk, but could be HP, or it could be hp branded sandisk ['^(Eaget|V8$)','^Eaget','Eaget',''], @@ -13578,6 +13610,7 @@ sub set_disk_vendors { ['^(FOXLINE|FLD)','^FOXLINE','Foxline',''], # russian vendor? ['^(GALAX\b|Gamer\s?L|TA\dD|Gamer[\s-]?V)','^GALAX','GALAX',''], ['^Freecom','^Freecom(\sFreecom)?','Freecom',''], + ['^Gaiver','^Gaiver','Gaiver',''], ['^Galaxy\b','^Galaxy','Galaxy',''], ['^Gamer[_\s-]?Black','^Gamer[_\s-]?Black','Gamer Black',''], ['^(Garmin|Fenix|Nuvi|Zumo)','^Garmin','Garmin',''], @@ -13602,7 +13635,6 @@ sub set_disk_vendors { # supertalent also has FM: |FM ['^(G[\.]?SKILL)','^G[\.]?SKILL','G.SKILL',''], ['^G[\s-]*Tech','^G[\s-]*Tech(nology)?','G-Technology',''], - ['^Gaiver','^Gaiver','Gaiver',''], ['^(Hajaan|HS[1-9])','^Haajan','Haajan',''], ['^Haizhide','^Haizhide','Haizhide',''], ['^(Hama|FlashPen\s?Fancy)','^Hama','Hama',''], @@ -13648,14 +13680,17 @@ sub set_disk_vendors { ['^Jingyi','^Jingyi','Jingyi',''], # NOTE: ITY2 120GB hard to find ['^JMicron','^JMicron(\s?Tech(nology)?)?','JMicron Tech',''], #JMicron H/W raid + ['^JSYERA','^JSYERA','Jsyera',''], ['^(Jual|RX7)','^Jual','Jual',''], ['^Kazuk','^Kazuk','Kazuk',''], ['(\bKDI\b|^OM3P)','\bKDI\b','KDI',''], + ['^KEEPDATA','^KEEPDATA','KeepData',''], ['^KLLISRE','^KLLISRE','KLLISRE',''], ['^KimMIDI','^KimMIDI','KimMIDI',''], ['^Kimtigo','^Kimtigo','Kimtigo',''], ['^Kingbank','^Kingbank','Kingbank',''], ['^Kingchux[\s-]?ing','^Kingchux[\s-]?ing','Kingchuxing',''], + ['^KINGCOMP','^KINGCOMP','KingComp',''], ['(KingDian|^NGF|S(280|400))','KingDian','KingDian',''], ['^(Kingfast|TYFS)','^Kingfast','Kingfast',''], ['^KingMAX','^KingMAX','KingMAX',''], @@ -13667,6 +13702,7 @@ sub set_disk_vendors { # kingwin docking, not actual drive ['^(EZD|EZ-Dock)','','Kingwin Docking Station',''], ['^Kingwin','^Kingwin','Kingwin',''], + ['^KLLISRE','^KLLISRE','KLLISRE',''], ['(KIOXIA|^K[BX]G\d)','KIOXIA','KIOXIA',''], # company name comes after product ID ['^(KLEVV|NEO\sN|CRAS)','^KLEVV','KLEVV',''], ['^Kodak','^Kodak','Kodak',''], @@ -13695,7 +13731,9 @@ sub set_disk_vendors { ['^(LSI|MegaRAID)','^LSI\b','LSI',''], ['^(M-Systems|DiskOnKey)','^M-Systems','M-Systems',''], ['^(Mach\s*Xtreme|MXSSD|MXU|MX[\s-])','^Mach\s*Xtreme','Mach Xtreme',''], + ['^(MacroVIP|MV\d)','^MacroVIP','MacroVIP',''], ['^Mainic','^Mainic','Mainic',''], + ['^Maxell','^Maxell','Maxell',''], ['^Maximus','^Maximus','Maximus',''], ['^Maxone','^Maxone','Maxone',''], ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''], @@ -13763,12 +13801,15 @@ sub set_disk_vendors { ['^(-?Pretec|UltimateGuard)','-?Pretec','Pretec',''], ['^(Prolific)','^Prolific( Technolgy Inc\.)?','Prolific',''], # PS3109S9 is the result of an error condition with ssd drive + ['^PUSKILL','^PUSKILL','Puskill',''], ['QEMU','^\d*QEMU( QEMU)?','QEMU',''], # 0QUEMU QEMU HARDDISK ['(^Quantum|Fireball)','^Quantum','Quantum',''], ['^QUMO','^QUMO','Qumo',''], + ['^Qunion','^Qunion','Qunion',''], ['^(R[3-9]|AMD\s?(RADEON)?|Radeon)','AMD\s?(RADEON)?','AMD Radeon',''], # ssd ['^(Ramaxel|RT|RM|RPF|RDM)','^Ramaxel','Ramaxel',''], ['^(Ramsta|R[1-9])','^Ramsta','Ramsta',''], + ['^RCESSD','^RCESSD','RCESSD',''], ['^(Realtek|RTL)','^Realtek','Realtek',''], ['^(Reletech)','^Reletech','Reletech',''], # id: P400 but that's too short ['^RENICE','^RENICE','Renice',''], @@ -13833,6 +13874,7 @@ sub set_disk_vendors { ['^TEUTONS','^TEUTONS','TEUTONS',''], ['^(Textorm)','^Textorm','Textorm',''], # B5 too short ['^THU','^THU','THU',''], + ['^Tiger[\s_-]?Jet','^Tiger[\s_-]?Jet','TigerJet',''], ['^Tigo','^Tigo','Tigo',''], ['^(Timetec|35TT)','^Timetec','Timetec',''], ['^TKD','^TKD','TKD',''], @@ -13854,6 +13896,7 @@ sub set_disk_vendors { ['^(OOS[1-9]|Utania)','Utania','Utania',''], ['^U-TECH','U-TECH','U-Tech',''], ['^VBOX','','VirtualBox',''], + ['^(Veno|Scorp)','^Veno','Veno',''], ['^(Verbatim|STORE\s?\'?N\'?\s?(FLIP|GO)|Vi[1-9]|OTG\s?Tiny)','^Verbatim','Verbatim',''], ['^V-GEN','^V-GEN','V-Gen',''], ['^V[\s-]?(7|Seven)','^V[\s-]?(7|Seven)\b','VSeven',''], @@ -13885,6 +13928,7 @@ sub set_disk_vendors { ['^(YingChu|YGC)','^YingChu','YingChu',''], ['^(YUCUN|R880)','^YUCUN','YUCUN',''], ['^(ZALMAN|ZM\b)','^ZALMAN','Zalman',''], + # Zao/J.Zau: marvell ssd controller ['^ZXIC','^ZXIC','ZXIC',''], ['^(Zebronics|ZEB)','^Zebronics','Zebronics',''], ['^Zenfast','^Zenfast','Zenfast',''], @@ -14614,7 +14658,7 @@ sub display_output(){ } else { monitors_output_full('screen',$main->{'monitors'}, - $j,$rows,\$num); + \$j,$rows,\$num); } } elsif (!$show{'graphic-basic'} && $graphics{'no-monitors'}){ @@ -14633,7 +14677,7 @@ sub display_output(){ monitors_output_basic('monitor',$monitor_ids,'',$j,$rows,\$num); } 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); # note: in case where mapped id != sys id, the key will not match 'monitor' foreach my $key (sort keys %{$monitors}){ - $j++; - $rows->[$j]{main::key($$num++,1,$m1,'Monitor')} = $monitors->{$key}{'monitor'}; + $$j++; + $rows->[$$j]{main::key($$num++,1,$m1,'Monitor')} = $monitors->{$key}{'monitor'}; 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'}){ - $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'}){ - $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'}){ - $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'}){ - $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'}){ - $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'}){ - $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'} || $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 ||= 'N/A'; - $rows->[$j]{main::key($$num++,0,$m2,'res')} = $resolution; + $rows->[$$j]{main::key($$num++,0,$m2,'res')} = $resolution; } else { if ($b_display){ @@ -14723,50 +14767,50 @@ sub monitors_output_full { $resolution = main::message('monitor-console'); } $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'}){ - $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'}){ - $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'}){ - $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'}){ - $rows->[$j]{main::key($$num++,1,$m2,'chroma')} = ''; - $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,'y')} = $monitors->{$key}{'colors'}{'red_y'}; - $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,'y')} = $monitors->{$key}{'colors'}{'green_y'}; - $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,'y')} = $monitors->{$key}{'colors'}{'blue_y'}; - $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,'y')} = $monitors->{$key}{'colors'}{'white_y'}; + $rows->[$$j]{main::key($$num++,1,$m2,'chroma')} = ''; + $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,'y')} = $monitors->{$key}{'colors'}{'red_y'}; + $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,'y')} = $monitors->{$key}{'colors'}{'green_y'}; + $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,'y')} = $monitors->{$key}{'colors'}{'blue_y'}; + $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,'y')} = $monitors->{$key}{'colors'}{'white_y'}; } 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'}){ my $size = $monitors->{$key}{'size-x'} . 'x' . $monitors->{$key}{'size-y'} . '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'}){ 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'} && !$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'}){ - $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 (!$monitors->{$key}{'modes'} || !@{$monitors->{$key}{'modes'}}){ @@ -14774,30 +14818,30 @@ sub monitors_output_full { } my $cnt = scalar @{$monitors->{$key}{'modes'}}; 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 { - $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,'min')} = ${$monitors->{$key}{'modes'}}[-1]; + $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,'min')} = ${$monitors->{$key}{'modes'}}[-1]; } } if ($show{'edid'}){ if ($monitors->{$key}{'edid-errors'}){ - $j++; + $$j++; 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'}}){ - $rows->[$j]{main::key($$num++,0,$m3,$cnt)} = $err; + $rows->[$$j]{main::key($$num++,0,$m3,$cnt)} = $err; $cnt++; } } if ($monitors->{$key}{'edid-warnings'}){ - $j++; + $$j++; 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'}}){ - $rows->[$j]{main::key($$num++,0,$m3,$cnt)} = $warn; + $rows->[$$j]{main::key($$num++,0,$m3,$cnt)} = $warn; $cnt++; } } @@ -15563,9 +15607,16 @@ sub xdpyinfo_data { eval $start if $b_log; my ($program) = @_; 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 $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; # print join("\n",@$xdpyinfo), "\n"; # X vendor and version detection. @@ -15607,7 +15658,7 @@ sub xdpyinfo_data { elsif ($working[0] eq 'number of screens'){ $graphics{'display-screens'} = $working[1]; } - elsif ($working[0] =~ /^screen #([0-9]+):/){ + elsif ($working[0] =~ /^screen #([0-9]+):/){ $screen_id = $1; } 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_m = ($size_x && $size_y) ? sprintf("%.0f", (sqrt($size_x**2 + $size_y**2))) : ''; } - $screen = { - 'screen' => $screen_id, + push(@{$graphics{'screens'}}, { + 'diagonal' => $diagonal, + 'diagonal-m' => $diagonal_m, 'res-x' => $res_x, 'res-y' => $res_y, + 'screen' => $screen_id, + 's-dpi' => $dpi, 'size-x' => $size_x, 'size-x-i' => $size_x_i, 'size-y' => $size_y, 'size-y-i' => $size_y_i, - 's-dpi' => $dpi, - 'diagonal' => $diagonal, - 'diagonal-m' => $diagonal_m, - }; - push(@{$graphics{'screens'}}, $screen); + 'source' => 'xdpyinfo', + }); } } print 'Data: xdpyinfo: ', Data::Dumper::Dumper $graphics{'screens'} if $dbg[17]; @@ -15656,49 +15707,52 @@ sub xrandr_data { my ($program) = @_; my ($diagonal,$diagonal_m,$dpi,$monitor_id,$pos_x,$pos_y,$primary); 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); if (!$fake{'xrandr'}){ $xrandr = main::grabber("$program $display_opt 2>/dev/null",'','strip','ref'); } else { - # $xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-4-displays-1.txt",'strip','ref'); - $xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-3-display-primary-issue.txt",'strip','ref'); - # $xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-test-1.txt",'strip','ref'); - # $xrandr = main::reader("$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-test-2.txt",'strip','ref'); + # my $file; + # $file = ""$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-4-displays-1.txt"; + # $file = "$ENV{HOME}/bin/scripts/inxi/data/xrandr/xrandr-3-display-primary-issue.txt"; + # $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); # we get a bit more info from xrandr than xdpyinfo, but xrandr fails to handle # multiple screens from different video cards + # $graphics{'screens'} = undef; foreach (@$xrandr){ # note: no mm as with xdpyinfo # Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192 if (/^Screen ([0-9]+):/){ $screen_id = $1; - # handle no xdpyinfo Screen data - if ((!$graphics{'screens'} || - scalar @{$graphics{'screens'}} != (scalar @xrandr_screens + 1)) && - /:\s.*?current\s+(\d+)\s*x\s*(\d+),\smaximum\s+(\d+)\s*x\s*(\d+)/){ + # handle no xdpyinfo Screen data, multiple xscreens, etc + if (check_screens($screen_id) && + /:\s.*?current\s+(\d+)\s*x\s*(\d+),\smaximum\s+(\d+)\s*x\s*(\d+)/){ $res_x = $1; $res_y = $2; $res_x_max = $3; $res_y_max = $4; - $x_screen = { - 'screen' => $screen_id, + push(@{$graphics{'screens'}}, { + 'diagonal' => undef, + 'diagonal-m' => undef, 'res-x' => $res_x, 'res-y' => $res_y, + 'screen' => $screen_id, + 's-dpi' => undef, 'size-x' => undef, 'size-x-i' => undef, 'size-y' => undef, 'size-y-i' => undef, - 's-dpi' => undef, - 'diagonal' => undef, - 'diagonal-m' => undef, - }; - push(@{$graphics{'screens'}}, $x_screen); + 'source' => 'xrandr', + }); } if (%monitors){ - push(@xrandr_screens,\%monitors); + push(@xrandr_screens,{%monitors}); %monitors = (); } } @@ -15758,6 +15812,7 @@ sub xrandr_data { } my @working = split(/\s+/,$_); # this is the monitor current dimensions + # 5120x1440 59.98* 29.98 if ($working[1] =~ /\*/){ $working[1] =~ s/\*|\+//g; $working[1] = sprintf("%.0f",$working[1]); @@ -15769,11 +15824,13 @@ sub xrandr_data { } } if (%monitors){ - push(@xrandr_screens,\%monitors); + push(@xrandr_screens,{%monitors}); } my $i = 0; 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'}}; } map_monitor_ids(\@ids) if @ids; @@ -15808,6 +15865,29 @@ sub xrandr_data { main::log_data('dump','$graphics{screens}',$graphics{'screens'}) 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 # Xwayland version, or Xvesa data. sub display_server_data { @@ -15965,7 +16045,7 @@ sub display_drivers_x { my $list = join('|', qw(amdgpu apm ark armsoc atimisc chips cirrus cyrix etnaviv fbdev fbturbo fglrx geode glide glint 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 s3virge s3 savage siliconmotion sisimedia sisusb sis sunbw2 suncg14 suncg3 suncg6 sunffb sunleo suntcx tdfx tga trident tseng @@ -16252,7 +16332,7 @@ sub set_amd_data { 'years' => '2020-22', }, {'arch' => 'RDNA-3', - 'ids' => '15bf|164f', + 'ids' => '15bf|164f|744c', 'code' => 'Navi-3x', 'process' => 'TSMC n5 (5nm)', '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|' . '1c91|1d10|1d12|1e91|1ed1|1ed3|1f14|1f54', 'code' => 'GMxxx', + 'kernel' => '', + 'legacy' => 0, 'process' => 'TSMC 28nm', - 'series' => '520.xx+', + 'release' => '', + 'series' => '525.xx+', 'status' => $status_current, + 'xorg' => '', 'years' => '2014-19', }, {'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|' . '1d34|1d52', 'code' => 'GP10x', + 'kernel' => '', + 'legacy' => 0, 'process' => 'TSMC 16nm', - 'series' => '520.xx+', + 'release' => '', + 'series' => '525.xx+', 'status' => $status_current, + 'xorg' => '', 'years' => '2016-21', }, {'arch' => 'Volta', 'ids' => '1d81|1db1|1db3|1db4|1db5|1db6|1db7|1db8|1dba|1df0|1df2|1df6|1fb0|' . '20b0|20b3|20b6', 'code' => 'GV1xx', + 'kernel' => '', + 'legacy' => 0, 'process' => 'TSMC 12nm', - 'series' => '520.xx+', + 'release' => '', + 'series' => '525.xx+', 'status' => $status_current, + 'xorg' => '', 'years' => '2017-20', }, {'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|' . '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa', 'code' => 'TUxxx', - 'process' => 'TSMC 12nm', - 'series' => '520.xx+', + 'kernel' => '', + 'legacy' => 0, + 'process' => 'TSMC 12nm FF', + 'release' => '', + 'series' => '525.xx+', 'status' => $status_current, + 'xorg' => '', 'years' => '2018-22', }, {'arch' => 'Ampere', - 'ids' => '20b0|20b2|20b5|20b7|20f1|2203|2204|2206|2207|2208|220a|220d|2216|' . - '2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|2438|2460|2482|2484|2486|' . - '2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|24b7|24b8|24b9|24ba|24bb|' . - '24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|2520|2521|2523|2531|2544|2560|' . - '2563|2571|25a0|25a2|25a5|25b6|25b8|25b9|25ba|25bb|25e0|25e2|25e5|25f9|25fa', + 'ids' => '20b0|20b2|20b5|20b7|20f1|20f3|20f5|2203|2204|2206|2207|2208|220a|' . + '220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|2438|2460|2482|' . + '2484|2486|2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|24b7|24b8|24b9|' . + '24ba|24bb|24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|2520|2521|2523|2531|' . + '2544|2560|2563|2571|25a0|25a2|25a5|25b6|25b8|25b9|25ba|25bb|25e0|25e2|25e5|' . + '25f9|25fa|25fb', 'code' => 'GAxxx', + 'kernel' => '', + 'legacy' => 0, 'process' => 'TSMC n7 (7nm)', - 'series' => '520.xx+', + 'release' => '', + 'series' => '525.xx+', 'status' => $status_current, + 'xorg' => '', 'years' => '2020-22', }, {'arch' => 'Hopper', 'ids' => '2331', 'code' => 'GH1xx', - 'pattern' => '\bG?H[12]\d{2}', + 'kernel' => '', + 'legacy' => 0, 'process' => 'TSMC n4 (5nm)', - 'series' => '520.xx+', + 'release' => '', + 'series' => '525.xx+', 'status' => $status_current, + 'xorg' => '', 'years' => '2022+', }, {'arch' => 'Lovelace', - 'ids' => '2684', + 'ids' => '2684|26b1|26b5|2704', 'code' => 'AD1xx', - 'pattern' => '\bG?L\d{1,4}|\bAD1\d{2}|RTX [6-8]0\d{2}', + 'kernel' => '', + 'legacy' => 0, 'process' => 'TSMC n4 (5nm)', - 'series' => '520.xx+', + 'release' => '', + 'series' => '525.xx+', 'status' => $status_current, + 'xorg' => '', 'years' => '2022-23+', }, ]; @@ -30144,7 +30251,7 @@ sub package_counts { 'pikaur','trizen','yaourt','yay','yup']], ['pacman-g2','pacman-g2','p','-Q',1,0,'','',], ['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 # but pkgadd is also found in scratch ['pkgutils','pkginfo','p','-i',1,0,'','main::check_program(\'pkgadd\')'], diff --git a/inxi.1 b/inxi.1 index f0ded7a..3e76365 100644 --- a/inxi.1 +++ b/inxi.1 @@ -15,7 +15,7 @@ .\" with this program; if not, write to the Free Software Foundation, Inc., .\" 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 inxi \- Command line system information script for console and IRC @@ -2870,15 +2870,17 @@ File an issue report: Post on inxi forums: .I https://techpatterns.com/forums/forum\-33.html .TP -.B IRC irc.oftc.net#smxi -You can also visit -.I irc.oftc.net -\fRchannel:\fI #smxi\fR to post issues. +.B IRC irc.oftc.net\fR / \fBirc.libera.chat\fR +You can also visit \fRchannel:\fI #smxi\fR to post issues on either network. .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 @@ -2936,6 +2938,10 @@ inconsistencies is much appreciated. 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. +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, and in particular, sys admins with their particular issues, which almost always help make inxi better, and any others who contribute ideas, suggestions, and diff --git a/inxi.changelog b/inxi.changelog index a16d6c8..0832fad 100644 --- a/inxi.changelog +++ b/inxi.changelog @@ -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 Patch: 00 @@ -7,11 +155,9 @@ RELEASE NOTES: -------------------------------------------------------------------------------- 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 -thanks to argonel of Konversation for helping solve this problem, or at least, -for directing my attention towards the likely cause area, and away from wrong -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. +inxi or a Konversation bug, which made tracking it down very difficult. 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 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 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: @@ -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, 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 -also exposed some harder to trigger bugs in ZFS (Bug 3). +to show components. 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