Created
April 10, 2020 11:25
-
-
Save JohnMertz/308766dd82b7fd64bedd3ccf39f448bc to your computer and use it in GitHub Desktop.
Intel backlight control script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl -w | |
# Files containing current and max brightness values | |
my $cur_file = "/sys/class/backlight/intel_backlight/brightness"; | |
my $max_file = "/sys/class/backlight/intel_backlight/max_brightness"; | |
# About (See help() for more): | |
# Script to read and write to the backlight brightness file. Allows for easy control of the backlight without a proper backlight daemon (eg. when logged in to a console). | |
# Requires ownership/permissions for the brightness file. This can be automatically acquired with the following SystemD Unit: | |
# blc@.service | |
# [Unit] | |
# Description=Give ownership of backlight to %I | |
# [Service] | |
# ExecStart=chown %i:%i /sys/class/backlight/intel_backlight/brightness | |
# [Install] | |
# WantedBy=multi-user.target | |
# Enable with: systemctl enable blc@user | |
sub to_percent { | |
my $value = shift; | |
if ($value eq "Permission Denied") { | |
return $value; | |
} else { | |
$value = int($value/get_max()*100); | |
return $value . '%'; | |
} | |
} | |
sub get_offset { | |
return int(get_max()/100); | |
} | |
sub get_current { | |
open(my $c,'<',"$cur_file"); | |
my $current = <$c>; | |
close $c; | |
chomp $current; | |
return $current; | |
} | |
sub get_max { | |
open(my $m,'<',"$max_file"); | |
my $max = <$m>; | |
close $m; | |
chomp $max; | |
return $max; | |
} | |
sub get_min { | |
return int((get_max()/100)+2); | |
} | |
sub writable { | |
if (! -w $cur_file) { | |
return 0; | |
} else { | |
return 1; | |
} | |
} | |
sub increment { | |
if (writable()) { | |
my $current = get_current(); | |
my $max = get_max(); | |
my $target = $current+get_offset(); | |
if ($target > $max) { | |
$target = $max; | |
} | |
open(my $c,'>',"$cur_file"); | |
print $c $target; | |
close $c; | |
return $target; | |
} else { | |
return "Permission Denied"; | |
} | |
} | |
sub decrement { | |
if (writable()) { | |
my $current = get_current(); | |
my $min = get_min(); | |
my $target = $current-get_offset(); | |
if ($target < $min) { | |
$target = $min; | |
} | |
open(my $c,'>',"$cur_file"); | |
print $c $target; | |
close $c; | |
return $target; | |
} else { | |
return "Permission Denied"; | |
} | |
} | |
sub set { | |
my $value = shift; | |
if (writable()) { | |
$current = get_current(); | |
if ($value > $current) { | |
for (my $i=$current;$i<=$value;$i++) { | |
open(my $c,'>',"$cur_file"); | |
print $c $i; | |
close $c; | |
} | |
} else { | |
for (my $i=$current;$i>=$value;$i--) { | |
open(my $c,'>',"$cur_file"); | |
print $c $i; | |
close $c; | |
} | |
} | |
return $value; | |
} else { | |
return "Permission Denied"; | |
} | |
} | |
sub help { | |
print " | |
Backlight Control | |
Usage: blc.pl [--silent|--notify] [OPTION] [VALUE] | |
With no option the backlight information is printed as JSON. | |
Output printed to STDOUT unless: | |
--silent Do not display output (overrides --notify) | |
--notify Send output to notification daemon. --notify=N will | |
change the display duration in ms. Default is 200ms | |
Output option must preceed the first Action option. | |
Actions: | |
= VALUE Set backlight to specific value. VALUE greater than | |
100 will be treated as absolute value. VALUE eqaul to | |
or less than 100 will be treated as a percentage | |
++ Increment by 1% | |
+= VALUE Increment by VALUE percent | |
-- Decrement by 1% | |
-= VALUE Decrement by VALUE percent | |
Actions corrected to 1% or 100% if over or under. All actions | |
provide output as a percentage, with the % symbol. | |
Final percentage printed as below, skipping other options. | |
Print: | |
== Print current absolute value | |
^ Print maximum absolute value | |
% Print current percentage (does not include % symbol) | |
--help Help (not impacted by --silent or --notify) | |
--HELP Advanced help (same as above) | |
Any other option will be printed literally"; | |
} | |
sub advanced { | |
$current = get_current(); | |
$max = get_max(); | |
print ". | |
Print functions can be strung together but command will exit | |
with the first non-print option. eg. | |
\$ blc.pl == / ^ | |
21/100 | |
\$ blc.pl == ++ | |
('==' ignored) | |
(Backlight incremented) | |
Escape options with \\ in quotes to display them literally. eg. | |
\$ blc.pl == / ^ '\\=' % \'\\%\' | |
" . $current . "/" . $max . "=" . int($current/$max*100) . "% | |
Only one \'\\' is removed per block. eg. | |
\$ blc.pl '\\% \\' | |
% \\ | |
"; | |
} | |
my $current = get_current(); | |
my (@output, $target, $silent, $notify); | |
if (scalar @ARGV) { | |
for (my $i=0;$i<scalar @ARGV;$i++) { | |
if ($ARGV[$i] eq '++') { | |
$target = increment(); | |
@output = to_percent($target); | |
last; | |
} elsif ($ARGV[$i] eq '+=') { | |
for (my $i=0;$i<scalar @ARGV;$i++) { | |
if ($ARGV[$i] eq '+=') { | |
if (defined $ARGV[($i+1)]) { | |
$count = $ARGV[($i+1)]; | |
for (my $j=0;$j<$count;$j++) { | |
$target = increment(); | |
if ($target eq "Permission Denied") { | |
last; | |
} | |
} | |
@output = to_percent($target); | |
} else { | |
@output = ("No value after $ARGV[$i]"); | |
} | |
last; | |
} | |
} | |
last; | |
} elsif ($ARGV[$i] eq '--') { | |
$target = decrement(); | |
@output = to_percent($target); | |
last; | |
} elsif ($ARGV[$i] eq '-=') { | |
for (my $i=0;$i<scalar @ARGV;$i++) { | |
if ($ARGV[$i] eq '-=') { | |
if (defined $ARGV[($i+1)]) { | |
$count = $ARGV[($i+1)]; | |
for (my $j=0;$j<$count;$j++) { | |
$target = decrement(); | |
if ($target eq "Permission Denied") { | |
last; | |
} | |
} | |
@output = to_percent($target); | |
} else { | |
@output = ("No value after $ARGV[$i]"); | |
} | |
last; | |
} | |
} | |
last; | |
} elsif ($ARGV[$i] eq '=') { | |
$target = $ARGV[($i+1)]; | |
if (defined $target) { | |
if ($target < 1) { | |
$target = set(get_min()); | |
} elsif ($target > get_max()) { | |
$target = set(get_max()); | |
} elsif ($target > 100) { | |
$target = set($target); | |
} else { | |
$target = set(int((get_max()*$target/100)+1)); | |
} | |
if ($target eq "Permission Denied") { | |
@output = $target; | |
} else { | |
@output = to_percent($target); | |
} | |
last; | |
} else { | |
@output = ("No value after $ARGV[$i]"); | |
last; | |
} | |
} elsif ($ARGV[$i] eq '%') { | |
push @output,int(get_current()/get_max()*100); | |
} elsif ($ARGV[$i] eq '^') { | |
push @output,get_max(); | |
} elsif ($ARGV[$i] eq '==') { | |
push @output,get_current(); | |
} elsif ($ARGV[$i] eq '--help') { | |
help(); | |
print " (see --HELP).\n\n"; | |
exit(); | |
} elsif ($ARGV[$i] eq '--HELP') { | |
help(); | |
advanced(); | |
exit(); | |
} elsif ($ARGV[$i] eq '--silent') { | |
$silent = 'TRUE'; | |
} elsif ($ARGV[$i] =~ /^--notify/) { | |
$notify = 'TRUE'; | |
if ($ARGV[$i] =~ /=[0-9]+$/) { | |
$duration = $ARGV[$i]; | |
$duration =~ s/.*=([0-9]+)/$1/; | |
} else { | |
$duration = 200; | |
} | |
} else { | |
my $add = $ARGV[$i]; | |
$add =~ s/\\//; | |
push @output,$add; | |
} | |
} | |
} else { | |
@output = ('{"Backlight":{"Max":"' . get_max() . '","Current":"' . get_current() . '","Percentage","' . int(get_current()/get_max()*100) . '%"}}'); | |
} | |
if ($silent) { | |
exit(); | |
} elsif ($notify) { | |
my $concat; | |
foreach (@output) { | |
$concat .= $_; | |
} | |
system "notify-send --urgency=normal -i xfpm-brightness-lcd -t $duration \"$concat\""; | |
exit(); | |
} else { | |
print foreach @output; | |
print "\n"; | |
exit(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment