annotate irssi/scripts/adv_windowlist.pl @ 148:4e92ca6c779a

add irssi conf
author zegervdv <zegervdv@me.com>
date Sat, 18 Oct 2014 10:06:58 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
148
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1 use strict; # use warnings;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
3 # {{{ debug
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
4
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
5 #BEGIN {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
6 # open STDERR, '>', '/home/ailin/wlstatwarnings';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
7 #};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
8
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
9 # FIXME COULD SOMEONE PLEASE TELL ME HOW TO SHUT UP
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
10 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
11 # ...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
12 # Variable "*" will not stay shared at (eval *) line *.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
13 # Variable "*" will not stay shared at (eval *) line *.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
14 # ...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
15 # Can't locate package Irssi::Nick for @Irssi::Irc::Nick::ISA at (eval *) line *.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
16 # ...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
17 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
18 # THANKS
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
19
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
20 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
21
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
22 # if you don't know how to operate folds, type zn
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
23
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
24 # {{{ header
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
25
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
26 use Irssi (); # which is the minimum required version of Irssi ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
27 use Irssi::TextUI;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
28
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
29 use vars qw($VERSION %IRSSI);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
30
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
31 $VERSION = '0.6ca';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
32 %IRSSI = (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
33 original_authors => q(BC-bd, Veli, Timo Sirainen, ).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
34 q(Wouter Coekaerts, Jean-Yves Lefort), # (decadix)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
35 original_contact => q([email protected], [email protected], [email protected], ).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
36 q([email protected], [email protected]),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
37 authors => q(Nei),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
38 contact => q(Nei @ [email protected]),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
39 url => "http://anti.teamidiot.de/",
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
40 name => q(awl),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
41 description => q(Adds a permanent advanced window list on the right or ).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
42 q(in a statusbar.),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
43 description2 => q(Based on chanact.pl which was apparently based on ).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
44 q(lightbar.c and nicklist.pl with various other ideas ).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
45 q(from random scripts.),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
46 license => q(GNU GPLv2 or later),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
47 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
48
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
49 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
50
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
51 # {{{ *** D O C U M E N T A T I O N ***
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
52
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
53 # adapted by Nei
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
54
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
55 ###############
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
56 # {{{ original comment
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
57 # ###########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
58 # # Adds new powerful and customizable [Act: ...] item (chanelnames,modes,alias).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
59 # # Lets you give alias characters to windows so that you can select those with
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
60 # # meta-<char>.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
61 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
62 # # for irssi 0.8.2 by [email protected]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
63 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
64 # # inspired by chanlist.pl by '[email protected]'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
65 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
66 # #########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
67 # # {{{ Contributors
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
68 # #########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
69 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
70 # # [email protected] /window_alias code
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
71 # # [email protected] chanact_abbreviate_names
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
72 # # [email protected] Extra chanact_show_mode and chanact_chop_status
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
73 # # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
74 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
75 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
76 # {{{ FURTHER THANKS TO
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
77 # ############
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
78 # # buu, fxn, Somni, Khisanth, integral, tybalt89 for much support in any aspect perl
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
79 # # and the channel in general ( #perl @ freenode ) and especially the ir_* functions
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
80 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
81 # # Valentin 'senneth' Batz ( [email protected] ) for the pointer to grep.pl, continuous support
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
82 # # and help in digging up ir_strip_codes
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
83 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
84 # # OnetrixNET technology networks for the debian environment
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
85 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
86 # # Monkey-Pirate.com / Spaceman Spiff for the webspace
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
87 # #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
88 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
89
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
90 ######
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
91 # {{{ M A I N P R O B L E M
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
92 #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
93 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
94 # It is impossible to place the awl on a statusbar together with other items,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
95 # because I do not know how to calculate the size that it is going to get
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
96 # granted, and therefore I cannot do the linebreaks properly.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
97 # This is what is missing to make a nice script out of awl.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
98 # If you have any ideas, please contact me ASAP :).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
99 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
100 ######
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
101
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
102 ######
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
103 # {{{ UTF-8 PROBLEM
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
104 #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
105 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
106 # Please help me find a solution to this:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
107 # this be your statusbar, it is using up the maximum term size
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
108 # [[1=1]#abc [2=2]#defghi]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
109 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
110 # now consider this example:i
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
111 # "ascii" characters are marked with ., utf-8 characters with *
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
112 # [[1=1]#... [2=2]#...***]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
113 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
114 # you should think that this is how it would be displayed? WRONG!
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
115 # [[1=1]#... [2=2]#...*** ]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
116 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
117 # this is what Irssi does.. I believe my length calculating code to be correct,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
118 # however, I'd love to be proven wrong (or receive any other fix, too, of
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
119 # course!)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
120 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
121 ######
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
122
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
123 #########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
124 # {{{ USAGE
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
125 ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
126 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
127 # copy the script to ~/.irssi/scripts/
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
128 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
129 # In irssi:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
130 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
131 # /script load awl
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
132 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
133 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
134 # Hint: to get rid of the old [Act:] display
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
135 # /statusbar window remove act
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
136 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
137 # to get it back:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
138 # /statusbar window add -after lag -priority 10 act
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
139 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
140 ##########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
141 # {{{ OPTIONS
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
142 ########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
143 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
144 # {{{ /set awl_display_nokey <string>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
145 # /set awl_display_key <string>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
146 # /set awl_display_nokey_active <string>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
147 # /set awl_display_key_active <string>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
148 # * string : Format String for one window. The following $'s are expanded:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
149 # $C : Name
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
150 # $N : Number of the Window
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
151 # $Q : meta-Keymap
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
152 # $H : Start highlighting
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
153 # $S : Stop highlighting
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
154 # /+++++++++++++++++++++++++++++++++,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
155 # | **** I M P O R T A N T : **** |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
156 # | |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
157 # | don't forget to use $S if you |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
158 # | used $H before! |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
159 # | |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
160 # '+++++++++++++++++++++++++++++++++/
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
161 # XXX NOTE ON *_active: there is a BUG somewhere in the length
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
162 # XXX calculation. currently it's best to NOT remove $H/$S from those
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
163 # XXX settings if you use it in the non-active settings.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
164 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
165 # {{{ /set awl_separator <string>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
166 # * string : Charater to use between the channel entries
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
167 # you'll need to escape " " space and "$" like this:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
168 # "/set awl_separator \ "
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
169 # "/set awl_separator \$"
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
170 # and {}% like this:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
171 # "/set awl_separator %{"
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
172 # "/set awl_separator %}"
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
173 # "/set awl_separator %%"
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
174 # (reason being, that the separator is used inside a {format })
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
175 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
176 # {{{ /set awl_prefer_name <ON|OFF>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
177 # * this setting decides whether awl will use the active_name (OFF) or the
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
178 # window name as the name/caption in awl_display_*.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
179 # That way you can rename windows using /window name myownname.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
180 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
181 # {{{ /set awl_hide_data <num>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
182 # * num : hide the window if its data_level is below num
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
183 # set it to 0 to basically disable this feature,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
184 # 1 if you don't want windows without activity to be shown
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
185 # 2 to show only those windows with channel text or hilight
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
186 # 3 to show only windows with hilight
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
187 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
188 # {{{ /set awl_maxlines <num>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
189 # * num : number of lines to use for the window list (0 to disable, negative
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
190 # lock)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
191 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
192 # {{{ /set awl_columns <num>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
193 # * num : number of columns to use in screen mode (0 for unlimited)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
194 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
195 # {{{ /set awl_block <num>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
196 # * num : width of a column in screen mode (negative values = block display)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
197 # /+++++++++++++++++++++++++++++++++,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
198 # | ****** W A R N I N G ! ****** |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
199 # | |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
200 # | If your block display looks |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
201 # | DISTORTED, you need to add the |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
202 # | following line to your .theme |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
203 # | file under |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
204 # | abstracts = { : |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
205 # | |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
206 # | sb_act_none = "%n$*"; |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
207 # | |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
208 # '+++++++++++++++++++++++++++++++++/
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
209 #.02:08:26. < shi> Irssi::current_theme()->get_format <.. can this be used?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
210 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
211 # {{{ /set awl_sbar_maxlength <ON|OFF>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
212 # * if you enable the maxlength setting, the block width will be used as a
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
213 # maximum length for the non-block statusbar mode too.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
214 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
215 # {{{ /set awl_height_adjust <num>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
216 # * num : how many lines to leave empty in screen mode
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
217 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
218 # {{{ /set awl_sort <-data_level|-last_line|refnum>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
219 # * you can change the window sort order with this variable
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
220 # -data_level : sort windows with hilight first
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
221 # -last_line : sort windows in order of activity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
222 # refnum : sort windows by window number
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
223 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
224 # {{{ /set awl_placement <top|bottom>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
225 # /set awl_position <num>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
226 # * these settings correspond to /statusbar because awl will create
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
227 # statusbars for you
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
228 # (see /help statusbar to learn more)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
229 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
230 # {{{ /set awl_all_disable <ON|OFF>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
231 # * if you set awl_all_disable to ON, awl will also remove the
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
232 # last statusbar it created if it is empty.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
233 # As you might guess, this only makes sense with awl_hide_data > 0 ;)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
234 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
235 # {{{ /set awl_automode <sbar|screen|emulate_lightbar>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
236 # * this setting defines whether the window list is shown in statusbars or
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
237 # whether the screen hack is used (from nicklist.pl)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
238 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
239 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
240 ##########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
241 # {{{ COMMANDS
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
242 ########
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
243 # {{{ /awl paste <ON|OFF|TOGGLE>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
244 # * enables or disables the screen hack windowlist. This is useful when you
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
245 # want to mark & copy text that you want to paste somewhere (hence the
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
246 # name). (ON means AWL disabled!)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
247 # This is nicely bound to a function key for example.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
248 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
249 # {{{ /awl redraw
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
250 # * redraws the screen hack windowlist. There are many occasions where the
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
251 # screen hack windowlist can get destroyed so you can use this command to
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
252 # fix it.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
253 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
254 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
255 ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
256 # {{{ WISHES
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
257 ####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
258 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
259 # if you fiddle with my mess, provide me with your fixes so I can benefit as well
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
260 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
261 # Nei =^.^= ( [email protected] )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
262 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
263
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
264 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
265
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
266 # {{{ modules
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
267
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
268 #use Class::Classless;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
269 #use Term::Info;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
270
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
271 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
272
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
273 # {{{ global variables
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
274
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
275 my $replaces = '[=]'; # AARGH!!! (chars that are always surrounded by weird
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
276 # colour codes by Irssi)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
277
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
278 my $actString = []; # statusbar texts
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
279 my $currentLines = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
280 my $resetNeeded; # layout/screen has changed, redo everything
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
281 my $needRemake; # "normal" changes
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
282 #my $callcount = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
283 sub GLOB_QUEUE_TIMER () { 100 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
284 my $globTime = undef; # timer to limit remake() calls
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
285
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
286
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
287 my $SCREEN_MODE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
288 my $DISABLE_SCREEN_TEMP;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
289 my $currentColumns = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
290 my $screenResizing;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
291 my ($screenHeight, $screenWidth);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
292 my $screenansi = bless {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
293 NAME => 'Screen::ANSI',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
294 PARENTS => [],
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
295 METHODS => {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
296 dcs => sub { "\033P" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
297 st => sub { "\033\\"},
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
298 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
299 }, 'Class::Classless::X';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
300 #my $terminfo = new Term::Info 'xterm'; # xterm here, make this modular
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
301 # {{{{{{{{{{{{{{{
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
302 my $terminfo = bless { # xterm here, make this modular
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
303 NAME => 'Term::Info::xterm',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
304 PARENTS => [],
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
305 METHODS => {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
306 # civis=\E[?25l,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
307 civis => sub { "\033[?25l" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
308 # sc=\E7,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
309 sc => sub { "\0337" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
310 # cup=\E[%i%p1%d;%p2%dH,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
311 cup => sub { shift;shift; "\033[" . ($_[0] + 1) . ';' . ($_[1] + 1) . 'H' },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
312 # el=\E[K,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
313 el => sub { "\033[K" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
314 # rc=\E8,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
315 rc => sub { "\0338" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
316 # cnorm=\E[?25h,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
317 cnorm => sub { "\033[?25h" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
318 # setab=\E[4%p1%dm,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
319 setab => sub { shift;shift; "\033[4" . $_[0] . 'm' },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
320 # setaf=\E[3%p1%dm,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
321 setaf => sub { shift;shift; "\033[3" . $_[0] . 'm' },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
322 # bold=\E[1m,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
323 bold => sub { "\033[1m" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
324 # blink=\E[5m,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
325 blink => sub { "\033[5m" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
326 # rev=\E[7m,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
327 rev => sub { "\033[7m" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
328 # op=\E[39;49m,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
329 op => sub { "\033[39;49m" },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
330 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
331 }, 'Class::Classless::X';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
332 # }}}}}}}}}}}}}}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
333
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
334
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
335 sub setc () {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
336 $IRSSI{'name'}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
337 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
338 sub set ($) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
339 setc . '_' . shift
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
340 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
341
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
342 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
343
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
344
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
345 # {{{ sbar mode
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
346
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
347 my %statusbars; # currently active statusbars
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
348
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
349 # maybe I should just tie the array ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
350 sub add_statusbar {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
351 for (@_) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
352 # add subs
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
353 for my $l ($_) { {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
354 no strict 'refs'; # :P
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
355 *{set$l} = sub { awl($l, @_) };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
356 }; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
357 Irssi::command('statusbar ' . (set$_) . ' reset');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
358 Irssi::command('statusbar ' . (set$_) . ' enable');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
359 if (lc Irssi::settings_get_str(set 'placement') eq 'top') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
360 Irssi::command('statusbar ' . (set$_) . ' placement top');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
361 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
362 if ((my $x = int Irssi::settings_get_int(set 'position')) != 0) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
363 Irssi::command('statusbar ' . (set$_) . ' position ' . $x);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
364 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
365 Irssi::command('statusbar ' . (set$_) . ' add -priority 100 -alignment left barstart');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
366 Irssi::command('statusbar ' . (set$_) . ' add ' . (set$_));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
367 Irssi::command('statusbar ' . (set$_) . ' add -priority 100 -alignment right barend');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
368 Irssi::command('statusbar ' . (set$_) . ' disable');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
369 Irssi::statusbar_item_register(set$_, '$0', set$_);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
370 $statusbars{$_} = {};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
371 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
372 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
373
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
374 sub remove_statusbar {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
375 for (@_) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
376 Irssi::command('statusbar ' . (set$_) . ' reset');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
377 Irssi::statusbar_item_unregister(set$_); # XXX does this actually work ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
378 # DO NOT REMOVE the sub before you have unregistered it :))
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
379 for my $l ($_) { {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
380 no strict 'refs';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
381 undef &{set$l};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
382 }; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
383 delete $statusbars{$_};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
384 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
385 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
386
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
387 sub syncLines {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
388 my $temp = $currentLines;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
389 $currentLines = @$actString;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
390 #Irssi::print("current lines: $temp new lines: $currentLines");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
391 my $currMaxLines = Irssi::settings_get_int(set 'maxlines');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
392 if ($currMaxLines > 0 and @$actString > $currMaxLines) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
393 $currentLines = $currMaxLines;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
394 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
395 elsif ($currMaxLines < 0) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
396 $currentLines = abs($currMaxLines);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
397 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
398 return if ($temp == $currentLines);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
399 if ($currentLines > $temp) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
400 for ($temp .. ($currentLines - 1)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
401 add_statusbar($_);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
402 Irssi::command('statusbar ' . (set$_) . ' enable');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
403 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
404 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
405 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
406 for ($_ = ($temp - 1); $_ >= $currentLines; $_--) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
407 Irssi::command('statusbar ' . (set$_) . ' disable');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
408 remove_statusbar($_);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
409 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
410 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
411 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
412
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
413 # FIXME implement $get_size_only check, and user $item->{min|max-size} ??
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
414 sub awl {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
415 my ($line, $item, $get_size_only) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
416
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
417 if ($needRemake) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
418 $needRemake = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
419 remake();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
420 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
421
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
422 my $text = $actString->[$line]; # DO NOT set the actual $actString->[$line] to '' here or
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
423 $text = '' unless defined $text; # you'll screw up the statusbar counter ($currentLines)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
424 $item->default_handler($get_size_only, $text, '', 1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
425 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
426
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
427 # remove old statusbars
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
428 my %killBar;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
429 sub get_old_status {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
430 my ($textDest, $cont, $cont_stripped) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
431 if ($textDest->{'level'} == 524288 and $textDest->{'target'} eq ''
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
432 and !defined($textDest->{'server'})
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
433 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
434 my $name = quotemeta(set '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
435 if ($cont_stripped =~ m/^$name(\d+)\s/) { $killBar{$1} = {}; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
436 Irssi::signal_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
437 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
438 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
439 sub killOldStatus {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
440 %killBar = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
441 Irssi::signal_add_first('print text' => 'get_old_status');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
442 Irssi::command('statusbar');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
443 Irssi::signal_remove('print text' => 'get_old_status');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
444 remove_statusbar(keys %killBar);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
445 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
446 #killOldStatus();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
447
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
448 # end sbar mode }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
449
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
450
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
451 # {{{ keymaps
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
452
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
453 my %keymap;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
454
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
455 sub get_keymap {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
456 my ($textDest, undef, $cont_stripped) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
457 if ($textDest->{'level'} == 524288 and $textDest->{'target'} eq ''
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
458 and !defined($textDest->{'server'})
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
459 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
460 if ($cont_stripped =~ m/((?:meta-)+)(.)\s+change_window (\d+)/) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
461 my ($level, $key, $window) = ($1, $2, $3);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
462 my $numlevel = ($level =~ y/-//) - 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
463 $keymap{$window} = ('-' x $numlevel) . "$key";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
464 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
465 Irssi::signal_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
466 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
467 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
468
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
469 sub update_keymap {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
470 %keymap = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
471 Irssi::signal_remove('command bind' => 'watch_keymap');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
472 Irssi::signal_add_first('print text' => 'get_keymap');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
473 Irssi::command('bind'); # stolen from grep
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
474 Irssi::signal_remove('print text' => 'get_keymap');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
475 Irssi::signal_add('command bind' => 'watch_keymap');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
476 Irssi::timeout_add_once(100, 'eventChanged', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
477 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
478
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
479 # watch keymap changes
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
480 sub watch_keymap {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
481 Irssi::timeout_add_once(1000, 'update_keymap', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
482 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
483
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
484 update_keymap();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
485
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
486 # end keymaps }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
487
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
488 # {{{ format handling
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
489
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
490 # a bad way do do expansions but who cares
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
491 sub expand {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
492 my ($string, %format) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
493 my ($exp, $repl);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
494 $string =~ s/\$$exp/$repl/g while (($exp, $repl) = each(%format));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
495 return $string;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
496 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
497
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
498 my %strip_table = (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
499 # fe-common::core::formats.c:format_expand_styles
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
500 # delete format_backs format_fores bold_fores other stuff
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
501 (map { $_ => '' } (split //, '04261537' . 'kbgcrmyw' . 'KBGCRMYW' . 'U9_8:|FnN>#[')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
502 # escape
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
503 (map { $_ => $_ } (split //, '{}%')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
504 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
505 sub ir_strip_codes { # strip %codes
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
506 my $o = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
507 $o =~ s/(%(.))/exists $strip_table{$2} ? $strip_table{$2} : $1/gex;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
508 $o
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
509 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
510
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
511 sub ir_parse_special {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
512 my $o; my $i = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
513 #if ($_[0]) { # for the future?!?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
514 # eval {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
515 # $o = $_[0]->parse_special($i);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
516 # };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
517 # unless ($@) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
518 # return $o;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
519 # }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
520 #}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
521 my $win = shift || Irssi::active_win();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
522 my $server = Irssi::active_server();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
523 if (ref $win and ref $win->{'active'}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
524 $o = $win->{'active'}->parse_special($i);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
525 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
526 elsif (ref $win and ref $win->{'active_server'}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
527 $o = $win->{'active_server'}->parse_special($i);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
528 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
529 elsif (ref $server) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
530 $o = $server->parse_special($i);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
531 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
532 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
533 $o = Irssi::parse_special($i);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
534 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
535 $o
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
536 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
537 sub ir_parse_special_protected {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
538 my $o; my $i = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
539 $i =~ s/
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
540 ( \\. ) | # skip over escapes (maybe)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
541 ( \$[^% $\]+ ) # catch special variables
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
542 /
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
543 if ($1) { $1 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
544 elsif ($2) { my $i2 = $2; ir_fe(ir_parse_special($i2, @_)) }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
545 else { $& }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
546 /gex;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
547 $i
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
548 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
549
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
550
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
551 sub sb_ctfe { # Irssi::current_theme->format_expand wrapper
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
552 Irssi::current_theme->format_expand(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
553 shift,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
554 (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
555 Irssi::EXPAND_FLAG_IGNORE_REPLACES
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
556 |
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
557 ($_[0]?0:Irssi::EXPAND_FLAG_IGNORE_EMPTY)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
558 )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
559 )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
560 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
561 sub sb_expand { # expand {format }s (and apply parse_special for $vars)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
562 ir_parse_special(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
563 sb_ctfe(shift)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
564 )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
565 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
566 sub sb_strip {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
567 ir_strip_codes(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
568 sb_expand(shift)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
569 ); # does this get us the actual length of that s*ty bar :P ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
570 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
571 sub sb_length {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
572 # unicode cludge, d*mn broken Irssi
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
573 # screw it, this will fail from broken joining anyway (and cause warnings)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
574 my $term_type = 'term_type';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
575 if (Irssi::version > 20040819) { # this is probably wrong, but I don't know
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
576 # when the setting name got changed
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
577 $term_type = 'term_charset';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
578 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
579 #if (lc Irssi::settings_get_str($term_type) eq '8bit'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
580 # or Irssi::settings_get_str($term_type) =~ /^iso/i
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
581 #) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
582 # length(sb_strip(shift))
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
583 #}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
584 #else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
585 my $temp = sb_strip(shift);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
586 # try to get the displayed width
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
587 my $length;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
588 eval {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
589 require Text::CharWidth;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
590 $length = Text::CharWidth::mbswidth($temp);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
591 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
592 unless ($@) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
593 return $length;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
594 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
595 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
596 if (lc Irssi::settings_get_str($term_type) eq 'utf-8') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
597 # try to switch on utf8
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
598 eval {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
599 no warnings;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
600 require Encode;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
601 #$temp = Encode::decode_utf8($temp); # thanks for the hint, but I have my
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
602 # # reasons for _utf8_on
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
603 Encode::_utf8_on($temp);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
604 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
605 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
606 # there is nothing more I can do
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
607 length($temp)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
608 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
609 #}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
610 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
611
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
612 # !!! G*DD*MN Irssi is adding an additional layer of backslashitis per { } layer
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
613 # !!! AND I still don't know what I need to escape.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
614 # !!! and NOONE else seems to know or care either.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
615 # !!! f*ck open source. I mean it.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
616 # XXX any Irssi::print debug statement leads to SEGFAULT - why ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
617
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
618 # major parts of the idea by buu (#perl @ freenode)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
619 # thanks to fxn and Somni for debugging
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
620 # while ($_[0] =~ /(.)/g) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
621 # my $c = $1; # XXX sooo... goto kills $1
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
622 # if ($q eq '%') { goto ESC; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
623
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
624 ## <freenode:#perl:tybalt89> s/%(.)|(\{)|(\})|(\\|\$)/$1?$1:$2?($level++,$2):$3?($level>$min_level&&$level--,$3):'\\'x(2**$level-1).$4/ge; # untested...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
625 sub ir_escape {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
626 my $min_level = $_[1] || 0; my $level = $min_level;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
627 my $o = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
628 $o =~ s/
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
629 ( %. ) | # $1
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
630 ( \{ ) | # $2
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
631 ( \} ) | # $3
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
632 ( \\ ) | # $4
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
633 ( \$(?=[^\\]) ) | # $5
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
634 ( \$ ) # $6
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
635 /
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
636 if ($1) { $1 } # %. escape
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
637 elsif ($2) { $level++; $2 } # { nesting start
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
638 elsif ($3) { if ($level > $min_level) { $level--; } $3 } # } nesting end
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
639 elsif ($4) { '\\'x(2**$level) } # \ needs \\escaping
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
640 elsif ($5) { '\\'x(2**$level-1) . '$' . '\\'x(2**$level-1) } # and $ needs even more because of "parse_special"
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
641 else { '\\'x(2**$level-1) . '$' } # $ needs \$ escaping
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
642 /gex;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
643 $o
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
644 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
645 #sub ir_escape {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
646 # my $min_level = $_[1] || 0; my $level = $min_level;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
647 # my $o = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
648 # $o =~ s/
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
649 # ( %. ) | # $1
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
650 # ( \{ ) | # $2
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
651 # ( \} ) | # $3
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
652 # ( \\ | \$ ) # $4
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
653 # /
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
654 # if ($1) { $1 } # %. escape
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
655 # elsif ($2) { $level++; $2 } # { nesting start
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
656 # elsif ($3) { if ($level > $min_level) { $level--; } $3 } # } nesting end
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
657 # else { '\\'x(2**($level-1)-1) . $4 } # \ or $ needs \\escaping
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
658 # /gex;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
659 # $o
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
660 #}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
661
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
662 sub ir_fe { # try to fix format stuff
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
663 my $x = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
664 # XXX why do I have to use two/four % here instead of one/two ??
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
665 # answer: you screwed up in ir_escape
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
666 $x =~ s/([%{}])/%$1/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
667 #$x =~ s/(\\|\$|[ ])/\\$1/g; # XXX HOW CAN I HANDLE THE SPACES CORRECTLY XXX
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
668 $x =~ s/(\\|\$)/\\$1/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
669 #$x =~ s/(\$(?=.))|(\$)/$1?"\\\$\\":"\\\$"/ge; # I think this should be here
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
670 # # (logic), but it doesn't work
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
671 # # that way :P
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
672 #$x =~ s/\\/\\\\/g; # that's right, escape escapes
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
673 $x
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
674 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
675 sub ir_ve { # escapes special vars but leave colours alone
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
676 my $x = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
677 #$x =~ s/([%{}])/%$1/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
678 $x =~ s/(\\|\$|[ ])/\\$1/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
679 $x
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
680 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
681
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
682 my %ansi_table;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
683 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
684 my ($i, $j, $k) = (0, 0, 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
685 %ansi_table = (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
686 # fe-common::core::formats.c:format_expand_styles
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
687 # do format_backs
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
688 (map { $_ => $terminfo->setab($i++) } (split //, '01234567' )),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
689 # do format_fores
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
690 (map { $_ => $terminfo->setaf($j++) } (split //, 'krgybmcw' )),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
691 # do bold_fores
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
692 (map { $_ => $terminfo->bold() .
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
693 $terminfo->setaf($k++) } (split //, 'KRGYBMCW')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
694 # reset
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
695 #(map { $_ => $terminfo->op() } (split //, 'nN')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
696 (map { $_ => $terminfo->op() } (split //, 'n')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
697 (map { $_ => "\033[0m" } (split //, 'N')), # XXX quick and DIRTY
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
698 # flash/bright
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
699 F => $terminfo->blink(),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
700 # reverse
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
701 8 => $terminfo->rev(),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
702 # bold
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
703 (map { $_ => $terminfo->bold() } (split //, '9_')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
704 # delete other stuff
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
705 (map { $_ => '' } (split //, ':|>#[')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
706 # escape
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
707 (map { $_ => $_ } (split //, '{}%')),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
708 )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
709 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
710 sub formats_to_ansi_basic {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
711 my $o = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
712 $o =~ s/(%(.))/exists $ansi_table{$2} ? $ansi_table{$2} : $1/gex;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
713 $o
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
714 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
715
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
716 sub lc1459 ($) { my $x = shift; $x =~ y/A-Z][\^/a-z}{|~/; $x }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
717 Irssi::settings_add_str(setc, 'banned_channels', '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
718 Irssi::settings_add_bool(setc, 'banned_channels_on', 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
719 my %banned_channels = map { lc1459($_) => undef }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
720 split ' ', Irssi::settings_get_str('banned_channels');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
721 Irssi::settings_add_str(setc, 'fancy_abbrev', 'fancy');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
722
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
723 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
724
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
725 # {{{ main
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
726
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
727 sub remake () {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
728 #$callcount++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
729 #my $xx = $callcount; Irssi::print("starting remake [ $xx ]");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
730 my ($hilight, $number, $display);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
731 my $separator = '{sb_act_sep ' . Irssi::settings_get_str(set 'separator') .
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
732 '}';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
733 my $custSort = Irssi::settings_get_str(set 'sort');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
734 my $custSortDir = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
735 if ($custSort =~ /^[-!](.*)/) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
736 $custSortDir = -1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
737 $custSort = $1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
738 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
739
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
740 my @wins =
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
741 sort {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
742 (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
743 ( (int($a->{$custSort}) <=> int($b->{$custSort})) * $custSortDir )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
744 ||
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
745 ($a->{'refnum'} <=> $b->{'refnum'})
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
746 )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
747 } Irssi::windows;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
748 my $block = Irssi::settings_get_int(set 'block');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
749 my $columns = $currentColumns;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
750 my $oldActString = $actString if $SCREEN_MODE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
751 $actString = $SCREEN_MODE ? [' A W L'] : [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
752 my $line = $SCREEN_MODE ? 1 : 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
753 my $width = $SCREEN_MODE
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
754 ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
755 $screenWidth - abs($block)*$columns + 1
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
756 :
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
757 ([Irssi::windows]->[0]{'width'} - sb_length('{sb x}'));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
758 my $height = $screenHeight - abs(Irssi::settings_get_int(set
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
759 'height_adjust'));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
760 my ($numPad, $keyPad) = (0, 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
761 my %abbrevList;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
762 if ($SCREEN_MODE or Irssi::settings_get_bool(set 'sbar_maxlength')
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
763 or ($block < 0)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
764 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
765 %abbrevList = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
766 if (Irssi::settings_get_str('fancy_abbrev') !~ /^(no|off|head)/i) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
767 my @nameList = map { ref $_ ? $_->get_active_name : '' } @wins;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
768 for (my $i = 0; $i < @nameList - 1; ++$i) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
769 my ($x, $y) = ($nameList[$i], $nameList[$i + 1]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
770 for ($x, $y) { s/^[+#!=]// }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
771 my $res = Algorithm::LCSS::LCSS($x, $y);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
772 if (defined $res) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
773 #Irssi::print("common pattern $x $y : $res");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
774 #Irssi::print("found at $nameList[$i] ".index($nameList[$i],
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
775 # $res));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
776 $abbrevList{$nameList[$i]} = int (index($nameList[$i], $res) +
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
777 (length($res) / 2));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
778 #Irssi::print("found at ".$nameList[$i+1]." ".index($nameList[$i+1],
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
779 # $res));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
780 $abbrevList{$nameList[$i+1]} = int (index($nameList[$i+1], $res) +
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
781 (length($res) / 2));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
782 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
783 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
784 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
785 if ($SCREEN_MODE or ($block < 0)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
786 $numPad = length((sort { length($b) <=> length($a) } keys %keymap)[0]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
787 $keyPad = length((sort { length($b) <=> length($a) } values %keymap)[0]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
788 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
789 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
790 if ($SCREEN_MODE) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
791 print STDERR $screenansi->dcs().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
792 $terminfo->civis().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
793 $terminfo->sc().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
794 $screenansi->st();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
795 if (@$oldActString < 1) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
796 print STDERR $screenansi->dcs().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
797 $terminfo->cup(0, $width).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
798 $actString->[0].
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
799 $terminfo->el().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
800 $screenansi->st();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
801 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
802 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
803 foreach my $win (@wins) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
804 unless ($SCREEN_MODE) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
805 $actString->[$line] = '' unless defined $actString->[$line]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
806 or Irssi::settings_get_bool(set 'all_disable');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
807 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
808
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
809 # all stolen from chanact, what does this code do and why do we need it ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
810 !ref($win) && next;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
811
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
812 my $name = $win->get_active_name;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
813 $name = '*' if (Irssi::settings_get_bool('banned_channels_on') and exists
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
814 $banned_channels{lc1459($name)});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
815 $name = $win->{'name'} if $name ne '*' and $win->{'name'} ne ''
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
816 and Irssi::settings_get_bool(set 'prefer_name');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
817 my $active = $win->{'active'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
818 my $colour = $win->{'hilight_color'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
819 if (!defined $colour) { $colour = ''; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
820
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
821 if ($win->{'data_level'} < Irssi::settings_get_int(set 'hide_data')) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
822 next; } # for Geert
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
823 if ($win->{'data_level'} == 0) { $hilight = '{sb_act_none '; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
824 elsif ($win->{'data_level'} == 1) { $hilight = '{sb_act_text '; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
825 elsif ($win->{'data_level'} == 2) { $hilight = '{sb_act_msg '; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
826 elsif ($colour ne '') { $hilight = "{sb_act_hilight_color $colour "; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
827 elsif ($win->{'data_level'} == 3) { $hilight = '{sb_act_hilight '; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
828 else { $hilight = '{sb_act_special '; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
829
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
830 $number = $win->{'refnum'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
831 my @display = ('display_nokey');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
832 if (defined $keymap{$number} and $keymap{$number} ne '') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
833 unshift @display, map { (my $cpy = $_) =~ s/_no/_/; $cpy } @display;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
834 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
835 if (Irssi::active_win->{'refnum'} == $number) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
836 unshift @display, map { my $cpy = $_; $cpy .= '_active'; $cpy } @display;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
837 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
838 #Irssi::print("win $number [@display]: " . join '.', split //, join '<<', map {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
839 # Irssi::settings_get_str(set $_) } @display);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
840 $display = (grep { $_ }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
841 map { Irssi::settings_get_str(set $_) }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
842 @display)[0];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
843 #Irssi::print("win $number : " . join '.', split //, $display);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
844
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
845 if ($SCREEN_MODE or Irssi::settings_get_bool(set 'sbar_maxlength')
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
846 or ($block < 0)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
847 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
848 my $baseLength = sb_length(ir_escape(ir_ve(ir_parse_special_protected(sb_ctfe(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
849 '{sb_background}' . expand($display,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
850 C => ir_fe('x'),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
851 N => $number . (' 'x($numPad - length($number))),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
852 Q => ir_fe((' 'x($keyPad - length($keymap{$number}))) . $keymap{$number}),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
853 H => $hilight,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
854 S => '}{sb_background}'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
855 ), 1), $win)))) - 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
856 my $diff = abs($block) - (length($name) + $baseLength);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
857 if ($diff < 0) { # too long
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
858 if (abs($diff) >= length($name)) { $name = '' } # forget it
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
859 elsif (abs($diff) + 1 >= length($name)) { $name = substr($name,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
860 0, 1); }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
861 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
862 my $middle = exists $abbrevList{$name} ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
863 (($abbrevList{$name} + (2*(length($name) / 2)))/3) :
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
864 ((Irssi::settings_get_str('fancy_abbrev') =~ /^head/i) ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
865 length($name) :
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
866 (length($name) / 2));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
867 my $cut = int($middle - (abs($diff) / 2) + .55);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
868 $cut = 1 if $cut < 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
869 $cut = length($name) - abs($diff) - 1 if $cut > (length($name) -
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
870 abs($diff) - 1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
871 $name = substr($name, 0, $cut) . '~' . substr($name, $cut +
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
872 abs($diff) + 1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
873 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
874 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
875 elsif ($SCREEN_MODE or ($block < 0)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
876 $name .= (' ' x $diff);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
877 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
878 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
879
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
880 my $add = ir_ve(ir_parse_special_protected(sb_ctfe('{sb_background}' . expand($display,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
881 C => ir_fe($name),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
882 N => $number . (' 'x($numPad - length($number))),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
883 Q => ir_fe((' 'x($keyPad - length($keymap{$number}))) . $keymap{$number}),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
884 H => $hilight,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
885 S => '}{sb_background}'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
886 ), 1), $win));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
887 if ($SCREEN_MODE) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
888 $actString->[$line] = $add;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
889 if ((!defined $oldActString->[$line]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
890 or $oldActString->[$line] ne $actString->[$line])
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
891 and
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
892 $line <= ($columns * $height)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
893 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
894 print STDERR $screenansi->dcs().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
895 $terminfo->cup(($line-1) % $height+1, $width + (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
896 abs($block) * int(($line-1) / $height))).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
897 formats_to_ansi_basic(sb_expand(ir_escape($actString->[$line]))).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
898 #$terminfo->el().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
899 $screenansi->st();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
900 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
901 $line++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
902 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
903 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
904 #$temp =~ s/\{\S+?(?:\s(.*?))?\}/$1/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
905 #$temp =~ s/\\\\\\\\/\\/g; # XXX I'm actually guessing here, someone point me
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
906 # # XXX to docs please
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
907 $actString->[$line] = '' unless defined $actString->[$line];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
908
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
909 # XXX how can I check whether the content still fits in the bar? this would
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
910 # XXX allow awlstatus to reside on a statusbar together with other items...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
911 if (sb_length(ir_escape($actString->[$line] . $add)) >= $width) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
912 # XXX doesn't correctly handle utf-8 multibyte ... help !!?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
913 $actString->[$line] .= ' ' x ($width - sb_length(ir_escape(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
914 $actString->[$line])));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
915 $line++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
916 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
917 $actString->[$line] .= $add . $separator;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
918 # XXX if I use these prints, output layout gets screwed up... why ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
919 #Irssi::print("line $line: ".$actString->[$line]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
920 #Irssi::print("temp $line: ".$temp);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
921 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
922 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
923
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
924 if ($SCREEN_MODE) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
925 while ($line <= ($columns * $height)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
926 print STDERR $screenansi->dcs().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
927 $terminfo->cup(($line-1) % $height+1, $width + (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
928 abs($block) * int(($line-1) / $height))).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
929 $terminfo->el().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
930 $screenansi->st();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
931 $line++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
932 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
933 print STDERR $screenansi->dcs().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
934 $terminfo->rc().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
935 $terminfo->cnorm().
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
936 $screenansi->st();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
937 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
938 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
939 # XXX the Irssi::print statements lead to the MOST WEIRD results
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
940 # e.g.: the loop gets executed TWICE for p > 0 ?!?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
941 for (my $p = 0; $p < @$actString; $p++) { # wrap each line in {sb }, escape it
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
942 my $x = $actString->[$p]; # properly, etc.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
943 $x =~ s/\Q$separator\E([ ]*)$/$1/;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
944 #Irssi::print("[$p]".'current:'.join'.',split//,sb_strip(ir_escape($x,0)));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
945 #Irssi::print("assumed length before:".sb_length(ir_escape($x,0)));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
946 $x = "{sb $x}";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
947 #Irssi::print("[$p]".'new:'.join'.',split//,sb_expand(ir_escape($x,0)));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
948 #Irssi::print("[$p]".'new:'.join'.',split//,ir_escape($x,0));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
949 #Irssi::print("assumed length after:".sb_length(ir_escape($x,0)));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
950 $x = ir_escape($x);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
951 #Irssi::print("[$p]".'REALnew:'.join'.',split//,sb_strip($x));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
952 $actString->[$p] = $x;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
953 # XXX any Irssi::print debug statement leads to SEGFAULT (sometimes) - why ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
954 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
955 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
956 #Irssi::print("remake [ $xx ] finished");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
957 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
958
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
959 sub awlHasChanged () {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
960 $globTime = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
961 my $temp = ($SCREEN_MODE ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
962 "\\\n" . Irssi::settings_get_int(set 'block').
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
963 Irssi::settings_get_int(set 'height_adjust')
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
964 : "!\n" . Irssi::settings_get_str(set 'placement').
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
965 Irssi::settings_get_int(set 'position')).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
966 Irssi::settings_get_str(set 'automode');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
967 if ($temp ne $resetNeeded) { wlreset(); return; }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
968 #Irssi::print("awl has changed, calls to remake so far: $callcount");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
969 $needRemake = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
970
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
971 #remake();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
972 if (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
973 ($SCREEN_MODE and !$DISABLE_SCREEN_TEMP)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
974 or
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
975 ($needRemake and Irssi::settings_get_bool(set 'all_disable'))
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
976 or
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
977 (!Irssi::settings_get_bool(set 'all_disable') and $currentLines < 1)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
978 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
979 $needRemake = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
980 remake();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
981 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
982
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
983 unless ($SCREEN_MODE) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
984 # XXX Irssi crashes if I try to do this without timer, why ? What's the minimum
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
985 # XXX delay I need to use in the timer ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
986 Irssi::timeout_add_once(100, 'syncLines', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
987
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
988 for (keys %statusbars) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
989 Irssi::statusbar_items_redraw(set$_);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
990 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
991 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
992 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
993 Irssi::timeout_add_once(100, 'syncColumns', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
994 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
995 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
996
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
997 sub eventChanged () { # Implement a change queue/blocker -.-)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
998 if (defined $globTime) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
999 Irssi::timeout_remove($globTime);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1000 } # delay the update further
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1001 $globTime = Irssi::timeout_add_once(GLOB_QUEUE_TIMER, 'awlHasChanged', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1002 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1003
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1004 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1005
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1006
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1007 # {{{ screen mode
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1008
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1009 sub screenFullRedraw {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1010 my ($window) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1011 if (!ref $window or $window->{'refnum'} == Irssi::active_win->{'refnum'}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1012 $actString = [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1013 eventChanged();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1014 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1015 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1016
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1017 sub screenSize { # from nicklist.pl
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1018 $screenResizing = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1019 # fit screen
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1020 system 'screen -x '.$ENV{'STY'}.' -X fit';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1021 # get size
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1022 my ($row, $col) = split ' ', `stty size`;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1023 # set screen width
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1024 $screenWidth = $col-1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1025 $screenHeight = $row-1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1026
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1027 # on some recent systems, "screen -X fit; screen -X width -w 50" doesn't work, needs a sleep in between the 2 commands
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1028 # so we wait a second before setting the width
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1029 Irssi::timeout_add_once(100, sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1030 my ($new_irssi_width) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1031 $new_irssi_width -= abs(Irssi::settings_get_int(set
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1032 'block'))*$currentColumns - 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1033 system 'screen -x '.$ENV{'STY'}.' -X width -w ' . $new_irssi_width;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1034 # and then we wait another second for the resizing, and then redraw.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1035 Irssi::timeout_add_once(10,sub {$screenResizing = 0; screenFullRedraw()}, []);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1036 }, $screenWidth);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1037 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1038
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1039 sub screenOff {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1040 my ($unloadMode) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1041 Irssi::signal_remove('gui print text finished' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1042 Irssi::signal_remove('gui page scrolled' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1043 Irssi::signal_remove('window changed' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1044 Irssi::signal_remove('window changed automatic' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1045 if ($unloadMode) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1046 Irssi::signal_remove('terminal resized' => 'resizeTerm');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1047 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1048 system 'screen -x '.$ENV{'STY'}.' -X fit';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1049 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1050
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1051 sub syncColumns {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1052 return if (@$actString == 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1053 my $temp = $currentColumns;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1054 #Irssi::print("current columns $temp");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1055 my $height = $screenHeight - abs(Irssi::settings_get_int(set
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1056 'height_adjust'));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1057 $currentColumns = int(($#$actString-1) / $height) + 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1058 #Irssi::print("objects in actstring:".scalar(@$actString).", screen height:".
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1059 # $height);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1060 my $currMaxColumns = Irssi::settings_get_int(set 'columns');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1061 if ($currMaxColumns > 0 and $currentColumns > $currMaxColumns) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1062 $currentColumns = $currMaxColumns;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1063 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1064 elsif ($currMaxColumns < 0) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1065 $currentColumns = abs($currMaxColumns);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1066 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1067 return if ($temp == $currentColumns);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1068 screenSize();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1069 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1070
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1071 #$needRemake = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1072 sub resizeTerm () {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1073 if ($SCREEN_MODE and !$screenResizing) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1074 $screenResizing = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1075 Irssi::timeout_add_once(10, 'screenSize', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1076 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1077 Irssi::timeout_add_once(100, 'eventChanged', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1078 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1079
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1080 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1081
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1082
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1083 # {{{ settings add
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1084
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1085 Irssi::settings_add_str(setc, set 'display_nokey', '[$N]$H$C$S');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1086 Irssi::settings_add_str(setc, set 'display_key', '[$Q=$N]$H$C$S');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1087 Irssi::settings_add_str(setc, set 'display_nokey_active', '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1088 Irssi::settings_add_str(setc, set 'display_key_active', '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1089 Irssi::settings_add_str(setc, set 'separator', "\\ ");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1090 Irssi::settings_add_bool(setc, set 'prefer_name', 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1091 Irssi::settings_add_int(setc, set 'hide_data', 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1092 Irssi::settings_add_int(setc, set 'maxlines', 9);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1093 Irssi::settings_add_int(setc, set 'columns', 1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1094 Irssi::settings_add_int(setc, set 'block', 20);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1095 Irssi::settings_add_bool(setc, set 'sbar_maxlength', 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1096 Irssi::settings_add_int(setc, set 'height_adjust', 2);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1097 Irssi::settings_add_str(setc, set 'sort', 'refnum');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1098 Irssi::settings_add_str(setc, set 'placement', 'bottom');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1099 Irssi::settings_add_int(setc, set 'position', 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1100 Irssi::settings_add_bool(setc, set 'all_disable', 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1101 Irssi::settings_add_str(setc, set 'automode', 'sbar');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1102
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1103 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1104
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1105
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1106 # {{{ init
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1107
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1108 sub wlreset {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1109 $actString = [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1110 $currentLines = 0; # 1; # mhmmmm .. we actually enable one line down there so
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1111 # let's try this.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1112 #update_keymap();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1113 killOldStatus();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1114 # Register statusbar
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1115 #add_statusbar(0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1116 #Irssi::command('statusbar wl0 enable');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1117 my $was_screen_mode = $SCREEN_MODE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1118 if ($SCREEN_MODE = (Irssi::settings_get_str(set 'automode') =~ /screen/i)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1119 and
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1120 !$was_screen_mode
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1121 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1122 if (!defined $ENV{'STY'}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1123 Irssi::print('Screen mode can only be used in GNU screen but no '.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1124 'screen was found.', MSGLEVEL_CLIENTERROR);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1125 $SCREEN_MODE = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1126 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1127 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1128 Irssi::signal_add_last('gui print text finished' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1129 Irssi::signal_add_last('gui page scrolled' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1130 Irssi::signal_add('window changed' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1131 Irssi::signal_add('window changed automatic' => 'screenFullRedraw');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1132 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1133 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1134 elsif ($was_screen_mode and !$SCREEN_MODE) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1135 screenOff();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1136 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1137 $resetNeeded = ($SCREEN_MODE ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1138 "\\\n" . Irssi::settings_get_int(set 'block').
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1139 Irssi::settings_get_int(set 'height_adjust')
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1140 : "!\n" . Irssi::settings_get_str(set 'placement').
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1141 Irssi::settings_get_int(set 'position')).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1142 Irssi::settings_get_str(set 'automode');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1143 resizeTerm();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1144 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1145
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1146 wlreset();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1147
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1148 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1149
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1150
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1151 # {{{ unload/deinit
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1152
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1153 my $Unload;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1154 sub unload ($$$) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1155 $Unload = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1156 # pretend we didn't do anything ASAP
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1157 Irssi::timeout_add_once(10, sub { $Unload = undef; }, undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1158 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1159 # last try to catch a sigsegv
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1160 Irssi::signal_add_first('gui exit' => sub { $Unload = undef; });
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1161 sub UNLOAD {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1162 # this might well crash Irssi... try /eval /script unload someotherscript ;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1163 # /quit (= SEGFAULT !)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1164 if ($Unload) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1165 $actString = ['']; # syncLines(); # XXX Irssi crashes when trying to disable
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1166 killOldStatus(); # XXX all statusbars ?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1167 if ($SCREEN_MODE) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1168 screenOff('unload mode');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1169 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1170 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1171 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1172
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1173 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1174
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1175
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1176 # {{{ signals
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1177
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1178 sub addPrintTextHook { # update on print text
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1179 return if $_[0]->{'level'} == 262144 and $_[0]->{'target'} eq ''
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1180 and !defined($_[0]->{'server'});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1181 if (Irssi::settings_get_str(set 'sort') =~ /^[-!]?last_line$/) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1182 Irssi::timeout_add_once(100, 'eventChanged', undef);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1183 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1184 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1185
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1186 #sub _x { my ($x, $y) = @_; ($x, sub { Irssi::print('-->signal '.$x); eval "$y();"; }) }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1187 #sub _x { @_ }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1188 Irssi::signal_add_first(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1189 'command script unload' => 'unload'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1190 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1191 Irssi::signal_add_last({
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1192 'setup changed' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1193 'print text' => 'addPrintTextHook',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1194 'terminal resized' => 'resizeTerm',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1195 'setup reread' => 'wlreset',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1196 'window hilight' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1197 });
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1198 Irssi::signal_add({
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1199 'window created' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1200 'window destroyed' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1201 'window name changed' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1202 'window refnum changed' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1203 'window changed' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1204 'window changed automatic' => 'eventChanged',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1205 });
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1206
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1207 #Irssi::signal_add('nick mode changed', 'chanactHasChanged'); # relicts
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1208
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1209 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1210
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1211 # {{{ commands
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1212
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1213
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1214 sub runsub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1215 my ($cmd) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1216 sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1217 my ($data, $server, $item) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1218 Irssi::command_runsub($cmd, $data, $server, $item);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1219 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1220 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1221 Irssi::command_bind( setc() => runsub(setc()) );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1222 Irssi::command_bind( setc() . ' paste' => runsub(setc() . ' paste') );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1223 Irssi::command_bind(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1224 setc() . ' paste on' => sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1225 return unless $SCREEN_MODE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1226 my $was_disabled = $DISABLE_SCREEN_TEMP;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1227 $DISABLE_SCREEN_TEMP = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1228 Irssi::print('Paste mode is now ON, '.uc(setc()).' is temporarily '.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1229 'disabled.');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1230 if (!$was_disabled) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1231 $screenResizing = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1232 screenOff();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1233 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1234 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1235 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1236 Irssi::command_bind(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1237 setc() . ' paste off' => sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1238 return unless $SCREEN_MODE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1239 my $was_disabled = $DISABLE_SCREEN_TEMP;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1240 $DISABLE_SCREEN_TEMP = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1241 Irssi::print('Paste mode is now OFF, '.uc(setc()).' is enabled.');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1242 if ($was_disabled) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1243 $SCREEN_MODE = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1244 $screenResizing = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1245 wlreset();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1246 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1247 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1248 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1249 Irssi::command_bind(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1250 setc() . ' paste toggle' => sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1251 if ($DISABLE_SCREEN_TEMP) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1252 Irssi::command(setc() . ' paste off');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1253 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1254 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1255 Irssi::command(setc() . ' paste on');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1256 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1257 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1258 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1259 Irssi::command_bind(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1260 setc() . ' redraw' => sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1261 return unless $SCREEN_MODE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1262 screenFullRedraw();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1263 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1264 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1265
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1266
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1267 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1268
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1269 # {{{ Algorithm::LCSS module
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1270 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1271 package Algorithm::Diff;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1272 # Skip to first "=head" line for documentation.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1273 use strict;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1274
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1275 use integer; # see below in _replaceNextLargerWith() for mod to make
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1276 # if you don't use this
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1277
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1278 # McIlroy-Hunt diff algorithm
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1279 # Adapted from the Smalltalk code of Mario I. Wolczko, <[email protected]>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1280 # by Ned Konz, [email protected]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1281 # Updates by Tye McQueen, http://perlmonks.org/?node=tye
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1282
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1283 # Create a hash that maps each element of $aCollection to the set of
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1284 # positions it occupies in $aCollection, restricted to the elements
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1285 # within the range of indexes specified by $start and $end.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1286 # The fourth parameter is a subroutine reference that will be called to
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1287 # generate a string to use as a key.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1288 # Additional parameters, if any, will be passed to this subroutine.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1289 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1290 # my $hashRef = _withPositionsOfInInterval( \@array, $start, $end, $keyGen );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1291
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1292 sub _withPositionsOfInInterval
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1293 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1294 my $aCollection = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1295 my $start = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1296 my $end = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1297 my $keyGen = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1298 my %d;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1299 my $index;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1300 for ( $index = $start ; $index <= $end ; $index++ )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1301 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1302 my $element = $aCollection->[$index];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1303 my $key = &$keyGen( $element, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1304 if ( exists( $d{$key} ) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1305 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1306 unshift ( @{ $d{$key} }, $index );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1307 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1308 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1309 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1310 $d{$key} = [$index];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1311 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1312 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1313 return wantarray ? %d : \%d;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1314 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1315
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1316 # Find the place at which aValue would normally be inserted into the
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1317 # array. If that place is already occupied by aValue, do nothing, and
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1318 # return undef. If the place does not exist (i.e., it is off the end of
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1319 # the array), add it to the end, otherwise replace the element at that
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1320 # point with aValue. It is assumed that the array's values are numeric.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1321 # This is where the bulk (75%) of the time is spent in this module, so
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1322 # try to make it fast!
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1323
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1324 sub _replaceNextLargerWith
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1325 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1326 my ( $array, $aValue, $high ) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1327 $high ||= $#$array;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1328
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1329 # off the end?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1330 if ( $high == -1 || $aValue > $array->[-1] )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1331 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1332 push ( @$array, $aValue );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1333 return $high + 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1334 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1335
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1336 # binary search for insertion point...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1337 my $low = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1338 my $index;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1339 my $found;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1340 while ( $low <= $high )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1341 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1342 $index = ( $high + $low ) / 2;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1343
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1344 # $index = int(( $high + $low ) / 2); # without 'use integer'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1345 $found = $array->[$index];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1346
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1347 if ( $aValue == $found )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1348 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1349 return undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1350 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1351 elsif ( $aValue > $found )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1352 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1353 $low = $index + 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1354 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1355 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1356 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1357 $high = $index - 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1358 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1359 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1360
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1361 # now insertion point is in $low.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1362 $array->[$low] = $aValue; # overwrite next larger
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1363 return $low;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1364 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1365
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1366 # This method computes the longest common subsequence in $a and $b.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1367
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1368 # Result is array or ref, whose contents is such that
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1369 # $a->[ $i ] == $b->[ $result[ $i ] ]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1370 # foreach $i in ( 0 .. $#result ) if $result[ $i ] is defined.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1371
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1372 # An additional argument may be passed; this is a hash or key generating
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1373 # function that should return a string that uniquely identifies the given
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1374 # element. It should be the case that if the key is the same, the elements
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1375 # will compare the same. If this parameter is undef or missing, the key
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1376 # will be the element as a string.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1377
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1378 # By default, comparisons will use "eq" and elements will be turned into keys
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1379 # using the default stringizing operator '""'.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1380
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1381 # Additional parameters, if any, will be passed to the key generation
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1382 # routine.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1383
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1384 sub _longestCommonSubsequence
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1385 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1386 my $a = shift; # array ref or hash ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1387 my $b = shift; # array ref or hash ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1388 my $counting = shift; # scalar
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1389 my $keyGen = shift; # code ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1390 my $compare; # code ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1391
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1392 if ( ref($a) eq 'HASH' )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1393 { # prepared hash must be in $b
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1394 my $tmp = $b;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1395 $b = $a;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1396 $a = $tmp;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1397 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1398
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1399 # Check for bogus (non-ref) argument values
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1400 if ( !ref($a) || !ref($b) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1401 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1402 my @callerInfo = caller(1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1403 die 'error: must pass array or hash references to ' . $callerInfo[3];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1404 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1405
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1406 # set up code refs
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1407 # Note that these are optimized.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1408 if ( !defined($keyGen) ) # optimize for strings
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1409 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1410 $keyGen = sub { $_[0] };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1411 $compare = sub { my ( $a, $b ) = @_; $a eq $b };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1412 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1413 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1414 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1415 $compare = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1416 my $a = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1417 my $b = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1418 &$keyGen( $a, @_ ) eq &$keyGen( $b, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1419 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1420 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1421
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1422 my ( $aStart, $aFinish, $matchVector ) = ( 0, $#$a, [] );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1423 my ( $prunedCount, $bMatches ) = ( 0, {} );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1424
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1425 if ( ref($b) eq 'HASH' ) # was $bMatches prepared for us?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1426 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1427 $bMatches = $b;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1428 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1429 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1430 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1431 my ( $bStart, $bFinish ) = ( 0, $#$b );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1432
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1433 # First we prune off any common elements at the beginning
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1434 while ( $aStart <= $aFinish
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1435 and $bStart <= $bFinish
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1436 and &$compare( $a->[$aStart], $b->[$bStart], @_ ) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1437 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1438 $matchVector->[ $aStart++ ] = $bStart++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1439 $prunedCount++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1440 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1441
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1442 # now the end
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1443 while ( $aStart <= $aFinish
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1444 and $bStart <= $bFinish
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1445 and &$compare( $a->[$aFinish], $b->[$bFinish], @_ ) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1446 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1447 $matchVector->[ $aFinish-- ] = $bFinish--;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1448 $prunedCount++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1449 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1450
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1451 # Now compute the equivalence classes of positions of elements
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1452 $bMatches =
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1453 _withPositionsOfInInterval( $b, $bStart, $bFinish, $keyGen, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1454 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1455 my $thresh = [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1456 my $links = [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1457
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1458 my ( $i, $ai, $j, $k );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1459 for ( $i = $aStart ; $i <= $aFinish ; $i++ )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1460 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1461 $ai = &$keyGen( $a->[$i], @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1462 if ( exists( $bMatches->{$ai} ) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1463 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1464 $k = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1465 for $j ( @{ $bMatches->{$ai} } )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1466 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1467
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1468 # optimization: most of the time this will be true
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1469 if ( $k and $thresh->[$k] > $j and $thresh->[ $k - 1 ] < $j )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1470 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1471 $thresh->[$k] = $j;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1472 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1473 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1474 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1475 $k = _replaceNextLargerWith( $thresh, $j, $k );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1476 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1477
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1478 # oddly, it's faster to always test this (CPU cache?).
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1479 if ( defined($k) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1480 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1481 $links->[$k] =
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1482 [ ( $k ? $links->[ $k - 1 ] : undef ), $i, $j ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1483 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1484 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1485 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1486 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1487
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1488 if (@$thresh)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1489 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1490 return $prunedCount + @$thresh if $counting;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1491 for ( my $link = $links->[$#$thresh] ; $link ; $link = $link->[0] )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1492 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1493 $matchVector->[ $link->[1] ] = $link->[2];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1494 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1495 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1496 elsif ($counting)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1497 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1498 return $prunedCount;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1499 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1500
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1501 return wantarray ? @$matchVector : $matchVector;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1502 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1503
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1504 sub traverse_sequences
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1505 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1506 my $a = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1507 my $b = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1508 my $callbacks = shift || {};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1509 my $keyGen = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1510 my $matchCallback = $callbacks->{'MATCH'} || sub { };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1511 my $discardACallback = $callbacks->{'DISCARD_A'} || sub { };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1512 my $finishedACallback = $callbacks->{'A_FINISHED'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1513 my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1514 my $finishedBCallback = $callbacks->{'B_FINISHED'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1515 my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1516
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1517 # Process all the lines in @$matchVector
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1518 my $lastA = $#$a;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1519 my $lastB = $#$b;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1520 my $bi = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1521 my $ai;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1522
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1523 for ( $ai = 0 ; $ai <= $#$matchVector ; $ai++ )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1524 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1525 my $bLine = $matchVector->[$ai];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1526 if ( defined($bLine) ) # matched
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1527 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1528 &$discardBCallback( $ai, $bi++, @_ ) while $bi < $bLine;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1529 &$matchCallback( $ai, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1530 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1531 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1532 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1533 &$discardACallback( $ai, $bi, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1534 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1535 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1536
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1537 # The last entry (if any) processed was a match.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1538 # $ai and $bi point just past the last matching lines in their sequences.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1539
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1540 while ( $ai <= $lastA or $bi <= $lastB )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1541 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1542
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1543 # last A?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1544 if ( $ai == $lastA + 1 and $bi <= $lastB )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1545 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1546 if ( defined($finishedACallback) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1547 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1548 &$finishedACallback( $lastA, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1549 $finishedACallback = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1550 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1551 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1552 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1553 &$discardBCallback( $ai, $bi++, @_ ) while $bi <= $lastB;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1554 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1555 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1556
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1557 # last B?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1558 if ( $bi == $lastB + 1 and $ai <= $lastA )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1559 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1560 if ( defined($finishedBCallback) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1561 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1562 &$finishedBCallback( $lastB, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1563 $finishedBCallback = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1564 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1565 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1566 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1567 &$discardACallback( $ai++, $bi, @_ ) while $ai <= $lastA;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1568 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1569 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1570
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1571 &$discardACallback( $ai++, $bi, @_ ) if $ai <= $lastA;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1572 &$discardBCallback( $ai, $bi++, @_ ) if $bi <= $lastB;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1573 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1574
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1575 return 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1576 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1577
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1578 sub traverse_balanced
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1579 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1580 my $a = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1581 my $b = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1582 my $callbacks = shift || {};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1583 my $keyGen = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1584 my $matchCallback = $callbacks->{'MATCH'} || sub { };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1585 my $discardACallback = $callbacks->{'DISCARD_A'} || sub { };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1586 my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1587 my $changeCallback = $callbacks->{'CHANGE'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1588 my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1589
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1590 # Process all the lines in match vector
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1591 my $lastA = $#$a;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1592 my $lastB = $#$b;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1593 my $bi = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1594 my $ai = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1595 my $ma = -1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1596 my $mb;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1597
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1598 while (1)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1599 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1600
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1601 # Find next match indices $ma and $mb
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1602 do {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1603 $ma++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1604 } while(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1605 $ma <= $#$matchVector
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1606 && !defined $matchVector->[$ma]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1607 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1608
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1609 last if $ma > $#$matchVector; # end of matchVector?
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1610 $mb = $matchVector->[$ma];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1611
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1612 # Proceed with discard a/b or change events until
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1613 # next match
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1614 while ( $ai < $ma || $bi < $mb )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1615 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1616
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1617 if ( $ai < $ma && $bi < $mb )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1618 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1619
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1620 # Change
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1621 if ( defined $changeCallback )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1622 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1623 &$changeCallback( $ai++, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1624 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1625 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1626 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1627 &$discardACallback( $ai++, $bi, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1628 &$discardBCallback( $ai, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1629 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1630 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1631 elsif ( $ai < $ma )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1632 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1633 &$discardACallback( $ai++, $bi, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1634 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1635 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1636 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1637
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1638 # $bi < $mb
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1639 &$discardBCallback( $ai, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1640 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1641 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1642
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1643 # Match
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1644 &$matchCallback( $ai++, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1645 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1646
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1647 while ( $ai <= $lastA || $bi <= $lastB )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1648 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1649 if ( $ai <= $lastA && $bi <= $lastB )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1650 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1651
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1652 # Change
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1653 if ( defined $changeCallback )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1654 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1655 &$changeCallback( $ai++, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1656 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1657 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1658 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1659 &$discardACallback( $ai++, $bi, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1660 &$discardBCallback( $ai, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1661 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1662 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1663 elsif ( $ai <= $lastA )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1664 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1665 &$discardACallback( $ai++, $bi, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1666 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1667 else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1668 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1669
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1670 # $bi <= $lastB
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1671 &$discardBCallback( $ai, $bi++, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1672 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1673 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1674
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1675 return 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1676 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1677
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1678 sub prepare
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1679 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1680 my $a = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1681 my $keyGen = shift; # code ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1682
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1683 # set up code ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1684 $keyGen = sub { $_[0] } unless defined($keyGen);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1685
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1686 return scalar _withPositionsOfInInterval( $a, 0, $#$a, $keyGen, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1687 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1688
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1689 sub LCS
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1690 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1691 my $a = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1692 my $b = shift; # array ref or hash ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1693 my $matchVector = _longestCommonSubsequence( $a, $b, 0, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1694 my @retval;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1695 my $i;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1696 for ( $i = 0 ; $i <= $#$matchVector ; $i++ )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1697 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1698 if ( defined( $matchVector->[$i] ) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1699 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1700 push ( @retval, $a->[$i] );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1701 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1702 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1703 return wantarray ? @retval : \@retval;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1704 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1705
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1706 sub LCS_length
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1707 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1708 my $a = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1709 my $b = shift; # array ref or hash ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1710 return _longestCommonSubsequence( $a, $b, 1, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1711 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1712
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1713 sub LCSidx
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1714 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1715 my $a= shift @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1716 my $b= shift @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1717 my $match= _longestCommonSubsequence( $a, $b, 0, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1718 my @am= grep defined $match->[$_], 0..$#$match;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1719 my @bm= @{$match}[@am];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1720 return \@am, \@bm;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1721 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1722
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1723 sub compact_diff
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1724 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1725 my $a= shift @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1726 my $b= shift @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1727 my( $am, $bm )= LCSidx( $a, $b, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1728 my @cdiff;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1729 my( $ai, $bi )= ( 0, 0 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1730 push @cdiff, $ai, $bi;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1731 while( 1 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1732 while( @$am && $ai == $am->[0] && $bi == $bm->[0] ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1733 shift @$am;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1734 shift @$bm;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1735 ++$ai, ++$bi;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1736 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1737 push @cdiff, $ai, $bi;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1738 last if ! @$am;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1739 $ai = $am->[0];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1740 $bi = $bm->[0];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1741 push @cdiff, $ai, $bi;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1742 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1743 push @cdiff, 0+@$a, 0+@$b
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1744 if $ai < @$a || $bi < @$b;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1745 return wantarray ? @cdiff : \@cdiff;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1746 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1747
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1748 sub diff
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1749 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1750 my $a = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1751 my $b = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1752 my $retval = [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1753 my $hunk = [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1754 my $discard = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1755 push @$hunk, [ '-', $_[0], $a->[ $_[0] ] ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1756 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1757 my $add = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1758 push @$hunk, [ '+', $_[1], $b->[ $_[1] ] ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1759 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1760 my $match = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1761 push @$retval, $hunk
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1762 if 0 < @$hunk;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1763 $hunk = []
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1764 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1765 traverse_sequences( $a, $b,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1766 { MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add }, @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1767 &$match();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1768 return wantarray ? @$retval : $retval;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1769 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1770
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1771 sub sdiff
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1772 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1773 my $a = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1774 my $b = shift; # array ref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1775 my $retval = [];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1776 my $discard = sub { push ( @$retval, [ '-', $a->[ $_[0] ], "" ] ) };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1777 my $add = sub { push ( @$retval, [ '+', "", $b->[ $_[1] ] ] ) };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1778 my $change = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1779 push ( @$retval, [ 'c', $a->[ $_[0] ], $b->[ $_[1] ] ] );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1780 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1781 my $match = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1782 push ( @$retval, [ 'u', $a->[ $_[0] ], $b->[ $_[1] ] ] );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1783 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1784 traverse_balanced(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1785 $a,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1786 $b,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1787 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1788 MATCH => $match,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1789 DISCARD_A => $discard,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1790 DISCARD_B => $add,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1791 CHANGE => $change,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1792 },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1793 @_
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1794 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1795 return wantarray ? @$retval : $retval;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1796 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1797
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1798 ########################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1799 my $Root= __PACKAGE__;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1800 package Algorithm::Diff::_impl;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1801 use strict;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1802
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1803 sub _Idx() { 0 } # $me->[_Idx]: Ref to array of hunk indices
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1804 # 1 # $me->[1]: Ref to first sequence
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1805 # 2 # $me->[2]: Ref to second sequence
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1806 sub _End() { 3 } # $me->[_End]: Diff between forward and reverse pos
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1807 sub _Same() { 4 } # $me->[_Same]: 1 if pos 1 contains unchanged items
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1808 sub _Base() { 5 } # $me->[_Base]: Added to range's min and max
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1809 sub _Pos() { 6 } # $me->[_Pos]: Which hunk is currently selected
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1810 sub _Off() { 7 } # $me->[_Off]: Offset into _Idx for current position
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1811 sub _Min() { -2 } # Added to _Off to get min instead of max+1
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1812
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1813 sub Die
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1814 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1815 require Carp;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1816 Carp::confess( @_ );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1817 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1818
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1819 sub _ChkPos
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1820 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1821 my( $me )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1822 return if $me->[_Pos];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1823 my $meth= ( caller(1) )[3];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1824 Die( "Called $meth on 'reset' object" );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1825 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1826
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1827 sub _ChkSeq
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1828 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1829 my( $me, $seq )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1830 return $seq + $me->[_Off]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1831 if 1 == $seq || 2 == $seq;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1832 my $meth= ( caller(1) )[3];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1833 Die( "$meth: Invalid sequence number ($seq); must be 1 or 2" );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1834 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1835
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1836 sub getObjPkg
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1837 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1838 my( $us )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1839 return ref $us if ref $us;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1840 return $us . "::_obj";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1841 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1842
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1843 sub new
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1844 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1845 my( $us, $seq1, $seq2, $opts ) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1846 my @args;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1847 for( $opts->{keyGen} ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1848 push @args, $_ if $_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1849 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1850 for( $opts->{keyGenArgs} ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1851 push @args, @$_ if $_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1852 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1853 my $cdif= Algorithm::Diff::compact_diff( $seq1, $seq2, @args );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1854 my $same= 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1855 if( 0 == $cdif->[2] && 0 == $cdif->[3] ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1856 $same= 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1857 splice @$cdif, 0, 2;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1858 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1859 my @obj= ( $cdif, $seq1, $seq2 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1860 $obj[_End] = (1+@$cdif)/2;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1861 $obj[_Same] = $same;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1862 $obj[_Base] = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1863 my $me = bless \@obj, $us->getObjPkg();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1864 $me->Reset( 0 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1865 return $me;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1866 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1867
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1868 sub Reset
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1869 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1870 my( $me, $pos )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1871 $pos= int( $pos || 0 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1872 $pos += $me->[_End]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1873 if $pos < 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1874 $pos= 0
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1875 if $pos < 0 || $me->[_End] <= $pos;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1876 $me->[_Pos]= $pos || !1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1877 $me->[_Off]= 2*$pos - 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1878 return $me;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1879 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1880
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1881 sub Base
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1882 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1883 my( $me, $base )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1884 my $oldBase= $me->[_Base];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1885 $me->[_Base]= 0+$base if defined $base;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1886 return $oldBase;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1887 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1888
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1889 sub Copy
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1890 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1891 my( $me, $pos, $base )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1892 my @obj= @$me;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1893 my $you= bless \@obj, ref($me);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1894 $you->Reset( $pos ) if defined $pos;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1895 $you->Base( $base );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1896 return $you;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1897 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1898
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1899 sub Next {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1900 my( $me, $steps )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1901 $steps= 1 if ! defined $steps;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1902 if( $steps ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1903 my $pos= $me->[_Pos];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1904 my $new= $pos + $steps;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1905 $new= 0 if $pos && $new < 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1906 $me->Reset( $new )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1907 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1908 return $me->[_Pos];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1909 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1910
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1911 sub Prev {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1912 my( $me, $steps )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1913 $steps= 1 if ! defined $steps;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1914 my $pos= $me->Next(-$steps);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1915 $pos -= $me->[_End] if $pos;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1916 return $pos;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1917 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1918
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1919 sub Diff {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1920 my( $me )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1921 $me->_ChkPos();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1922 return 0 if $me->[_Same] == ( 1 & $me->[_Pos] );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1923 my $ret= 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1924 my $off= $me->[_Off];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1925 for my $seq ( 1, 2 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1926 $ret |= $seq
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1927 if $me->[_Idx][ $off + $seq + _Min ]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1928 < $me->[_Idx][ $off + $seq ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1929 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1930 return $ret;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1931 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1932
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1933 sub Min {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1934 my( $me, $seq, $base )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1935 $me->_ChkPos();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1936 my $off= $me->_ChkSeq($seq);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1937 $base= $me->[_Base] if !defined $base;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1938 return $base + $me->[_Idx][ $off + _Min ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1939 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1940
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1941 sub Max {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1942 my( $me, $seq, $base )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1943 $me->_ChkPos();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1944 my $off= $me->_ChkSeq($seq);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1945 $base= $me->[_Base] if !defined $base;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1946 return $base + $me->[_Idx][ $off ] -1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1947 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1948
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1949 sub Range {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1950 my( $me, $seq, $base )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1951 $me->_ChkPos();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1952 my $off = $me->_ChkSeq($seq);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1953 if( !wantarray ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1954 return $me->[_Idx][ $off ]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1955 - $me->[_Idx][ $off + _Min ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1956 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1957 $base= $me->[_Base] if !defined $base;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1958 return ( $base + $me->[_Idx][ $off + _Min ] )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1959 .. ( $base + $me->[_Idx][ $off ] - 1 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1960 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1961
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1962 sub Items {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1963 my( $me, $seq )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1964 $me->_ChkPos();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1965 my $off = $me->_ChkSeq($seq);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1966 if( !wantarray ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1967 return $me->[_Idx][ $off ]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1968 - $me->[_Idx][ $off + _Min ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1969 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1970 return
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1971 @{$me->[$seq]}[
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1972 $me->[_Idx][ $off + _Min ]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1973 .. ( $me->[_Idx][ $off ] - 1 )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1974 ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1975 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1976
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1977 sub Same {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1978 my( $me )= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1979 $me->_ChkPos();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1980 return wantarray ? () : 0
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1981 if $me->[_Same] != ( 1 & $me->[_Pos] );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1982 return $me->Items(1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1983 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1984
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1985 my %getName;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1986 %getName= (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1987 same => \&Same,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1988 diff => \&Diff,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1989 base => \&Base,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1990 min => \&Min,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1991 max => \&Max,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1992 range=> \&Range,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1993 items=> \&Items, # same thing
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1994 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1995
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1996 sub Get
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1997 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1998 my $me= shift @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1999 $me->_ChkPos();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2000 my @value;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2001 for my $arg ( @_ ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2002 for my $word ( split ' ', $arg ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2003 my $meth;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2004 if( $word !~ /^(-?\d+)?([a-zA-Z]+)([12])?$/
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2005 || not $meth= $getName{ lc $2 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2006 ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2007 Die( $Root, ", Get: Invalid request ($word)" );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2008 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2009 my( $base, $name, $seq )= ( $1, $2, $3 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2010 push @value, scalar(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2011 4 == length($name)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2012 ? $meth->( $me )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2013 : $meth->( $me, $seq, $base )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2014 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2015 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2016 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2017 if( wantarray ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2018 return @value;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2019 } elsif( 1 == @value ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2020 return $value[0];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2021 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2022 Die( 0+@value, " values requested from ",
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2023 $Root, "'s Get in scalar context" );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2024 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2025
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2026
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2027 my $Obj= getObjPkg($Root);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2028 no strict 'refs';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2029
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2030 for my $meth ( qw( new getObjPkg ) ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2031 *{$Root."::".$meth} = \&{$meth};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2032 *{$Obj ."::".$meth} = \&{$meth};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2033 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2034 for my $meth ( qw(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2035 Next Prev Reset Copy Base Diff
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2036 Same Items Range Min Max Get
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2037 _ChkPos _ChkSeq
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2038 ) ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2039 *{$Obj."::".$meth} = \&{$meth};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2040 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2041
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2042 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2043 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2044 package Algorithm::LCSS;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2045
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2046 use strict;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2047 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2048 no strict 'refs';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2049 *traverse_sequences = \&Algorithm::Diff::traverse_sequences;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2050 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2051
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2052 sub _tokenize { [split //, $_[0]] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2053
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2054 sub CSS {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2055 my $is_array = ref $_[0] eq 'ARRAY' ? 1 : 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2056 my ( $seq1, $seq2, @match, $from_match );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2057 my $i = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2058 if ( $is_array ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2059 $seq1 = $_[0];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2060 $seq2 = $_[1];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2061 traverse_sequences( $seq1, $seq2, {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2062 MATCH => sub { push @{$match[$i]}, $seq1->[$_[0]]; $from_match = 1 },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2063 DISCARD_A => sub { do{$i++; $from_match = 0} if $from_match },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2064 DISCARD_B => sub { do{$i++; $from_match = 0} if $from_match },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2065 });
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2066 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2067 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2068 $seq1 = _tokenize($_[0]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2069 $seq2 = _tokenize($_[1]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2070 traverse_sequences( $seq1, $seq2, {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2071 MATCH => sub { $match[$i] .= $seq1->[$_[0]]; $from_match = 1 },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2072 DISCARD_A => sub { do{$i++; $from_match = 0} if $from_match },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2073 DISCARD_B => sub { do{$i++; $from_match = 0} if $from_match },
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2074 });
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2075 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2076 return \@match;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2077 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2078
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2079 sub CSS_Sorted {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2080 my $match = CSS(@_);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2081 if ( ref $_[0] eq 'ARRAY' ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2082 @$match = map{$_->[0]}sort{$b->[1]<=>$a->[1]}map{[$_,scalar(@$_)]}@$match
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2083 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2084 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2085 @$match = map{$_->[0]}sort{$b->[1]<=>$a->[1]}map{[$_,length($_)]}@$match
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2086 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2087 return $match;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2088 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2089
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2090 sub LCSS {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2091 my $is_array = ref $_[0] eq 'ARRAY' ? 1 : 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2092 my $css = CSS(@_);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2093 my $index;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2094 my $length = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2095 if ( $is_array ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2096 for( my $i = 0; $i < @$css; $i++ ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2097 next unless @{$css->[$i]}>$length;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2098 $index = $i;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2099 $length = @{$css->[$i]};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2100 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2101 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2102 else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2103 for( my $i = 0; $i < @$css; $i++ ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2104 next unless length($css->[$i])>$length;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2105 $index = $i;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2106 $length = length($css->[$i]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2107 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2108 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2109 return $css->[$index];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2110 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2111
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2112 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2113 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2114 #{{{ Class::Classless module
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2115 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2116 package Class::Classless;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2117 use strict;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2118 use vars qw(@ISA);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2119 use Carp;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2120
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2121 @ISA = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2122
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2123 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2124
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2125 @Class::Classless::X::ISA = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2126
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2127 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2128 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2129
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2130 sub Class::Classless::X::AUTOLOAD {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2131 # This's the big dispatcher.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2132
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2133 my $it = shift @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2134 my $m = ($Class::Classless::X::AUTOLOAD =~ m/([^:]+)$/s )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2135 ? $1 : $Class::Classless::X::AUTOLOAD;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2136
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2137 croak "Can't call Class::Classless methods (like $m) without an object"
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2138 unless ref $it; # sanity, basically.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2139
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2140 my $prevstate;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2141 $prevstate = ${shift @_}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2142 if scalar(@_) && defined($_[0]) &&
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2143 ref($_[0]) eq 'Class::Classless::CALLSTATE::SHIMMY'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2144 ; # A shim! we were called via $callstate->NEXT
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2145
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2146 my $no_fail = $prevstate ? $prevstate->[3] : undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2147 my $i = $prevstate ? ($prevstate->[1] + 1) : 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2148 # where to start scanning
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2149 my $lineage;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2150
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2151 # Get the linearization of the ISA tree
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2152 if($prevstate) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2153 $lineage = $prevstate->[2];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2154 } elsif(defined $it->{'ISA_CACHE'} and ref $it->{'ISA_CACHE'} ){
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2155 $lineage = $it->{'ISA_CACHE'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2156 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2157 $lineage = [ &Class::Classless::X::ISA_TREE($it) ];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2158 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2159
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2160 # Was:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2161 #my @lineage =
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2162 # $prevstate ? @{$prevstate->[2]}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2163 # : &Class::Classless::X::ISA_TREE($it);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2164 # # Get the linearization of the ISA tree
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2165 # # ISA-memoization happens in the ISA_TREE function.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2166
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2167 for(; $i < @$lineage; ++$i) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2168
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2169 if( !defined($no_fail) and exists($lineage->[$i]{'NO_FAIL'}) ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2170 $no_fail = ($lineage->[$i]{'NO_FAIL'} || 0);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2171 # so the first NO_FAIL sets it
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2172 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2173
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2174 if( ref($lineage->[$i]{'METHODS'} || 0) # sanity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2175 && exists($lineage->[$i]{'METHODS'}{$m})
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2176 ){
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2177 # We found what we were after. Now see what to do with it.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2178 my $v = $lineage->[$i]{'METHODS'}{$m};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2179 return $v unless defined $v and ref $v;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2180
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2181 if(ref($v) eq 'CODE') { # normal case, I expect!
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2182 # Used to have copying of the arglist here.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2183 # But it was apparently useless, so I deleted it
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2184 unshift @_,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2185 $it, # $_[0] -- target object
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2186 # a NEW callstate
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2187 bless([$m, $i, $lineage, $no_fail, $prevstate ? 1 : 0],
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2188 'Class::Classless::CALLSTATE'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2189 ), # $_[1] -- the callstate
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2190 ;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2191 goto &{ $v }; # yes, magic goto! bimskalabim!
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2192 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2193 return @$v if ref($v) eq '_deref_array';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2194 return $$v if ref($v) eq '_deref_scalar';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2195 return $v; # fallthru
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2196 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2197 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2198
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2199 if($m eq 'DESTROY') { # mitigate DESTROY-lookup failure at global destruction
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2200 # should be impossible
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2201 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2202 if($no_fail || 0) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2203 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2204 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2205 croak "Can't find ", $prevstate ? 'NEXT method' : 'method',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2206 " $m in ", $it->{'NAME'} || $it,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2207 " or any ancestors\n";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2208 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2209 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2210
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2211 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2212 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2213
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2214 sub Class::Classless::X::DESTROY {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2215 # noop
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2216 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2217
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2218 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2219 sub Class::Classless::X::ISA_TREE {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2220 # The linearizer!
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2221 # Returns the search path for $_[0], starting with $_[0]
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2222 # Possibly memoized.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2223
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2224 # I stopped being able to understand this algorithm about five
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2225 # minutes after I wrote it.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2226 use strict;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2227
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2228 my $set_cache = 0; # flag to set the cache on the way out
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2229
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2230 if(exists($_[0]{'ISA_CACHE'})) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2231 return @{$_[0]{'ISA_CACHE'}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2232 if defined $_[0]{'ISA_CACHE'}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2233 and ref $_[0]{'ISA_CACHE'};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2234
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2235 # Otherwise, if exists but is not a ref, it's a signal that it should
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2236 # be replaced at the earliest, with a listref
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2237 $set_cache = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2238 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2239
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2240 my $has_mi = 0; # set to 0 on the first node we see with 2 parents!
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2241 # First, just figure out what's in the tree.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2242 my %last_child = ($_[0] => 1); # as if already seen
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2243
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2244 # if $last_child{$x} == $y, that means:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2245 # 1) incidentally, we've passed the node $x before.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2246 # 2) $x is the last child of $y,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2247 # so that means that $y can be pushed to the stack only after
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2248 # we've pushed $x to the stack.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2249
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2250 my @tree_nodes;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2251 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2252 my $current;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2253 my @in_stack = ($_[0]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2254 while(@in_stack) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2255 next unless
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2256 defined($current = shift @in_stack)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2257 && ref($current) # sanity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2258 && ref($current->{'PARENTS'} || 0) # sanity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2259 ;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2260
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2261 push @tree_nodes, $current;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2262
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2263 $has_mi = 1 if @{$current->{'PARENTS'}} > 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2264 unshift
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2265 @in_stack,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2266 map {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2267 if(exists $last_child{$_}) { # seen before!
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2268 $last_child{$_} = $current;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2269 (); # seen -- don't re-explore
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2270 } else { # first time seen
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2271 $last_child{$_} = $current;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2272 $_; # first time seen -- explore now
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2273 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2274 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2275 @{$current->{'PARENTS'}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2276 ;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2277 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2278
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2279 # If there was no MI, then that first scan was sufficient.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2280 unless($has_mi) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2281 $_[0]{'ISA_CACHE'} = \@tree_nodes if $set_cache;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2282 return @tree_nodes;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2283 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2284
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2285 # Otherwise, toss this list and rescan, consulting %last_child
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2286 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2287
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2288 # $last_child{$parent} holds the last (or only) child of $parent
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2289 # in this tree. When walking the tree this time, only that
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2290 # child is authorized to put its parent on the @in_stack.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2291 # And that's the only way a node can get added to @in_stack,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2292 # except for $_[0] (the start node) being there at the beginning.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2293
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2294 # Now, walk again, but this time exploring parents the LAST
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2295 # time seen in the tree, not the first.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2296
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2297 my @out;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2298 {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2299 my $current;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2300 my @in_stack = ($_[0]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2301 while(@in_stack) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2302 next unless defined($current = shift @in_stack) && ref($current);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2303 push @out, $current; # finally.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2304 unshift
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2305 @in_stack,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2306 grep(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2307 (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2308 defined($_) # sanity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2309 && ref($_) # sanity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2310 && $last_child{$_} eq $current,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2311 ),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2312 # I'm lastborn (or onlyborn) of this parent
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2313 # so it's OK to explore now
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2314 @{$current->{'PARENTS'}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2315 )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2316 if ref($current->{'PARENTS'} || 0) # sanity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2317 ;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2318 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2319
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2320 unless(scalar(@out) == scalar(keys(%last_child))) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2321 # the counts should be equal
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2322 my %good_ones;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2323 @good_ones{@out} = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2324 croak
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2325 "ISA tree for " .
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2326 ($_[0]{'NAME'} || $_[0]) .
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2327 " is apparently cyclic, probably involving the nodes " .
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2328 nodelist( grep { ref($_) && !exists $good_ones{$_} }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2329 values(%last_child) )
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2330 . "\n";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2331 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2332 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2333 #print "Contents of out: ", nodelist(@out), "\n";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2334
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2335 $_[0]{'ISA_CACHE'} = \@out if $set_cache;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2336 return @out;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2337 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2338
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2339 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2340
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2341 sub Class::Classless::X::can { # NOT like UNIVERSAL::can ...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2342 # return 1 if $it is capable of the method given -- otherwise 0
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2343 my($it, $m) = @_[0,1];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2344 return undef unless ref $it;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2345
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2346 croak "undef is not a valid method name" unless defined($m);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2347 croak "null-string is not a valid method name" unless length($m);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2348
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2349 foreach my $o (&Class::Classless::X::ISA_TREE($it)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2350 return 1
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2351 if ref($o->{'METHODS'} || 0) # sanity
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2352 && exists $o->{'METHODS'}{$m};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2353 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2354
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2355 return 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2356 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2357
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2358
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2359 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2360
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2361 sub Class::Classless::X::isa { # Like UNIVERSAL::isa
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2362 # Returns true for $X->isa($Y) iff $Y is $X or is an ancestor of $X.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2363
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2364 return unless ref($_[0]) && ref($_[1]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2365 return scalar(grep {$_ eq $_[1]} &Class::Classless::X::ISA_TREE($_[0]));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2366 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2367
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2368 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2369
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2370 sub nodelist { join ', ', map { "" . ($_->{'NAME'} || $_) . ""} @_ }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2371
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2372 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2373 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2374 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2375 # Methods for the CALLSTATE class.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2376 # Basically, CALLSTATE objects represent the state of the dispatcher,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2377 # frozen at the moment when the method call was dispatched to the
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2378 # appropriate sub.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2379 # In the grand scheme of things, this needn't be a class -- I could
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2380 # have just made the callstate data-object be a hash with documented
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2381 # keys, or a closure that responded to only certain parameters,
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2382 # etc. But I like it this way. And I like being able to say simply
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2383 # $cs->NEXT
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2384 # Yes, these are a bit cryptically written, but it's behoovy for
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2385 # them to be very very efficient.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2386
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2387 @Class::Classless::ISA = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2388 sub Class::Classless::CALLSTATE::found_name { $_[0][0] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2389 # the method name called and found
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2390 sub Class::Classless::CALLSTATE::found_depth { $_[0][1] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2391 # my depth in the lineage
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2392 sub Class::Classless::CALLSTATE::lineage { @{$_[0][2]} }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2393 # my lineage
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2394 sub Class::Classless::CALLSTATE::target { $_[0][2][ 0 ] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2395 # the object that's the target -- same as $_[0] for the method called
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2396 sub Class::Classless::CALLSTATE::home { $_[0][2][ $_[0][1] ] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2397 # the object I was found in
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2398 sub Class::Classless::CALLSTATE::sub_found {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2399 $_[0][2][ $_[0][1] ]{'METHODS'}{ $_[0][0] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2400 } # the routine called
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2401
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2402 sub Class::Classless::CALLSTATE::no_fail { $_[0][3] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2403 sub Class::Classless::CALLSTATE::set_no_fail_true { $_[0][3] = 1 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2404 sub Class::Classless::CALLSTATE::set_fail_false { $_[0][3] = 0 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2405 sub Class::Classless::CALLSTATE::set_fail_undef { $_[0][3] = undef }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2406
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2407 sub Class::Classless::CALLSTATE::via_next { $_[0][4] }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2408
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2409 sub Class::Classless::CALLSTATE::NEXT {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2410 #croak "NEXT needs at least one argument: \$cs->NEXT('method'...)"
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2411 # unless @_ > 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2412 # no longer true.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2413 my $cs = shift @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2414 my $m = shift @_; # which may be (or come out) undef...
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2415 $m = $cs->[0] unless defined $m; # the method name called and found
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2416
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2417 ($cs->[2][0])->$m(
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2418 bless( \$cs, 'Class::Classless::CALLSTATE::SHIMMY' ),
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2419 @_
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2420 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2421 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2422
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2423 ###########################################################################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2424 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2425 #}}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2426
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2427 ###############
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2428 ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2429 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2430 # {{{ *** C h a n g e l o g ***
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2431 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2432 # 0.6ca
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2433 # - add screen support (from nicklist.pl)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2434 # - rename to adv_windowlist.pl (advanced window list) since it isn't just a
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2435 # window list status bar (wlstat) anymore
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2436 # - names can now have a max length and window names can be used
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2437 # - fixed a bug with block display in screen mode and statusbar mode
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2438 # - added space handling to ir_fe and removed it again
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2439 # - now handling formats on my own
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2440 # - added warning about missing sb_act_none abstract leading to
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2441 # - display*active settings
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2442 # - added warning about the bug in awl_display_(no)key_active settings
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2443 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2444 # 0.5d
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2445 # - add setting to also hide the last statusbar if empty (awl_all_disable)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2446 # - reverted to old utf8 code to also calculate broken utf8 length correctly
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2447 # - simplified dealing with statusbars in wlreset
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2448 # - added a little tweak for the renamed term_type somewhere after Irssi 0.8.9
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2449 # - fixed bug in handling channel #$$
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2450 # - typo on line 200 spotted by f0rked
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2451 # - reset background colour at the beginning of an entry
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2452 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2453 # 0.4d
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2454 # - fixed order of disabling statusbars
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2455 # - several attempts at special chars, without any real success
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2456 # and much more weird new bugs caused by this
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2457 # - setting to specify sort order
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2458 # - reduced timeout values
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2459 # - added awl_hide_data for Geert Hauwaerts ( [email protected] ) :)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2460 # - make it so the dynamic sub is actually deleted
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2461 # - fix a bug with removing of the last separator
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2462 # - take into consideration parse_special
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2463 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2464 # 0.3b
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2465 # - automatically kill old statusbars
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2466 # - reset on /reload
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2467 # - position/placement settings
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2468 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2469 # 0.2
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2470 # - automated retrieval of key bindings (thanks grep.pl authors)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2471 # - improved removing of statusbars
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2472 # - got rid of status chop
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2473 #
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2474 # 0.1
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2475 # - rewritten to suit my needs
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2476 # - based on chanact 0.5.5
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2477 # }}}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2478 # vim: se fdm=marker tw=80 :