diff options
Diffstat (limited to 'inxi')
| -rwxr-xr-x | inxi | 339 |
1 files changed, 223 insertions, 116 deletions
@@ -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\')'], |
