1#!/usr/local/bin/perl
2#
3#    $Id: chansort.pl,v 1.4 2004/11/02 22:52:33 peder Exp $
4#
5# Copyright (C) 2004 by Peder Stray <peder@gzip.ninja.no>
6#
7
8use strict;
9use Irssi;
10use Irssi::Irc;
11
12# ======[ Script Header ]===============================================
13
14use vars qw{$VERSION %IRSSI};
15($VERSION) = '$Revision: 1.4 $' =~ / (\d+\.\d+) /;
16%IRSSI = (
17          name        => 'chansort',
18          authors     => 'Peder Stray',
19          contact     => 'peder@ninja.no',
20          url         => 'http://ninja.no/irssi/chansort.pl',
21          license     => 'GPL',
22          description => 'Sort all channel and query windows',
23         );
24
25# ======[ Hooks ]=======================================================
26
27# --------[ sig_sort_trigger ]------------------------------------------
28
29sub sig_sort_trigger {
30    return unless Irssi::settings_get_bool('chansort_autosort');
31    cmd_chansort();
32}
33
34# ======[ Commands ]====================================================
35
36# --------[ CHANSORT ]--------------------------------------------------
37
38# Usage: /CHANSORT
39sub cmd_chansort {
40    my(@windows);
41    my($minwin);
42
43    for my $win (Irssi::windows()) {
44	my $act = $win->{active};
45	my $key;
46
47	if ($act->{type} eq 'CHANNEL') {
48	    $key = "C".$act->{server}{tag}.' '.substr($act->{visible_name}, 1);
49	}
50	elsif ($act->{type} eq 'QUERY') {
51	    $key = "Q".$act->{server}{tag}.' '.$act->{visible_name};
52	}
53	else {
54	    next;
55	}
56	if (!defined($minwin) || $minwin > $win->{refnum}) {
57	    $minwin = $win->{refnum};
58	}
59	push @windows, [ lc $key, $win ];
60
61    }
62
63    for (sort {$a->[0] cmp $b->[0]} @windows) {
64	my($key,$win) = @$_;
65	my($act) = $win->{active};
66
67#	printf("win[%d->%d]: t[%s] [%s] [%s] {%s}\n",
68#	       $win->{refnum},
69#	       $minwin,
70#	       $act->{type},
71#	       $act->{visible_name},
72#	       $act->{server}{tag},
73#	       $key,
74#	      );
75
76	$win->command("window move $minwin");
77	$minwin++;
78    }
79}
80
81# ======[ Setup ]=======================================================
82
83# --------[ Register commands ]-----------------------------------------
84
85Irssi::command_bind('chansort', 'cmd_chansort');
86
87# --------[ Register settings ]-----------------------------------------
88
89Irssi::settings_add_bool('chansort', 'chansort_autosort', 0);
90
91# --------[ Register signals ]------------------------------------------
92
93Irssi::signal_add_last('window item name changed', 'sig_sort_trigger');
94Irssi::signal_add_last('channel created', 'sig_sort_trigger');
95Irssi::signal_add_last('query created', 'sig_sort_trigger');
96
97# ======[ END ]=========================================================
98
99# Local Variables:
100# header-initial-hide: t
101# mode: header-minor
102# end:
103
104