diff options
| author | Paul Buetow <paul@buetow.org> | 2012-02-09 10:06:45 +0100 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2012-02-09 10:06:45 +0100 |
| commit | cafe0d509eeb356c5478e109f5344c6a27300907 (patch) | |
| tree | 0173289366150ae1fe83c88e6524b88c5904475d | |
| parent | 7e01fbd0789a0da22314fca7c2c9476c4d294fef (diff) | |
write config support
| -rw-r--r-- | CHANGELOG | 1 | ||||
| -rwxr-xr-x | loadbars | 567 |
2 files changed, 292 insertions, 276 deletions
@@ -3,6 +3,7 @@ just use the '#' sign. Sample config: showcores=1 # Always show cores on startup showtext=0 # Always don't display text on startup +* Add hotkey 'w' which writes current settings to the configfile * Remove --title option (no need anyway) * Some code cleanups * Some bugfixes @@ -174,6 +174,17 @@ sub read_config () { close $conffile; } +sub write_config () { + display_warn "Overwriting config file " . CONFFILE if -f CONFFILE; + open my $conffile, '>', CONFFILE or die "$!: " . CONFFILE . "\n"; + + for (keys %C) { + print $conffile "$_=$C{$_}\n"; + } + + close $conffile; +} + sub stats_thread ($;$) { my ( $host, $user ) = @_; $user = defined $user ? "-l $user" : ''; @@ -436,309 +447,312 @@ sub main_loop ($@) { $quit = 1; return; - } elsif ( $key_name eq 'a' ) { - ++$C{average}; - display_info "Set sample average to $C{average}"; - } elsif ( $key_name eq 'y' or $key_name eq 'z' ) { - my $avg = $C{average}; - --$avg; - $C{average} = $avg > 1 ? $avg : 2; - display_info "Set sample average to $C{average}"; - - } elsif ( $key_name eq 's' ) { - $C{factor} += 0.1; - display_info "Set scale factor to $C{factor}"; - } elsif ( $key_name eq 'x' or $key_name eq 'z' ) { - $C{factor} -= 0.1; - display_info "Set scale factor to $C{factor}"; - - } elsif ( $key_name eq 'left') { - $newsize{width} = $C{width} - 100; - $newsize{height} = $C{height}; - $resize_window = 1; - } elsif ( $key_name eq 'right' ) { - $newsize{width} = $C{width} + 100; - $newsize{height} = $C{height}; - $resize_window = 1; - - } elsif ( $key_name eq 'up' ) { - $newsize{width} = $C{width}; - $newsize{height} = $C{height} - 100; - $resize_window = 1; - } elsif ( $key_name eq 'down' ) { - $newsize{width} = $C{width}; - $newsize{height} = $C{height} + 100; - $resize_window = 1; + } elsif ( $key_name eq 'w' ) { + write_config; + + } elsif ( $key_name eq 'a' ) { + ++$C{average}; + display_info "Set sample average to $C{average}"; + } elsif ( $key_name eq 'y' or $key_name eq 'z' ) { + my $avg = $C{average}; + --$avg; + $C{average} = $avg > 1 ? $avg : 2; + display_info "Set sample average to $C{average}"; + + } elsif ( $key_name eq 's' ) { + $C{factor} += 0.1; + display_info "Set scale factor to $C{factor}"; + } elsif ( $key_name eq 'x' or $key_name eq 'z' ) { + $C{factor} -= 0.1; + display_info "Set scale factor to $C{factor}"; + + } elsif ( $key_name eq 'left') { + $newsize{width} = $C{width} - 100; + $newsize{height} = $C{height}; + $resize_window = 1; + } elsif ( $key_name eq 'right' ) { + $newsize{width} = $C{width} + 100; + $newsize{height} = $C{height}; + $resize_window = 1; + + } elsif ( $key_name eq 'up' ) { + $newsize{width} = $C{width}; + $newsize{height} = $C{height} - 100; + $resize_window = 1; + } elsif ( $key_name eq 'down' ) { + $newsize{width} = $C{width}; + $newsize{height} = $C{height} + 100; + $resize_window = 1; + } } - } - }; + }; - do { - my ( $x, $y ) = ( 0, 0 ); + do { + my ( $x, $y ) = ( 0, 0 ); - # Also substract 1 (each bar is followed by an 1px separator bar) - my $width = $C{width} / notnull($num_stats) - 1; + # Also substract 1 (each bar is followed by an 1px separator bar) + my $width = $C{width} / notnull($num_stats) - 1; - my ( $current_barnum, $current_corenum ) = ( -1, -1 ); + my ( $current_barnum, $current_corenum ) = ( -1, -1 ); - for my $key ( sort keys %CPUSTATS ) { - last if (++$current_barnum > $num_stats); - ++$current_corenum; - my ( $host, $name ) = split ';', $key; + for my $key ( sort keys %CPUSTATS ) { + last if (++$current_barnum > $num_stats); + ++$current_corenum; + my ( $host, $name ) = split ';', $key; - next unless defined $CPUSTATS{$key}; + next unless defined $CPUSTATS{$key}; - my %stat = map { - my ( $k, $v ) = split '='; - $k => $v + my %stat = map { + my ( $k, $v ) = split '='; + $k => $v - } split ';', $CPUSTATS{$key}; + } split ';', $CPUSTATS{$key}; + + unless ( exists $prev_stats{$key} ) { + $prev_stats{$key} = \%stat; + next; + } + + my $prev_stat = $prev_stats{$key}; + my %loads = + null $stat{TOTAL} == null $prev_stat->{TOTAL} + ? %stat + : map { $_ => $stat{$_} - $prev_stat->{$_} } keys %stat; - unless ( exists $prev_stats{$key} ) { $prev_stats{$key} = \%stat; - next; - } - my $prev_stat = $prev_stats{$key}; - my %loads = - null $stat{TOTAL} == null $prev_stat->{TOTAL} - ? %stat - : map { $_ => $stat{$_} - $prev_stat->{$_} } keys %stat; - - $prev_stats{$key} = \%stat; - - %loads = normalize_loads %loads; - push @{ $last_loads{$key} }, \%loads; - shift @{ $last_loads{$key} } - while @{ $last_loads{$key} } >= $C{average}; - - my ( $cpumax, $cpuaverage ) = get_cpuaverage $C{factor}, - @{ $last_loads{$key} }; - - my %heights = map { - $_ => defined $cpuaverage->{$_} - ? $cpuaverage->{$_} * ( $C{height} / 100 ) - : 1 - } keys %$cpuaverage; - - my $is_host_summary = $name eq 'cpu' ? 1 : 0; - - my $rect_separator = undef; - - my $rect_idle = get_rect $rects, "$key;idle"; - my $rect_steal = get_rect $rects, "$key;steal"; - my $rect_guest = get_rect $rects, "$key;guest"; - my $rect_irq = get_rect $rects, "$key;irq"; - my $rect_softirq = get_rect $rects, "$key;softirq"; - my $rect_nice = get_rect $rects, "$key;nice"; - my $rect_iowait = get_rect $rects, "$key;iowait"; - my $rect_user = get_rect $rects, "$key;user"; - my $rect_system = get_rect $rects, "$key;system"; - - my $rect_peak; - - $y = $C{height} - $heights{system}; - $rect_system->width($width); - $rect_system->height( $heights{system} ); - $rect_system->x($x); - $rect_system->y($y); - - $y -= $heights{user}; - $rect_user->width($width); - $rect_user->height( $heights{user} ); - $rect_user->x($x); - $rect_user->y($y); - - $y -= $heights{nice}; - $rect_nice->width($width); - $rect_nice->height( $heights{nice} ); - $rect_nice->x($x); - $rect_nice->y($y); - - $y -= $heights{idle}; - $rect_idle->width($width); - $rect_idle->height( $heights{idle} ); - $rect_idle->x($x); - $rect_idle->y($y); - - $y -= $heights{iowait}; - $rect_iowait->width($width); - $rect_iowait->height( $heights{iowait} ); - $rect_iowait->x($x); - $rect_iowait->y($y); - - $y -= $heights{irq}; - $rect_irq->width($width); - $rect_irq->height( $heights{irq} ); - $rect_irq->x($x); - $rect_irq->y($y); - - $y -= $heights{softirq}; - $rect_softirq->width($width); - $rect_softirq->height( $heights{softirq} ); - $rect_softirq->x($x); - $rect_softirq->y($y); - - $y -= $heights{guest}; - $rect_guest->width($width); - $rect_guest->height( $heights{guest} ); - $rect_guest->x($x); - $rect_guest->y($y); - - $y -= $heights{steal}; - $rect_steal->width($width); - $rect_steal->height( $heights{steal} ); - $rect_steal->x($x); - $rect_steal->y($y); - - my $all = 100 - $cpuaverage->{idle}; - my $max_all = 0; - - $app->fill( $rect_idle, Loadbars::BLACK ); - $app->fill( $rect_steal, Loadbars::RED ); - $app->fill( $rect_guest, Loadbars::RED ); - $app->fill( $rect_irq, Loadbars::WHITE ); - $app->fill( $rect_softirq, Loadbars::WHITE ); - $app->fill( $rect_nice, Loadbars::GREEN ); - $app->fill( $rect_iowait, Loadbars::PURPLE ); - - my $add_x = 0; - my $rect_memused = get_rect $rects, "$host;memused"; - my $rect_memfree = get_rect $rects, "$host;memfree"; - my $rect_buffers = get_rect $rects, "$host;buffers"; - my $rect_cached = get_rect $rects, "$host;cached"; - my $rect_swapused = get_rect $rects, "$host;swapused"; - my $rect_swapfree = get_rect $rects, "$host;swapfree"; - - my %meminfo; - if ( $is_host_summary ) { - if ( $C{showmem} ) { - $add_x = $width + 1; - - my $ram_per = percentage $MEMSTATS{"$host;MemTotal"}, $MEMSTATS{"$host;MemFree"}; - my $swap_per = percentage $MEMSTATS{"$host;SwapTotal"}, $MEMSTATS{"$host;SwapFree"}; - - %meminfo = ( - ram_per => $ram_per, - swap_per => $swap_per, - ); - - my %heights = ( - MemFree => $ram_per * ( $C{height} / 100 ), - MemUsed => (100 - $ram_per) * ( $C{height} / 100 ), - SwapFree => $swap_per * ( $C{height} / 100 ), - SwapUsed => (100 - $swap_per) * ( $C{height} / 100 ), - ); - - my $half_width = $width / 2; - $y = $C{height} - $heights{MemUsed}; - $rect_memused->width($half_width); - $rect_memused->height( $heights{MemUsed} ); - $rect_memused->x($x+$add_x); - $rect_memused->y($y); - - $y -= $heights{MemFree}; - $rect_memfree->width($half_width); - $rect_memfree->height( $heights{MemFree} ); - $rect_memfree->x($x+$add_x); - $rect_memfree->y($y); - - $y = $C{height} - $heights{SwapUsed}; - $rect_swapused->width($half_width); - $rect_swapused->height( $heights{SwapUsed} ); - $rect_swapused->x($x+$add_x+$half_width); - $rect_swapused->y($y); - - $y -= $heights{SwapFree}; - $rect_swapfree->width($half_width); - $rect_swapfree->height( $heights{SwapFree} ); - $rect_swapfree->x($x+$add_x+$half_width); - $rect_swapfree->y($y); - - $app->fill( $rect_memused, Loadbars::DARK_GREY ); - $app->fill( $rect_memfree, Loadbars::BLACK ); - - $app->fill( $rect_swapused, Loadbars::GREY ); - $app->fill( $rect_swapfree, Loadbars::BLACK ); - } + %loads = normalize_loads %loads; + push @{ $last_loads{$key} }, \%loads; + shift @{ $last_loads{$key} } + while @{ $last_loads{$key} } >= $C{average}; - if ( $C{showcores} ) { - $current_corenum = 0; - $rect_separator = get_rect $rects, "$key;separator"; - $rect_separator->width(1); - $rect_separator->height( $C{height} ); - $rect_separator->x( $x - 1 ); - $rect_separator->y(0); - $app->fill( $rect_separator, Loadbars::GREY ); - } - } + my ( $cpumax, $cpuaverage ) = get_cpuaverage $C{factor}, + @{ $last_loads{$key} }; - if ( $C{extended} ) { - my %maxheights = map { - $_ => defined $cpumax->{$_} - ? $cpumax->{$_} * ( $C{height} / 100 ) + my %heights = map { + $_ => defined $cpuaverage->{$_} + ? $cpuaverage->{$_} * ( $C{height} / 100 ) : 1 - } keys %$cpumax; - - $rect_peak = get_rect $rects, "$key;max"; - $rect_peak->width($width); - $rect_peak->height(1); - $rect_peak->x($x); - $rect_peak->y( $C{height} - $maxheights{system} - $maxheights{user} ); + } keys %$cpuaverage; + + my $is_host_summary = $name eq 'cpu' ? 1 : 0; + + my $rect_separator = undef; + + my $rect_idle = get_rect $rects, "$key;idle"; + my $rect_steal = get_rect $rects, "$key;steal"; + my $rect_guest = get_rect $rects, "$key;guest"; + my $rect_irq = get_rect $rects, "$key;irq"; + my $rect_softirq = get_rect $rects, "$key;softirq"; + my $rect_nice = get_rect $rects, "$key;nice"; + my $rect_iowait = get_rect $rects, "$key;iowait"; + my $rect_user = get_rect $rects, "$key;user"; + my $rect_system = get_rect $rects, "$key;system"; + + my $rect_peak; + + $y = $C{height} - $heights{system}; + $rect_system->width($width); + $rect_system->height( $heights{system} ); + $rect_system->x($x); + $rect_system->y($y); + + $y -= $heights{user}; + $rect_user->width($width); + $rect_user->height( $heights{user} ); + $rect_user->x($x); + $rect_user->y($y); + + $y -= $heights{nice}; + $rect_nice->width($width); + $rect_nice->height( $heights{nice} ); + $rect_nice->x($x); + $rect_nice->y($y); + + $y -= $heights{idle}; + $rect_idle->width($width); + $rect_idle->height( $heights{idle} ); + $rect_idle->x($x); + $rect_idle->y($y); + + $y -= $heights{iowait}; + $rect_iowait->width($width); + $rect_iowait->height( $heights{iowait} ); + $rect_iowait->x($x); + $rect_iowait->y($y); + + $y -= $heights{irq}; + $rect_irq->width($width); + $rect_irq->height( $heights{irq} ); + $rect_irq->x($x); + $rect_irq->y($y); + + $y -= $heights{softirq}; + $rect_softirq->width($width); + $rect_softirq->height( $heights{softirq} ); + $rect_softirq->x($x); + $rect_softirq->y($y); + + $y -= $heights{guest}; + $rect_guest->width($width); + $rect_guest->height( $heights{guest} ); + $rect_guest->x($x); + $rect_guest->y($y); + + $y -= $heights{steal}; + $rect_steal->width($width); + $rect_steal->height( $heights{steal} ); + $rect_steal->x($x); + $rect_steal->y($y); + + my $all = 100 - $cpuaverage->{idle}; + my $max_all = 0; + + $app->fill( $rect_idle, Loadbars::BLACK ); + $app->fill( $rect_steal, Loadbars::RED ); + $app->fill( $rect_guest, Loadbars::RED ); + $app->fill( $rect_irq, Loadbars::WHITE ); + $app->fill( $rect_softirq, Loadbars::WHITE ); + $app->fill( $rect_nice, Loadbars::GREEN ); + $app->fill( $rect_iowait, Loadbars::PURPLE ); + + my $add_x = 0; + my $rect_memused = get_rect $rects, "$host;memused"; + my $rect_memfree = get_rect $rects, "$host;memfree"; + my $rect_buffers = get_rect $rects, "$host;buffers"; + my $rect_cached = get_rect $rects, "$host;cached"; + my $rect_swapused = get_rect $rects, "$host;swapused"; + my $rect_swapfree = get_rect $rects, "$host;swapfree"; + + my %meminfo; + if ( $is_host_summary ) { + if ( $C{showmem} ) { + $add_x = $width + 1; + + my $ram_per = percentage $MEMSTATS{"$host;MemTotal"}, $MEMSTATS{"$host;MemFree"}; + my $swap_per = percentage $MEMSTATS{"$host;SwapTotal"}, $MEMSTATS{"$host;SwapFree"}; + + %meminfo = ( + ram_per => $ram_per, + swap_per => $swap_per, + ); + + my %heights = ( + MemFree => $ram_per * ( $C{height} / 100 ), + MemUsed => (100 - $ram_per) * ( $C{height} / 100 ), + SwapFree => $swap_per * ( $C{height} / 100 ), + SwapUsed => (100 - $swap_per) * ( $C{height} / 100 ), + ); + + my $half_width = $width / 2; + $y = $C{height} - $heights{MemUsed}; + $rect_memused->width($half_width); + $rect_memused->height( $heights{MemUsed} ); + $rect_memused->x($x+$add_x); + $rect_memused->y($y); + + $y -= $heights{MemFree}; + $rect_memfree->width($half_width); + $rect_memfree->height( $heights{MemFree} ); + $rect_memfree->x($x+$add_x); + $rect_memfree->y($y); + + $y = $C{height} - $heights{SwapUsed}; + $rect_swapused->width($half_width); + $rect_swapused->height( $heights{SwapUsed} ); + $rect_swapused->x($x+$add_x+$half_width); + $rect_swapused->y($y); + + $y -= $heights{SwapFree}; + $rect_swapfree->width($half_width); + $rect_swapfree->height( $heights{SwapFree} ); + $rect_swapfree->x($x+$add_x+$half_width); + $rect_swapfree->y($y); + + $app->fill( $rect_memused, Loadbars::DARK_GREY ); + $app->fill( $rect_memfree, Loadbars::BLACK ); + + $app->fill( $rect_swapused, Loadbars::GREY ); + $app->fill( $rect_swapfree, Loadbars::BLACK ); + } - $max_all = sum @{$cpumax} {qw(user system iowait irq softirq steal guest)}; + if ( $C{showcores} ) { + $current_corenum = 0; + $rect_separator = get_rect $rects, "$key;separator"; + $rect_separator->width(1); + $rect_separator->height( $C{height} ); + $rect_separator->x( $x - 1 ); + $rect_separator->y(0); + $app->fill( $rect_separator, Loadbars::GREY ); + } + } - $app->fill( $rect_peak, $max_all > Loadbars::USER_ORANGE ? Loadbars::ORANGE - : ( $max_all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); - } + if ( $C{extended} ) { + my %maxheights = map { + $_ => defined $cpumax->{$_} + ? $cpumax->{$_} * ( $C{height} / 100 ) + : 1 + } keys %$cpumax; + + $rect_peak = get_rect $rects, "$key;max"; + $rect_peak->width($width); + $rect_peak->height(1); + $rect_peak->x($x); + $rect_peak->y( $C{height} - $maxheights{system} - $maxheights{user} ); + + $max_all = sum @{$cpumax} {qw(user system iowait irq softirq steal guest)}; + + $app->fill( $rect_peak, $max_all > Loadbars::USER_ORANGE ? Loadbars::ORANGE + : ( $max_all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); + } - $app->fill( $rect_user, $all > Loadbars::USER_ORANGE ? Loadbars::ORANGE - : ( $all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); - $app->fill( $rect_system, $cpuaverage->{system} > Loadbars::SYSTEM_BLUE0 - ? Loadbars::BLUE0 : Loadbars::BLUE ); + $app->fill( $rect_user, $all > Loadbars::USER_ORANGE ? Loadbars::ORANGE + : ( $all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); + $app->fill( $rect_system, $cpuaverage->{system} > Loadbars::SYSTEM_BLUE0 + ? Loadbars::BLUE0 : Loadbars::BLUE ); - my ( $y, $space ) = ( 5, $font_height ); + my ( $y, $space ) = ( 5, $font_height ); - my @loadavg = split ';', $AVGSTATS{$host}; + my @loadavg = split ';', $AVGSTATS{$host}; - if ( $C{showtext} ) { - if ( $C{showmem} && $is_host_summary ) { - my $y_ = $y; - $app->print( $x+$add_x, $y_, 'Ram:'); - $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{ram_per})); - $app->print( $x+$add_x, $y_ += $space, 'Swp:'); - $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{swap_per})); - } - if ( $C{showtexthost} && $is_host_summary ) { - # If hostname is printed don't use FQDN - # because of its length. - $host =~ /([^\.]*)/; - $app->print( $x, $y, sprintf '%s:', $1 ); + if ( $C{showtext} ) { + if ( $C{showmem} && $is_host_summary ) { + my $y_ = $y; + $app->print( $x+$add_x, $y_, 'Ram:'); + $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{ram_per})); + $app->print( $x+$add_x, $y_ += $space, 'Swp:'); + $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{swap_per})); + } + if ( $C{showtexthost} && $is_host_summary ) { + # If hostname is printed don't use FQDN + # because of its length. + $host =~ /([^\.]*)/; + $app->print( $x, $y, sprintf '%s:', $1 ); - } - else { - $app->print( $x, $y, sprintf '%i:', $C{showcores} ? $current_corenum : $current_barnum + 1 ); - } + } + else { + $app->print( $x, $y, sprintf '%i:', $C{showcores} ? $current_corenum : $current_barnum + 1 ); + } - if ( $C{extended} ) { - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{steal}, 'st'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{guest}, 'gt'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{softirq}, 'sr'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{irq}, 'ir'); - } + if ( $C{extended} ) { + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{steal}, 'st'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{guest}, 'gt'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{softirq}, 'sr'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{irq}, 'ir'); + } - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{iowait}, 'io'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{iowait}, 'io'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{idle}, 'id') if $C{extended}; + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{idle}, 'id') if $C{extended}; - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{nice}, 'ni'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{user}, 'us'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{system}, 'sy'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $all, 'to'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{nice}, 'ni'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{user}, 'us'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{system}, 'sy'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $all, 'to'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $max_all, 'pk') if $C{extended}; + $app->print( $x, $y += $space, sprintf '%02d%s', norm $max_all, 'pk') if $C{extended}; - if ($is_host_summary) { + if ($is_host_summary) { if ( defined $loadavg[0] ) { $app->print( $x, $y += $space, 'Avg:' ); $app->print( $x, $y += $space, sprintf "%.2f", $loadavg[0]); @@ -992,6 +1006,7 @@ END }, quit_hot => { menupos => 16, cmd => 'q', help => 'Quits', mode => 1 }, + writeconfig_hot => { menupos => 16, cmd => 'w', help => 'Write config to config file', mode => 1 }, samples => { menupos => 17, |
