I made a small program to display a X::Osd bar displaying my volume
percentage (on GNU/Linux box). It works, but I'd like to have any suggestions or
corrections about it (i'm not confident about my skills i suppose).

So, here is how it works:
1) Have a named pipe defined at $OSD_VOLUME environmental variable.
2) Run the program in the background.
3) When echoing 'up', 'down' or 'toggle' in the named pipe, it raises,
   lowers or toggles mute state using amixer program.

I have the following questions:
1) Is the code OK? (I mean is there anything I should avoid or add?)
2) Is there a better solution to make a perl program and a shell script
   and/or window manager communicate? (I really didn't love that named
   pipe solution, but I didn't know of anything else)

Enough words, here is the code:

#!/usr/bin/perl

use strict;
use warnings;
# extra modules
use X::Osd;

# create osd bar (two output lines)
my $osd = X::Osd->new(2);
# osd bar properties
$osd->set_font("-*-terminus-bold-*-*-*-18-*-*-*-*-*-*-*");
$osd->set_shadow_offset(1);
$osd->set_pos(XOSD_bottom);
$osd->set_align(XOSD_center);
$osd->set_horizontal_offset(0);
$osd->set_vertical_offset(30);
$osd->set_timeout(5);

# locate (and if missing create) named pipe
my $fifo_file = (defined $ENV{OSD_VOLUME}) ? $ENV{OSD_VOLUME} : 
glob("~/.osd-volume.fifo");
unless (-p $fifo_file) {
    # delete non-named pipe file (risky)
    unlink $fifo_file or die "cannot remove $fifo_file: $!";
    # create the named pipe
    require POSIX;
    POSIX::mkfifo($fifo_file, 0600) or die "cannot mkfifo $fifo_file: $!";
}

# open named pipe
open(FIFO, "+<", $fifo_file) or die "cannot open $fifo_file: $!";
# constantly read from it
my $vol;
while (chomp(my $fifo_line = <FIFO>)) {
    if ($fifo_line eq 'up') {
        $vol = '3%+';
    } elsif ($fifo_line eq 'down') {
        $vol = '3%-';
    } elsif ($fifo_line eq 'toggle') {
        $vol = 'toggle';
    } else {
        die "invalid input: $fifo_line";
    }
    # set new volume value and read the output
    my $amixer = `amixer sset Master,0 $vol` or die "error: $!";
    # get new volume value
    $vol = $1 if ($amixer =~ m/(\d{1,3})(?:%)/);
    # change output color if volume is muted
    if ($amixer =~ m/\[off\]/) {
        $osd->set_colour("#DD0000");
    } else {
        $osd->set_colour("#1E90FF");
    }
    # print volume bar
    $osd->string(0, 'Master Volume:'.$vol.'%');
    $osd->percentage(1, $vol);
}
# close pipe and exit (with error)
# (impossible to get here)
close(FIFO);
exit(0);


-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to