diff options
Diffstat (limited to 'scripts/reorder.pl')
| -rw-r--r-- | scripts/reorder.pl | 150 | 
1 files changed, 150 insertions, 0 deletions
| diff --git a/scripts/reorder.pl b/scripts/reorder.pl new file mode 100644 index 0000000..7bec6b8 --- /dev/null +++ b/scripts/reorder.pl @@ -0,0 +1,150 @@ +# Save window layout to an arbitrary file and load layouts upon demand
 +# Useful for being able to temporarily reorder your windows and then reverting to your "normal" layout
 +# Also useful as an easy way to reorder your windows
 +#
 +# A special thanks to billnye, Zed` and Bazerka for their help
 +#
 +# Usage:
 +#  /layout_save filename
 +#    Saves the layout to the textfile "filename.layout"
 +#  /layout_load filename
 +#    Loads the layout from the textfile "filename.layout"
 +#  /set layout_savepath path
 +#    Use to set a default path for layouts
 +#
 +# TODO:
 +#   Check the layout file for a number used twice
 +#
 +
 +use strict;
 +use Irssi;
 +use Data::Dumper;
 +use vars qw($VERSION %IRSSI);
 +
 +%IRSSI = (
 +	authors     => "Isaac G",
 +	contact     => "irssi\@isaac.otherinbox.com",
 +	name        => "reorder",
 +	description => "Reordering windows based on a textfile.",
 +	license     => "GPL",
 +);
 +
 +sub doFilenameFixing
 +{
 +	my ($filename) = @_;
 +	unless ($filename)
 +	{
 +		print "No filename specified!";
 +		return;
 +	}
 +
 +	$filename = glob($filename);
 +
 +	if ($filename =~ /\//)
 +	{
 +		unless ($filename =~ /^\//)
 +		{
 +			print "I don't like /'s in filenames. Unless you want to specify an absolute path.";
 +			return;
 +		}
 +		# Let it go?
 +	}
 +
 +	$filename .= '.layout' unless ($filename =~ /.layout$/);
 +
 +	my $path = Irssi::settings_get_str('layout_savepath');
 +	$path .= '/' unless ($path =~ /\/$/);
 +	$filename = $path . $filename unless ($filename =~ /\//);
 +
 +	return $filename;
 +}
 +
 +sub canReadFile
 +{
 +	my ($filename) = @_;
 +	unless (-f $filename)
 +	{
 +		print "No such file $filename";
 +		return;
 +	}
 +	unless (-r $filename)
 +	{
 +		print "Can not read file $filename";
 +		return;
 +	}
 +	return 1;
 +}
 +
 +# Save a list of refnum and window info to file
 +sub cmd_layout_save
 +{
 +	my ($filename, $data, $more) = @_;
 +	my $FH;
 +
 +	$filename = doFilenameFixing($filename);
 +	return unless ($filename);
 +
 +	unless(open $FH, ">", $filename)
 +	{
 +		print "Can not open $filename";
 +		return;
 +	}
 +
 +	# Order by ref. Print ref and an id tag
 +	for my $win (sort {$a->{'refnum'} <=> $b->{'refnum'}} Irssi::windows())
 +	{
 +		my $id = $win->{'name'} ? $win->{'name'} : $win->{'active'}->{'name'} . ":" . $win->{'active'}->{'server'}->{'tag'};
 +		printf $FH "%d\t%s\n", $win->{'refnum'}, $id;
 +	}
 +	close $FH;
 +	print "Layout saved to $filename";
 +}
 +
 +# Load a list and use it to reorder
 +sub cmd_layout_load
 +{
 +	# Check filename supplied, exists and readable
 +	my ($filename, $data, $more) = @_;
 +	$filename = doFilenameFixing($filename);
 +	return unless ($filename);
 +
 +	return unless canReadFile($filename);
 +
 +	my @layout;
 +	my ($ref, $id, $FH);
 +
 +	# Pull the refnum and id
 +	unless(open $FH, "<", $filename)
 +	{
 +		print "Can not open file $filename.";
 +		return;
 +	}
 +	while (my $line = <$FH>)
 +	{
 +		chomp $line;
 +		my ($ref, $id) = split(/\t/, $line, 2);
 +		next unless ($ref and $id);
 +
 +		push @layout, {refnum => $ref, id => $id};
 +	}
 +	close $FH;
 +
 +	# For each layout item from the file, find the window and set it's ref to that number
 +	for my $position (sort {$a->{'refnum'} <=> $b->{'refnum'}} @layout)
 +	{
 +		for my $win (Irssi::windows())
 +		{
 +			$id = $win->{'name'} ? $win->{'name'} : $win->{'active'}->{'name'} . ":" . $win->{'active'}->{'server'}->{'tag'};
 +			if ($id eq $position->{'id'})
 +			{
 +				$win->set_refnum($position->{'refnum'});
 +				last;
 +			}
 +		}
 +	}
 +}
 +
 +Irssi::settings_add_str('misc', 'layout_savepath', Irssi::get_irssi_dir());
 +
 +Irssi::command_bind( 'layout_save', 'cmd_layout_save' );
 +Irssi::command_bind( 'layout_load', 'cmd_layout_load' );
\ No newline at end of file | 
