-
Notifications
You must be signed in to change notification settings - Fork 235
/
reorder.pl
161 lines (140 loc) · 4.2 KB
/
reorder.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# 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"
#
# TODO:
# Check the layout file for a number used twice
# On script load, run a layout_load
# On channel join, run load: channel joined
#
use strict;
use Irssi;
use Data::Dumper;
use vars qw($VERSION %IRSSI);
use POSIX 'strftime';
%IRSSI = (
authors => "Isaac Good",
contact => "irssi\@isaacgood.com",
name => "reorder",
description => "Reordering windows based on a textfile.",
license => "GPL",
);
$VERSION = '1.0';
# Map user input to a valid filename
sub GetFilename
{
my ($filename) = @_;
# On no input, use a default filename.
unless (length($filename))
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$filename = POSIX::strftime("%y%m%d", $sec, $min, $hour, $mday, $mon, $year);
# If you prefer not having datestamped filenames, uncomment:
# $filename = "default";
}
# Use glob expansion to match things like ~/
my $glob = glob($filename);
$filename = $glob if $glob;
# Only handle directories when using an absolute path.
if ($filename =~ /\// and $filename !~ /^\//)
{
print "I don't like /'s in filenames. Unless you want to specify an absolute path.";
return;
}
# Add a file extension
$filename .= '.layout' unless ($filename =~ /\.layout$/);
# Use get_irssi_dir() unless using an absolute path
if ($filename !~ /\//) {
my $path = Irssi::get_irssi_dir();
$path .= '/' unless ($path =~ /\/$/);
$filename = $path . $filename;
}
return $filename;
}
# Check a filename exists and can be read.
sub CanReadFile
{
my ($filename) = @_;
unless (-f $filename)
{
print "No such file $filename";
return 0;
}
unless (-r $filename)
{
print "Can not read file $filename";
return 0;
}
return 1;
}
# Save the current layout to file
sub CmdLayoutSave
{
my ($filename, $data, $more) = @_;
my $FH;
$filename = GetFilename($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'};
my $tag = $win->{'active'}->{'server'}->{'tag'};
printf $FH "%d\t%s:%s\n", $win->{'refnum'}, $id, $tag;
}
close $FH;
print "Layout saved to $filename";
}
# Load a list and use it to reorder
sub CmdLayoutLoad
{
my ($filename, $data, $more) = @_;
$filename = GetFilename($filename);
return unless ($filename);
return unless CanReadFile($filename);
my @layout;
my ($ref, $id, $tag, $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'};
$tag = $win->{'active'}->{'server'}->{'tag'};
$id .= ":" . $tag;
if ($id eq $position->{'id'})
{
$win->set_refnum($position->{'refnum'});
last;
}
}
}
}
Irssi::command_bind( 'layout_save', 'CmdLayoutSave' );
Irssi::command_bind( 'layout_load', 'CmdLayoutLoad' );