#!/usr/bin/env perl # $Source: /home/keck/gen/RCS/xscreens,v $ # $Revision: 4.9 $$Date: 2007/07/05 13:58:21 $ # Contents # 1 standard 3 args 5 output 7 pod # 2 Data::Dumper 4 screen 6 notes # ---------------------------------------------------------------------- #1# standard use strict; use warnings; (my $cmd = "$0") =~ s%.*/%%; sub usage { print "Usage: $cmd -help\n"; } sub quit { (@_) ? print STDERR "$cmd quitting: @_\n" : &usage; exit 1 } require X11::Screens; sub perldoc { my ($perldoc, $less); for (split /:/, $ENV{PATH}) { $perldoc = "$_/perldoc" if -x "$_/perldoc"; last if $perldoc; next if $less; $less = "$_/less" if -x "$_/less"; } if ($perldoc) { $ENV{LESSCHARSET} = 'latin1'; exec $perldoc, $0 } elsif ($less) { exec $less, '+/^# Sorry.*', $0 } else { print "Sorry, there's no perldoc(1) or even less(1) in your \$PATH\n" . "The documentation can be found at the end of $0\n"; exit 1 } } # ---------------------------------------------------------------------- #2# Data::Dumper use Data::Dumper; $Data::Dumper::Terse = 1; $Data::Dumper::Indent = 1; $Data::Dumper::Quotekeys = 0; $Data::Dumper::Sortkeys = sub { my @grep_v = sort grep !/^(tkmain|screens)$/, keys %{$_[0]}; \@grep_v; }; # ---------------------------------------------------------------------- #3# args my $current; my %given; while (@ARGV) { $_ = shift; perldoc() if /^-+(man|help)/; $current = 1, next if /^-c/; $given{$1} = shift, next if /^-+(.+)/; unshift @ARGV, $_; last; } quit("neither -c nor any -key given") unless $current || %given; # ---------------------------------------------------------------------- #4# screen my $screen; if ($current) { $screen = X11::Screens->current || X11::Screen->current; } else { my $screens = X11::Screens->new; my @screens = $screens->match_tight(%given); my $x = @screens; quit( 'more than 1 screen matches ' . join ', ', map { "$_ => $given{$_}" } sort keys %given ) if @screens > 1; $screen = $screens[0]; } # ---------------------------------------------------------------------- #5# output print(Dumper $screen) unless @ARGV; my $status = 0; for my $arg (@ARGV) { my @wanted = split /\./, $arg; my $value = $screen; my $sofar; # for errors for (@wanted) { $value = $value->{$_}; $sofar .= defined $sofar ? ".$_" : $_; $status = 1, $value = '', print(STDERR "'$sofar' undefined"), last unless defined $value; } print ref $value ? Dumper $value : "$value\n"; } exit $status; __END__ # ---------------------------------------------------------------------- #6# notes # +xwin/config # +perl/tk # 1.x # XX86 # wrote this having forgotten gen/screensize ... deleted latter # wish # just outputs screensize # +xwin/config # 2.1 # rewritten in perl, using new Xwin.pm # outputs parts of .xwin as well as just screensize # 2.2 # -a & -A # 2.3 # console instead of init, depth # 2.4 # console fixed, unicode # 3.1 # renamed this from xwin to screen # renamed .xwin to .screens # renamed Xwin.pm to Screen.pm # XXII128 # 3.3 [RCS] # added SCREEN # 3.6 # added -c (current display) # 3.10 # added managers.chars to usage # xterms.4 for my-init-texmacs.scm # 3.12 # texmacs.a etc for my-init-texmacs.scm # 3.13 # added 'xterms.' and 'texmacs.' for my-init-texmacs.scm # 3.17 # strict & warnings # 4.1 # renamed from screen to screens # uses Screens.pm rather than Screen.pm # +xwin/config3 # ---------------------------------------------------------------------- #7# pod # Sorry, there's no perldoc in your $PATH, so here's the raw pod =head1 NAME xscreens - wrapper round X11::Screens =head1 SYNOPSIS xscreens -c key1 ... xscreens -key1 value1 key2 ... xscreens -key1 value1 -key2 value2 key3 ... xscreens -c name clients.a.geometry =head1 DESCRIPTION The flag (-xxx) arguments specify a screen from ~/.xscreens. The other arguments specify what information for this screen is to be output (stdout). In their absence all information about the screen is output. Both kinds of arguments can contain dots which separate keys. If a value is a reference then it's output via Data::Dumper. Otherwise it's output directly, followed by a newline. Nonexistent values are output as empty strings, & a warning written to stderr. =head1 SEE ALSO X11::Screens(3), xchar(1) =head1 AUTHOR Brian Keck Ebwkeck@gmail.comE =head1 VERSION $Source: /home/keck/gen/RCS/xscreens,v $ $Revision: 4.9 $ $Date: 2007/07/05 13:58:21 $ xchar 0.2 =cut