summaryrefslogtreecommitdiffstats
path: root/scripts/reorder.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/reorder.pl')
-rw-r--r--scripts/reorder.pl150
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