Mercurial > dotfiles
comparison weechat/perl/buffers.pl @ 259:726728f13152
More Weechat plugins and config.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 21 Jan 2015 16:45:26 -0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
258:abb94e9f28d2 | 259:726728f13152 |
---|---|
1 # | |
2 # Copyright (C) 2008-2014 Sebastien Helleu <flashcode@flashtux.org> | |
3 # Copyright (C) 2011-2013 Nils G <weechatter@arcor.de> | |
4 # | |
5 # This program is free software; you can redistribute it and/or modify | |
6 # it under the terms of the GNU General Public License as published by | |
7 # the Free Software Foundation; either version 3 of the License, or | |
8 # (at your option) any later version. | |
9 # | |
10 # This program is distributed in the hope that it will be useful, | |
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 # GNU General Public License for more details. | |
14 # | |
15 # You should have received a copy of the GNU General Public License | |
16 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 # | |
18 # | |
19 # Display sidebar with list of buffers. | |
20 # | |
21 # History: | |
22 # | |
23 # 2014-12-12 | |
24 # v5.0: fix cropping non-latin buffer names | |
25 # 2014-08-29, Patrick Steinhardt <ps@pks.im>: | |
26 # v4.9: add support for specifying custom buffer names | |
27 # 2014-07-19, Sebastien Helleu <flashcode@flashtux.org>: | |
28 # v4.8: add support of ctrl + mouse wheel to jump to previous/next buffer, | |
29 # new option "mouse_wheel" | |
30 # 2014-06-22, Sebastien Helleu <flashcode@flashtux.org>: | |
31 # v4.7: fix typos in options | |
32 # 2014-04-05, Sebastien Helleu <flashcode@flashtux.org>: | |
33 # v4.6: add support of hidden buffers (WeeChat >= 0.4.4) | |
34 # 2014-01-01, Sebastien Helleu <flashcode@flashtux.org>: | |
35 # v4.5: add option "mouse_move_buffer" | |
36 # 2013-12-11, Sebastien Helleu <flashcode@flashtux.org>: | |
37 # v4.4: fix buffer number on drag to the end of list when option | |
38 # weechat.look.buffer_auto_renumber is off | |
39 # 2013-12-10, nils_2@freenode.#weechat: | |
40 # v4.3: add options "prefix_bufname" and "suffix_bufname (idea by silverd) | |
41 # : fix hook_timer() for show_lag wasn't disabled | |
42 # : improved signal handling (less updating of buffers list) | |
43 # 2013-11-07, Sebastien Helleu <flashcode@flashtux.org>: | |
44 # v4.2: use default filling "columns_vertical" when bar position is top/bottom | |
45 # 2013-10-31, nils_2@freenode.#weechat: | |
46 # v4.1: add option "detach_buffer_immediately" (idea by farn) | |
47 # 2013-10-20, nils_2@freenode.#weechat: | |
48 # v4.0: add options "detach_displayed_buffers", "detach_display_window_number" | |
49 # 2013-09-27, nils_2@freenode.#weechat: | |
50 # v3.9: add option "toggle_bar" and option "show_prefix_query" (idea by IvarB) | |
51 # : fix problem with linefeed at end of list of buffers (reported by grawity) | |
52 # 2012-10-18, nils_2@freenode.#weechat: | |
53 # v3.8: add option "mark_inactive", to mark buffers you are not in (idea by xrdodrx) | |
54 # : add wildcard "*" for immune_detach_buffers (idea by StarWeaver) | |
55 # : add new options "detach_query" and "detach_free_content" (idea by StarWeaver) | |
56 # 2012-10-06, Nei <anti.teamidiot.de>: | |
57 # v3.7: call menu on right mouse if menu script is loaded. | |
58 # 2012-10-06, nils_2 <weechatter@arcor.de>: | |
59 # v3.6: add new option "hotlist_counter" (idea by torque). | |
60 # 2012-06-02, nils_2 <weechatter@arcor.de>: | |
61 # v3.5: add values "server|channel|private|all|keepserver|none" to option "hide_merged_buffers" (suggested by dominikh). | |
62 # 2012-05-25, nils_2 <weechatter@arcor.de>: | |
63 # v3.4: add new option "show_lag". | |
64 # 2012-04-07, Sebastien Helleu <flashcode@flashtux.org>: | |
65 # v3.3: fix truncation of wide chars in buffer name (option name_size_max) (bug #36034) | |
66 # 2012-03-15, nils_2 <weechatter@arcor.de>: | |
67 # v3.2: add new option "detach"(weechat >= 0.3.8) | |
68 # add new option "immune_detach_buffers" (requested by Mkaysi) | |
69 # add new function buffers_whitelist add|del|reset (suggested by FiXato) | |
70 # add new function buffers_detach add|del|reset | |
71 # 2012-03-09, Sebastien Helleu <flashcode@flashtux.org>: | |
72 # v3.1: fix reload of config file | |
73 # 2012-01-29, nils_2 <weechatter@arcor.de>: | |
74 # v3.0: fix: buffers did not update directly during window_switch (reported by FiXato) | |
75 # 2012-01-29, nils_2 <weechatter@arcor.de>: | |
76 # v2.9: add options "name_size_max" and "name_crop_suffix" | |
77 # 2012-01-08, nils_2 <weechatter@arcor.de>: | |
78 # v2.8: fix indenting for option "show_number off" | |
79 # fix unset of buffer activity in hotlist when buffer was moved with mouse | |
80 # add buffer with free content and core buffer sorted first (suggested by nyuszika7h) | |
81 # add options queries_default_fg/bg and queries_message_fg/bg (suggested by FiXato) | |
82 # add clicking with left button on current buffer will do a jump_previously_visited_buffer (suggested by FiXato) | |
83 # add clicking with right button on current buffer will do a jump_next_visited_buffer | |
84 # add additional informations in help texts | |
85 # add default_fg and default_bg for whitelist channels | |
86 # internal changes (script is now 3Kb smaller) | |
87 # 2012-01-04, Sebastien Helleu <flashcode@flashtux.org>: | |
88 # v2.7: fix regex lookup in whitelist buffers list | |
89 # 2011-12-04, nils_2 <weechatter@arcor.de>: | |
90 # v2.6: add own config file (buffers.conf) | |
91 # add new behavior for indenting (under_name) | |
92 # add new option to set different color for server buffers and buffers with free content | |
93 # 2011-10-30, nils_2 <weechatter@arcor.de>: | |
94 # v2.5: add new options "show_number_char" and "color_number_char", | |
95 # add help-description for options | |
96 # 2011-08-24, Sebastien Helleu <flashcode@flashtux.org>: | |
97 # v2.4: add mouse support | |
98 # 2011-06-06, nils_2 <weechatter@arcor.de>: | |
99 # v2.3: added: missed option "color_whitelist_default" | |
100 # 2011-03-23, Sebastien Helleu <flashcode@flashtux.org>: | |
101 # v2.2: fix color of nick prefix with WeeChat >= 0.3.5 | |
102 # 2011-02-13, nils_2 <weechatter@arcor.de>: | |
103 # v2.1: add options "color_whitelist_*" | |
104 # 2010-10-05, Sebastien Helleu <flashcode@flashtux.org>: | |
105 # v2.0: add options "sort" and "show_number" | |
106 # 2010-04-12, Sebastien Helleu <flashcode@flashtux.org>: | |
107 # v1.9: replace call to log() by length() to align buffer numbers | |
108 # 2010-04-02, Sebastien Helleu <flashcode@flashtux.org>: | |
109 # v1.8: fix bug with background color and option indenting_number | |
110 # 2010-04-02, Helios <helios@efemes.de>: | |
111 # v1.7: add indenting_number option | |
112 # 2010-02-25, m4v <lambdae2@gmail.com>: | |
113 # v1.6: add option to hide empty prefixes | |
114 # 2010-02-12, Sebastien Helleu <flashcode@flashtux.org>: | |
115 # v1.5: add optional nick prefix for buffers like IRC channels | |
116 # 2009-09-30, Sebastien Helleu <flashcode@flashtux.org>: | |
117 # v1.4: remove spaces for indenting when bar position is top/bottom | |
118 # 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>: | |
119 # v1.3: add option "hide_merged_buffers" | |
120 # 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>: | |
121 # v1.2: improve display with merged buffers | |
122 # 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>: | |
123 # v1.1: sync with last API changes | |
124 # 2009-02-21, Sebastien Helleu <flashcode@flashtux.org>: | |
125 # v1.0: remove timer used to update bar item first time (not needed any more) | |
126 # 2009-02-17, Sebastien Helleu <flashcode@flashtux.org>: | |
127 # v0.9: fix bug with indenting of private buffers | |
128 # 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>: | |
129 # v0.8: update syntax for command /set (comments) | |
130 # 2008-10-20, Jiri Golembiovsky <golemj@gmail.com>: | |
131 # v0.7: add indenting option | |
132 # 2008-10-01, Sebastien Helleu <flashcode@flashtux.org>: | |
133 # v0.6: add default color for buffers, and color for current active buffer | |
134 # 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>: | |
135 # v0.5: fix color for "low" level entry in hotlist | |
136 # 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>: | |
137 # v0.4: rename option "show_category" to "short_names", | |
138 # remove option "color_slash" | |
139 # 2008-09-15, Sebastien Helleu <flashcode@flashtux.org>: | |
140 # v0.3: fix bug with priority in hotlist (var not defined) | |
141 # 2008-09-02, Sebastien Helleu <flashcode@flashtux.org>: | |
142 # v0.2: add color for buffers with activity and config options for | |
143 # colors, add config option to display/hide categories | |
144 # 2008-03-15, Sebastien Helleu <flashcode@flashtux.org>: | |
145 # v0.1: script creation | |
146 # | |
147 # Help about settings: | |
148 # display all settings for script (or use iset.pl script to change settings): | |
149 # /set buffers* | |
150 # show help text for option buffers.look.whitelist_buffers: | |
151 # /help buffers.look.whitelist_buffers | |
152 # | |
153 # Mouse-support (standard key bindings): | |
154 # left mouse-button: | |
155 # - click on a buffer to switch to selected buffer | |
156 # - click on current buffer will do action jump_previously_visited_buffer | |
157 # - drag a buffer and drop it on another position will move the buffer to position | |
158 # right mouse-button: | |
159 # - click on current buffer will do action jump_next_visited_buffer | |
160 # - moving buffer to the left/right will close buffer. | |
161 # | |
162 | |
163 use strict; | |
164 use Encode qw( decode encode ); | |
165 # -----------------------------[ internal ]------------------------------------- | |
166 my $SCRIPT_NAME = "buffers"; | |
167 my $SCRIPT_VERSION = "5.0"; | |
168 | |
169 my $BUFFERS_CONFIG_FILE_NAME = "buffers"; | |
170 my $buffers_config_file; | |
171 my $cmd_buffers_whitelist= "buffers_whitelist"; | |
172 my $cmd_buffers_detach = "buffers_detach"; | |
173 | |
174 my %mouse_keys = ("\@item(buffers):button1*" => "hsignal:buffers_mouse", | |
175 "\@item(buffers):button2*" => "hsignal:buffers_mouse", | |
176 "\@bar(buffers):ctrl-wheelup" => "hsignal:buffers_mouse", | |
177 "\@bar(buffers):ctrl-wheeldown" => "hsignal:buffers_mouse"); | |
178 my %options; | |
179 my %hotlist_level = (0 => "low", 1 => "message", 2 => "private", 3 => "highlight"); | |
180 my @whitelist_buffers = (); | |
181 my @immune_detach_buffers= (); | |
182 my @detach_buffer_immediately= (); | |
183 my @buffers_focus = (); | |
184 my %buffers_timer = (); | |
185 my %Hooks = (); | |
186 | |
187 # --------------------------------[ init ]-------------------------------------- | |
188 weechat::register($SCRIPT_NAME, "Sebastien Helleu <flashcode\@flashtux.org>", | |
189 $SCRIPT_VERSION, "GPL3", | |
190 "Sidebar with list of buffers", "shutdown_cb", ""); | |
191 my $weechat_version = weechat::info_get("version_number", "") || 0; | |
192 | |
193 buffers_config_init(); | |
194 buffers_config_read(); | |
195 | |
196 weechat::bar_item_new($SCRIPT_NAME, "build_buffers", ""); | |
197 weechat::bar_new($SCRIPT_NAME, "0", "0", "root", "", "left", "columns_vertical", | |
198 "vertical", "0", "0", "default", "default", "default", "1", | |
199 $SCRIPT_NAME); | |
200 | |
201 if ( check_bar_item() == 0 ) | |
202 { | |
203 weechat::command("", "/bar show " . $SCRIPT_NAME) if ( weechat::config_boolean($options{"toggle_bar"}) eq 1 ); | |
204 } | |
205 | |
206 weechat::hook_signal("buffer_opened", "buffers_signal_buffer", ""); | |
207 weechat::hook_signal("buffer_closed", "buffers_signal_buffer", ""); | |
208 weechat::hook_signal("buffer_merged", "buffers_signal_buffer", ""); | |
209 weechat::hook_signal("buffer_unmerged", "buffers_signal_buffer", ""); | |
210 weechat::hook_signal("buffer_moved", "buffers_signal_buffer", ""); | |
211 weechat::hook_signal("buffer_renamed", "buffers_signal_buffer", ""); | |
212 weechat::hook_signal("buffer_switch", "buffers_signal_buffer", ""); | |
213 weechat::hook_signal("buffer_hidden", "buffers_signal_buffer", ""); # WeeChat >= 0.4.4 | |
214 weechat::hook_signal("buffer_unhidden", "buffers_signal_buffer", ""); # WeeChat >= 0.4.4 | |
215 weechat::hook_signal("buffer_localvar_added", "buffers_signal_buffer", ""); | |
216 weechat::hook_signal("buffer_localvar_changed", "buffers_signal_buffer", ""); | |
217 | |
218 weechat::hook_signal("window_switch", "buffers_signal_buffer", ""); | |
219 weechat::hook_signal("hotlist_changed", "buffers_signal_hotlist", ""); | |
220 #weechat::hook_command_run("/input switch_active_*", "buffers_signal_buffer", ""); | |
221 weechat::bar_item_update($SCRIPT_NAME); | |
222 | |
223 | |
224 if ($weechat_version >= 0x00030600) | |
225 { | |
226 weechat::hook_focus($SCRIPT_NAME, "buffers_focus_buffers", ""); | |
227 weechat::hook_hsignal("buffers_mouse", "buffers_hsignal_mouse", ""); | |
228 weechat::key_bind("mouse", \%mouse_keys); | |
229 } | |
230 | |
231 weechat::hook_command($cmd_buffers_whitelist, | |
232 "add/del current buffer to/from buffers whitelist", | |
233 "[add] || [del] || [reset]", | |
234 " add: add current buffer in configuration file\n". | |
235 " del: delete current buffer from configuration file\n". | |
236 "reset: reset all buffers from configuration file ". | |
237 "(no confirmation!)\n\n". | |
238 "Examples:\n". | |
239 "/$cmd_buffers_whitelist add\n", | |
240 "add %-||". | |
241 "del %-||". | |
242 "reset %-", | |
243 "buffers_cmd_whitelist", ""); | |
244 weechat::hook_command($cmd_buffers_detach, | |
245 "add/del current buffer to/from buffers detach", | |
246 "[add] || [del] || [reset]", | |
247 " add: add current buffer in configuration file\n". | |
248 " del: delete current buffer from configuration file\n". | |
249 "reset: reset all buffers from configuration file ". | |
250 "(no confirmation!)\n\n". | |
251 "Examples:\n". | |
252 "/$cmd_buffers_detach add\n", | |
253 "add %-||". | |
254 "del %-||". | |
255 "reset %-", | |
256 "buffers_cmd_detach", ""); | |
257 | |
258 if ($weechat_version >= 0x00030800) | |
259 { | |
260 weechat::hook_config("buffers.look.detach", "hook_timer_detach", ""); | |
261 if (weechat::config_integer($options{"detach"}) > 0) | |
262 { | |
263 $Hooks{timer_detach} = weechat::hook_timer(weechat::config_integer($options{"detach"}) * 1000, | |
264 60, 0, "buffers_signal_hotlist", ""); | |
265 } | |
266 } | |
267 | |
268 weechat::hook_config("buffers.look.show_lag", "hook_timer_lag", ""); | |
269 | |
270 if (weechat::config_boolean($options{"show_lag"})) | |
271 { | |
272 $Hooks{timer_lag} = weechat::hook_timer( | |
273 weechat::config_integer(weechat::config_get("irc.network.lag_refresh_interval")) * 1000, | |
274 0, 0, "buffers_signal_hotlist", ""); | |
275 } | |
276 | |
277 # -------------------------------- [ command ] -------------------------------- | |
278 sub buffers_cmd_whitelist | |
279 { | |
280 my ( $data, $buffer, $args ) = @_; | |
281 $args = lc($args); | |
282 my $buffers_whitelist = weechat::config_string( weechat::config_get("buffers.look.whitelist_buffers") ); | |
283 return weechat::WEECHAT_RC_OK if ( $buffers_whitelist eq "" and $args eq "del" or $buffers_whitelist eq "" and $args eq "reset" ); | |
284 my @buffers_list = split( /,/, $buffers_whitelist ); | |
285 # get buffers name | |
286 my $infolist = weechat::infolist_get("buffer", weechat::current_buffer(), ""); | |
287 weechat::infolist_next($infolist); | |
288 my $buffers_name = weechat::infolist_string($infolist, "name"); | |
289 weechat::infolist_free($infolist); | |
290 return weechat::WEECHAT_RC_OK if ( $buffers_name eq "" ); # should never happen | |
291 | |
292 if ( $args eq "add" ) | |
293 { | |
294 return weechat::WEECHAT_RC_OK if ( grep /^$buffers_name$/, @buffers_list ); # check if buffer already in list | |
295 push @buffers_list, ( $buffers_name ); | |
296 my $buffers_list = &create_whitelist(\@buffers_list); | |
297 weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), $buffers_list, 1); | |
298 weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" added to buffers whitelist"); | |
299 } | |
300 elsif ( $args eq "del" ) | |
301 { | |
302 return weechat::WEECHAT_RC_OK unless ( grep /^$buffers_name$/, @buffers_list ); # check if buffer is in list | |
303 @buffers_list = grep {$_ ne $buffers_name} @buffers_list; # delete entry | |
304 my $buffers_list = &create_whitelist(\@buffers_list); | |
305 weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), $buffers_list, 1); | |
306 weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" deleted from buffers whitelist"); | |
307 } | |
308 elsif ( $args eq "reset" ) | |
309 { | |
310 return weechat::WEECHAT_RC_OK if ( $buffers_whitelist eq "" ); | |
311 weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), "", 1); | |
312 weechat::print(weechat::current_buffer(), "buffers whitelist is empty, now..."); | |
313 } | |
314 return weechat::WEECHAT_RC_OK; | |
315 } | |
316 sub buffers_cmd_detach | |
317 { | |
318 my ( $data, $buffer, $args ) = @_; | |
319 $args = lc($args); | |
320 my $immune_detach_buffers = weechat::config_string( weechat::config_get("buffers.look.immune_detach_buffers") ); | |
321 return weechat::WEECHAT_RC_OK if ( $immune_detach_buffers eq "" and $args eq "del" or $immune_detach_buffers eq "" and $args eq "reset" ); | |
322 | |
323 my @buffers_list = split( /,/, $immune_detach_buffers ); | |
324 # get buffers name | |
325 my $infolist = weechat::infolist_get("buffer", weechat::current_buffer(), ""); | |
326 weechat::infolist_next($infolist); | |
327 my $buffers_name = weechat::infolist_string($infolist, "name"); | |
328 weechat::infolist_free($infolist); | |
329 return weechat::WEECHAT_RC_OK if ( $buffers_name eq "" ); # should never happen | |
330 | |
331 if ( $args eq "add" ) | |
332 { | |
333 return weechat::WEECHAT_RC_OK if ( grep /^$buffers_name$/, @buffers_list ); # check if buffer already in list | |
334 push @buffers_list, ( $buffers_name ); | |
335 my $buffers_list = &create_whitelist(\@buffers_list); | |
336 weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), $buffers_list, 1); | |
337 weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" added to immune detach buffers"); | |
338 } | |
339 elsif ( $args eq "del" ) | |
340 { | |
341 return weechat::WEECHAT_RC_OK unless ( grep /^$buffers_name$/, @buffers_list ); # check if buffer is in list | |
342 @buffers_list = grep {$_ ne $buffers_name} @buffers_list; # delete entry | |
343 my $buffers_list = &create_whitelist(\@buffers_list); | |
344 weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), $buffers_list, 1); | |
345 weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" deleted from immune detach buffers"); | |
346 } | |
347 elsif ( $args eq "reset" ) | |
348 { | |
349 return weechat::WEECHAT_RC_OK if ( $immune_detach_buffers eq "" ); | |
350 weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), "", 1); | |
351 weechat::print(weechat::current_buffer(), "immune detach buffers is empty, now..."); | |
352 } | |
353 return weechat::WEECHAT_RC_OK; | |
354 } | |
355 | |
356 sub create_whitelist | |
357 { | |
358 my @buffers_list = @{$_[0]}; | |
359 my $buffers_list = ""; | |
360 foreach (@buffers_list) | |
361 { | |
362 $buffers_list .= $_ .","; | |
363 } | |
364 # remove last "," | |
365 chop $buffers_list; | |
366 return $buffers_list; | |
367 } | |
368 | |
369 # -------------------------------- [ config ] -------------------------------- | |
370 sub hook_timer_detach | |
371 { | |
372 my $detach = $_[2]; | |
373 if ( $detach eq 0 ) | |
374 { | |
375 weechat::unhook($Hooks{timer_detach}) if $Hooks{timer_detach}; | |
376 $Hooks{timer_detach} = ""; | |
377 } | |
378 else | |
379 { | |
380 weechat::unhook($Hooks{timer_detach}) if $Hooks{timer_detach}; | |
381 $Hooks{timer_detach} = weechat::hook_timer( weechat::config_integer( $options{"detach"}) * 1000, 60, 0, "buffers_signal_hotlist", ""); | |
382 } | |
383 weechat::bar_item_update($SCRIPT_NAME); | |
384 return weechat::WEECHAT_RC_OK; | |
385 } | |
386 | |
387 sub hook_timer_lag | |
388 { | |
389 my $lag = $_[2]; | |
390 if ( $lag eq "off" ) | |
391 { | |
392 weechat::unhook($Hooks{timer_lag}) if $Hooks{timer_lag}; | |
393 $Hooks{timer_lag} = ""; | |
394 } | |
395 else | |
396 { | |
397 weechat::unhook($Hooks{timer_lag}) if $Hooks{timer_lag}; | |
398 $Hooks{timer_lag} = weechat::hook_timer( weechat::config_integer(weechat::config_get("irc.network.lag_refresh_interval")) * 1000, 0, 0, "buffers_signal_hotlist", ""); | |
399 } | |
400 weechat::bar_item_update($SCRIPT_NAME); | |
401 return weechat::WEECHAT_RC_OK; | |
402 } | |
403 | |
404 sub buffers_config_read | |
405 { | |
406 return weechat::config_read($buffers_config_file) if ($buffers_config_file ne ""); | |
407 } | |
408 sub buffers_config_write | |
409 { | |
410 return weechat::config_write($buffers_config_file) if ($buffers_config_file ne ""); | |
411 } | |
412 sub buffers_config_reload_cb | |
413 { | |
414 my ($data, $config_file) = ($_[0], $_[1]); | |
415 return weechat::config_reload($config_file) | |
416 } | |
417 sub buffers_config_init | |
418 { | |
419 $buffers_config_file = weechat::config_new($BUFFERS_CONFIG_FILE_NAME, | |
420 "buffers_config_reload_cb", ""); | |
421 return if ($buffers_config_file eq ""); | |
422 | |
423 my %default_options_color = | |
424 ("color_current_fg" => [ | |
425 "current_fg", "color", | |
426 "foreground color for current buffer", | |
427 "", 0, 0, "lightcyan", "lightcyan", 0, | |
428 "", "", "buffers_signal_config", "", "", "" | |
429 ], | |
430 "color_current_bg" => [ | |
431 "current_bg", "color", | |
432 "background color for current buffer", | |
433 "", 0, 0, "red", "red", 0, | |
434 "", "", "buffers_signal_config", "", "", "" | |
435 ], | |
436 "color_default_fg" => [ | |
437 "default_fg", "color", | |
438 "default foreground color for buffer name", | |
439 "", 0, 0, "default", "default", 0, | |
440 "", "", "buffers_signal_config", "", "", "" | |
441 ], | |
442 "color_default_bg" => [ | |
443 "default_bg", "color", | |
444 "default background color for buffer name", | |
445 "", 0, 0, "default", "default", 0, | |
446 "", "", "buffers_signal_config", "", "", "" | |
447 ], | |
448 "color_hotlist_highlight_fg" => [ | |
449 "hotlist_highlight_fg", "color", | |
450 "change foreground color of buffer name if a highlight messaged received", | |
451 "", 0, 0, "magenta", "magenta", 0, | |
452 "", "", "buffers_signal_config", "", "", "" | |
453 ], | |
454 "color_hotlist_highlight_bg" => [ | |
455 "hotlist_highlight_bg", "color", | |
456 "change background color of buffer name if a highlight messaged received", | |
457 "", 0, 0, "default", "default", 0, | |
458 "", "", "buffers_signal_config", "", "", "" | |
459 ], | |
460 "color_hotlist_low_fg" => [ | |
461 "hotlist_low_fg", "color", | |
462 "change foreground color of buffer name if a low message received", | |
463 "", 0, 0, "white", "white", 0, | |
464 "", "", "buffers_signal_config", "", "", "" | |
465 ], | |
466 "color_hotlist_low_bg" => [ | |
467 "hotlist_low_bg", "color", | |
468 "change background color of buffer name if a low message received", | |
469 "", 0, 0, "default", "default", 0, | |
470 "", "", "buffers_signal_config", "", "", "" | |
471 ], | |
472 "color_hotlist_message_fg" => [ | |
473 "hotlist_message_fg", "color", | |
474 "change foreground color of buffer name if a normal message received", | |
475 "", 0, 0, "yellow", "yellow", 0, | |
476 "", "", "buffers_signal_config", "", "", "" | |
477 ], | |
478 "color_hotlist_message_bg" => [ | |
479 "hotlist_message_bg", "color", | |
480 "change background color of buffer name if a normal message received", | |
481 "", 0, 0, "default", "default", 0, | |
482 "", "", "buffers_signal_config", "", "", "" | |
483 ], | |
484 "color_hotlist_private_fg" => [ | |
485 "hotlist_private_fg", "color", | |
486 "change foreground color of buffer name if a private message received", | |
487 "", 0, 0, "lightgreen", "lightgreen", 0, | |
488 "", "", "buffers_signal_config", "", "", "" | |
489 ], | |
490 "color_hotlist_private_bg" => [ | |
491 "hotlist_private_bg", "color", | |
492 "change background color of buffer name if a private message received", | |
493 "", 0, 0, "default", "default", 0, | |
494 "", "", "buffers_signal_config", "", "", "" | |
495 ], | |
496 "color_number" => [ | |
497 "number", "color", | |
498 "color for buffer number", | |
499 "", 0, 0, "lightgreen", "lightgreen", 0, | |
500 "", "", "buffers_signal_config", "", "", "" | |
501 ], | |
502 "color_number_char" => [ | |
503 "number_char", "color", | |
504 "color for buffer number char", | |
505 "", 0, 0, "lightgreen", "lightgreen", 0, | |
506 "", "", "buffers_signal_config", "", "", "" | |
507 ], | |
508 "color_whitelist_default_fg" => [ | |
509 "whitelist_default_fg", "color", | |
510 "default foreground color for whitelist buffer name", | |
511 "", 0, 0, "", "", 0, | |
512 "", "", "buffers_signal_config", "", "", "" | |
513 ], | |
514 "color_whitelist_default_bg" => [ | |
515 "whitelist_default_bg", "color", | |
516 "default background color for whitelist buffer name", | |
517 "", 0, 0, "", "", 0, | |
518 "", "", "buffers_signal_config", "", "", "" | |
519 ], | |
520 "color_whitelist_low_fg" => [ | |
521 "whitelist_low_fg", "color", | |
522 "low color of whitelist buffer name", | |
523 "", 0, 0, "", "", 0, | |
524 "", "", "buffers_signal_config", "", "", "" | |
525 ], | |
526 "color_whitelist_low_bg" => [ | |
527 "whitelist_low_bg", "color", | |
528 "low color of whitelist buffer name", | |
529 "", 0, 0, "", "", 0, | |
530 "", "", "buffers_signal_config", "", "", "" | |
531 ], | |
532 "color_whitelist_message_fg" => [ | |
533 "whitelist_message_fg", "color", | |
534 "message color of whitelist buffer name", | |
535 "", 0, 0, "", "", 0, | |
536 "", "", "buffers_signal_config", "", "", "" | |
537 ], | |
538 "color_whitelist_message_bg" => [ | |
539 "whitelist_message_bg", "color", | |
540 "message color of whitelist buffer name", | |
541 "", 0, 0, "", "", 0, | |
542 "", "", "buffers_signal_config", "", "", "" | |
543 ], | |
544 "color_whitelist_private_fg" => [ | |
545 "whitelist_private_fg", "color", | |
546 "private color of whitelist buffer name", | |
547 "", 0, 0, "", "", 0, | |
548 "", "", "buffers_signal_config", "", "", "" | |
549 ], | |
550 "color_whitelist_private_bg" => [ | |
551 "whitelist_private_bg", "color", | |
552 "private color of whitelist buffer name", | |
553 "", 0, 0, "", "", 0, | |
554 "", "", "buffers_signal_config", "", "", "" | |
555 ], | |
556 "color_whitelist_highlight_fg" => [ | |
557 "whitelist_highlight_fg", "color", | |
558 "highlight color of whitelist buffer name", | |
559 "", 0, 0, "", "", 0, | |
560 "", "", "buffers_signal_config", "", "", "" | |
561 ], | |
562 "color_whitelist_highlight_bg" => [ | |
563 "whitelist_highlight_bg", "color", | |
564 "highlight color of whitelist buffer name", | |
565 "", 0, 0, "", "", 0, | |
566 "", "", "buffers_signal_config", "", "", "" | |
567 ], | |
568 "color_none_channel_fg" => [ | |
569 "none_channel_fg", "color", | |
570 "foreground color for none channel buffer (e.g.: core/server/plugin ". | |
571 "buffer)", | |
572 "", 0, 0, "default", "default", 0, | |
573 "", "", "buffers_signal_config", "", "", "" | |
574 ], | |
575 "color_none_channel_bg" => [ | |
576 "none_channel_bg", "color", | |
577 "background color for none channel buffer (e.g.: core/server/plugin ". | |
578 "buffer)", | |
579 "", 0, 0, "default", "default", 0, | |
580 "", "", "buffers_signal_config", "", "", "" | |
581 ], | |
582 "queries_default_fg" => [ | |
583 "queries_default_fg", "color", | |
584 "foreground color for query buffer without message", | |
585 "", 0, 0, "default", "default", 0, | |
586 "", "", "buffers_signal_config", "", "", "" | |
587 ], | |
588 "queries_default_bg" => [ | |
589 "queries_default_bg", "color", | |
590 "background color for query buffer without message", | |
591 "", 0, 0, "default", "default", 0, | |
592 "", "", "buffers_signal_config", "", "", "" | |
593 ], | |
594 "queries_message_fg" => [ | |
595 "queries_message_fg", "color", | |
596 "foreground color for query buffer with unread message", | |
597 "", 0, 0, "default", "default", 0, | |
598 "", "", "buffers_signal_config", "", "", "" | |
599 ], | |
600 "queries_message_bg" => [ | |
601 "queries_message_bg", "color", | |
602 "background color for query buffer with unread message", | |
603 "", 0, 0, "default", "default", 0, | |
604 "", "", "buffers_signal_config", "", "", "" | |
605 ], | |
606 "queries_highlight_fg" => [ | |
607 "queries_highlight_fg", "color", | |
608 "foreground color for query buffer with unread highlight", | |
609 "", 0, 0, "default", "default", 0, | |
610 "", "", "buffers_signal_config", "", "", "" | |
611 ], | |
612 "queries_highlight_bg" => [ | |
613 "queries_highlight_bg", "color", | |
614 "background color for query buffer with unread highlight", | |
615 "", 0, 0, "default", "default", 0, | |
616 "", "", "buffers_signal_config", "", "", "" | |
617 ], | |
618 "color_prefix_bufname" => [ | |
619 "prefix_bufname", "color", | |
620 "color for prefix of buffer name", | |
621 "", 0, 0, "default", "default", 0, | |
622 "", "", "buffers_signal_config", "", "", "" | |
623 ], | |
624 "color_suffix_bufname" => [ | |
625 "suffix_bufname", "color", | |
626 "color for suffix of buffer name", | |
627 "", 0, 0, "default", "default", 0, | |
628 "", "", "buffers_signal_config", "", "", "" | |
629 ], | |
630 ); | |
631 | |
632 my %default_options_look = | |
633 ( | |
634 "hotlist_counter" => [ | |
635 "hotlist_counter", "boolean", | |
636 "show number of message for the buffer (this option needs WeeChat >= ". | |
637 "0.3.5). The relevant option for notification is \"weechat.look.". | |
638 "buffer_notify_default\"", | |
639 "", 0, 0, "off", "off", 0, | |
640 "", "", "buffers_signal_config", "", "", "" | |
641 ], | |
642 "show_lag" => [ | |
643 "show_lag", "boolean", | |
644 "show lag behind server name. This option is using \"irc.color.". | |
645 "item_lag_finished\", ". | |
646 "\"irc.network.lag_min_show\" and \"irc.network.lag_refresh_interval\"", | |
647 "", 0, 0, "off", "off", 0, | |
648 "", "", "buffers_signal_config", "", "", "" | |
649 ], | |
650 "look_whitelist_buffers" => [ | |
651 "whitelist_buffers", "string", | |
652 "comma separated list of buffers for using a different color scheme ". | |
653 "(for example: freenode.#weechat,freenode.#weechat-fr)", | |
654 "", 0, 0, "", "", 0, | |
655 "", "", "buffers_signal_config_whitelist", "", "", "" | |
656 ], | |
657 "hide_merged_buffers" => [ | |
658 "hide_merged_buffers", "integer", | |
659 "hide merged buffers. The value determines which merged buffers should ". | |
660 "be hidden, keepserver meaning 'all except server buffers'. Other values ". | |
661 "correspondent to the buffer type.", | |
662 "server|channel|private|keepserver|all|none", 0, 0, "none", "none", 0, | |
663 "", "", "buffers_signal_config", "", "", "" | |
664 ], | |
665 "indenting" => [ | |
666 "indenting", "integer", "use indenting for channel and query buffers. ". | |
667 "This option only takes effect if bar is left/right positioned", | |
668 "off|on|under_name", 0, 0, "off", "off", 0, | |
669 "", "", "buffers_signal_config", "", "", "" | |
670 ], | |
671 "indenting_number" => [ | |
672 "indenting_number", "boolean", | |
673 "use indenting for numbers. This option only takes effect if bar is ". | |
674 "left/right positioned", | |
675 "", 0, 0, "on", "on", 0, | |
676 "", "", "buffers_signal_config", "", "", "" | |
677 ], | |
678 "short_names" => [ | |
679 "short_names", "boolean", | |
680 "display short names (remove text before first \".\" in buffer name)", | |
681 "", 0, 0, "on", "on", 0, | |
682 "", "", "buffers_signal_config", "", "", "" | |
683 ], | |
684 "show_number" => [ | |
685 "show_number", "boolean", | |
686 "display buffer number in front of buffer name", | |
687 "", 0, 0, "on", "on", 0, | |
688 "", "", "buffers_signal_config", "", "", "" | |
689 ], | |
690 "show_number_char" => [ | |
691 "number_char", "string", | |
692 "display a char behind buffer number", | |
693 "", 0, 0, ".", ".", 0, | |
694 "", "", "buffers_signal_config", "", "", "" | |
695 ], | |
696 "show_prefix_bufname" => [ | |
697 "prefix_bufname", "string", | |
698 "prefix displayed in front of buffer name", | |
699 "", 0, 0, "", "", 0, | |
700 "", "", "buffers_signal_config", "", "", "" | |
701 ], | |
702 "show_suffix_bufname" => [ | |
703 "suffix_bufname", "string", | |
704 "suffix displayed at end of buffer name", | |
705 "", 0, 0, "", "", 0, | |
706 "", "", "buffers_signal_config", "", "", "" | |
707 ], | |
708 "show_prefix" => [ | |
709 "prefix", "boolean", | |
710 "displays your prefix for channel in front of buffer name", | |
711 "", 0, 0, "off", "off", 0, | |
712 "", "", "buffers_signal_config", "", "", "" | |
713 ], | |
714 "show_prefix_empty" => [ | |
715 "prefix_empty", "boolean", | |
716 "use a placeholder for channels without prefix", | |
717 "", 0, 0, "on", "on", 0, | |
718 "", "", "buffers_signal_config", "", "", "" | |
719 ], | |
720 "show_prefix_query" => [ | |
721 "prefix_for_query", "string", | |
722 "prefix displayed in front of query buffer", | |
723 "", 0, 0, "", "", 0, | |
724 "", "", "buffers_signal_config", "", "", "" | |
725 ], | |
726 "sort" => [ | |
727 "sort", "integer", | |
728 "sort buffer-list by \"number\" or \"name\"", | |
729 "number|name", 0, 0, "number", "number", 0, | |
730 "", "", "buffers_signal_config", "", "", "" | |
731 ], | |
732 "core_to_front" => [ | |
733 "core_to_front", "boolean", | |
734 "core buffer and buffers with free content will be listed first. ". | |
735 "Take only effect if buffer sort is by name", | |
736 "", 0, 0, "off", "off", 0, | |
737 "", "", "buffers_signal_config", "", "", "" | |
738 ], | |
739 "jump_prev_next_visited_buffer" => [ | |
740 "jump_prev_next_visited_buffer", "boolean", | |
741 "jump to previously or next visited buffer if you click with ". | |
742 "left/right mouse button on currently visiting buffer", | |
743 "", 0, 0, "off", "off", 0, | |
744 "", "", "buffers_signal_config", "", "", "" | |
745 ], | |
746 "name_size_max" => [ | |
747 "name_size_max", "integer", | |
748 "maximum size of buffer name. 0 means no limitation", | |
749 "", 0, 256, 0, 0, 0, | |
750 "", "", "buffers_signal_config", "", "", "" | |
751 ], | |
752 "name_crop_suffix" => [ | |
753 "name_crop_suffix", "string", | |
754 "contains an optional char(s) that is appended when buffer name is ". | |
755 "shortened", | |
756 "", 0, 0, "+", "+", 0, | |
757 "", "", "buffers_signal_config", "", "", "" | |
758 ], | |
759 "detach" => [ | |
760 "detach", "integer", | |
761 "detach buffer from buffers list after a specific period of time ". | |
762 "(in seconds) without action (weechat ≥ 0.3.8 required) (0 means \"off\")", | |
763 "", 0, 31536000, 0, "number", 0, | |
764 "", "", "buffers_signal_config", "", "", "" | |
765 ], | |
766 "immune_detach_buffers" => [ | |
767 "immune_detach_buffers", "string", | |
768 "comma separated list of buffers to NOT automatically detach. ". | |
769 "Allows \"*\" wildcard. Ex: \"BitlBee,freenode.*\"", | |
770 "", 0, 0, "", "", 0, | |
771 "", "", "buffers_signal_config_immune_detach_buffers", "", "", "" | |
772 ], | |
773 "detach_query" => [ | |
774 "detach_query", "boolean", | |
775 "query buffer will be detached", | |
776 "", 0, 0, "off", "off", 0, | |
777 "", "", "buffers_signal_config", "", "", "" | |
778 ], | |
779 "detach_buffer_immediately" => [ | |
780 "detach_buffer_immediately", "string", | |
781 "comma separated list of buffers to detach immediately. A query and ". | |
782 "highlight message will attach buffer again. Allows \"*\" wildcard. ". | |
783 "Ex: \"BitlBee,freenode.*\"", | |
784 "", 0, 0, "", "", 0, | |
785 "", "", "buffers_signal_config_detach_buffer_immediately", "", "", "" | |
786 ], | |
787 "detach_free_content" => [ | |
788 "detach_free_content", "boolean", | |
789 "buffers with free content will be detached (Ex: iset, chanmon)", | |
790 "", 0, 0, "off", "off", 0, | |
791 "", "", "buffers_signal_config", "", "", "" | |
792 ], | |
793 "detach_displayed_buffers" => [ | |
794 "detach_displayed_buffers", "boolean", | |
795 "buffers displayed in a (split) window will be detached", | |
796 "", 0, 0, "on", "on", 0, | |
797 "", "", "buffers_signal_config", "", "", "" | |
798 ], | |
799 "detach_display_window_number" => [ | |
800 "detach_display_window_number", "boolean", | |
801 "window number will be add, behind buffer name (this option takes only ". | |
802 "effect with \"detach_displayed_buffers\" option)", | |
803 "", 0, 0, "off", "off", 0, | |
804 "", "", "buffers_signal_config", "", "", "" | |
805 ], | |
806 "mark_inactive" => [ | |
807 "mark_inactive", "boolean", | |
808 "if option is \"on\", inactive buffers (those you are not in) will have ". | |
809 "parentheses around them. An inactive buffer will not be detached.", | |
810 "", 0, 0, "off", "off", 0, | |
811 "", "", "buffers_signal_config", "", "", "" | |
812 ], | |
813 "toggle_bar" => [ | |
814 "toggle_bar", "boolean", | |
815 "if option is \"on\", buffers bar will hide/show when script is ". | |
816 "(un)loaded.", | |
817 "", 0, 0, "on", "on", 0, | |
818 "", "", "buffers_signal_config", "", "", "" | |
819 ], | |
820 "mouse_move_buffer" => [ | |
821 "mouse_move_buffer", "boolean", | |
822 "if option is \"on\", mouse gestures (drag & drop) can move buffers in list.", | |
823 "", 0, 0, "on", "on", 0, | |
824 "", "", "buffers_signal_config", "", "", "" | |
825 ], | |
826 "mouse_wheel" => [ | |
827 "mouse_wheel", "boolean", | |
828 "if option is \"on\", mouse wheel jumps to previous/next buffer in list.", | |
829 "", 0, 0, "on", "on", 0, | |
830 "", "", "buffers_signal_config", "", "", "" | |
831 ], | |
832 ); | |
833 # section "color" | |
834 my $section_color = weechat::config_new_section( | |
835 $buffers_config_file, | |
836 "color", 0, 0, "", "", "", "", "", "", "", "", "", ""); | |
837 if ($section_color eq "") | |
838 { | |
839 weechat::config_free($buffers_config_file); | |
840 return; | |
841 } | |
842 foreach my $option (keys %default_options_color) | |
843 { | |
844 $options{$option} = weechat::config_new_option( | |
845 $buffers_config_file, | |
846 $section_color, | |
847 $default_options_color{$option}[0], | |
848 $default_options_color{$option}[1], | |
849 $default_options_color{$option}[2], | |
850 $default_options_color{$option}[3], | |
851 $default_options_color{$option}[4], | |
852 $default_options_color{$option}[5], | |
853 $default_options_color{$option}[6], | |
854 $default_options_color{$option}[7], | |
855 $default_options_color{$option}[8], | |
856 $default_options_color{$option}[9], | |
857 $default_options_color{$option}[10], | |
858 $default_options_color{$option}[11], | |
859 $default_options_color{$option}[12], | |
860 $default_options_color{$option}[13], | |
861 $default_options_color{$option}[14]); | |
862 } | |
863 | |
864 # section "look" | |
865 my $section_look = weechat::config_new_section( | |
866 $buffers_config_file, | |
867 "look", 0, 0, "", "", "", "", "", "", "", "", "", ""); | |
868 if ($section_look eq "") | |
869 { | |
870 weechat::config_free($buffers_config_file); | |
871 return; | |
872 } | |
873 foreach my $option (keys %default_options_look) | |
874 { | |
875 $options{$option} = weechat::config_new_option( | |
876 $buffers_config_file, | |
877 $section_look, | |
878 $default_options_look{$option}[0], | |
879 $default_options_look{$option}[1], | |
880 $default_options_look{$option}[2], | |
881 $default_options_look{$option}[3], | |
882 $default_options_look{$option}[4], | |
883 $default_options_look{$option}[5], | |
884 $default_options_look{$option}[6], | |
885 $default_options_look{$option}[7], | |
886 $default_options_look{$option}[8], | |
887 $default_options_look{$option}[9], | |
888 $default_options_look{$option}[10], | |
889 $default_options_look{$option}[11], | |
890 $default_options_look{$option}[12], | |
891 $default_options_look{$option}[13], | |
892 $default_options_look{$option}[14], | |
893 $default_options_look{$option}[15]); | |
894 } | |
895 } | |
896 | |
897 sub build_buffers | |
898 { | |
899 my $str = ""; | |
900 | |
901 # get bar position (left/right/top/bottom) | |
902 my $position = "left"; | |
903 my $option_position = weechat::config_get("weechat.bar.buffers.position"); | |
904 if ($option_position ne "") | |
905 { | |
906 $position = weechat::config_string($option_position); | |
907 } | |
908 | |
909 # read hotlist | |
910 my %hotlist; | |
911 my $infolist = weechat::infolist_get("hotlist", "", ""); | |
912 while (weechat::infolist_next($infolist)) | |
913 { | |
914 $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")} = | |
915 weechat::infolist_integer($infolist, "priority"); | |
916 if ( weechat::config_boolean( $options{"hotlist_counter"} ) eq 1 and $weechat_version >= 0x00030500) | |
917 { | |
918 $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_00"} = | |
919 weechat::infolist_integer($infolist, "count_00"); # low message | |
920 $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_01"} = | |
921 weechat::infolist_integer($infolist, "count_01"); # channel message | |
922 $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_02"} = | |
923 weechat::infolist_integer($infolist, "count_02"); # private message | |
924 $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_03"} = | |
925 weechat::infolist_integer($infolist, "count_03"); # highlight message | |
926 } | |
927 } | |
928 weechat::infolist_free($infolist); | |
929 | |
930 # read buffers list | |
931 @buffers_focus = (); | |
932 my @buffers; | |
933 my @current1 = (); | |
934 my @current2 = (); | |
935 my $old_number = -1; | |
936 my $max_number = 0; | |
937 my $max_number_digits = 0; | |
938 my $active_seen = 0; | |
939 $infolist = weechat::infolist_get("buffer", "", ""); | |
940 while (weechat::infolist_next($infolist)) | |
941 { | |
942 # ignore hidden buffers (WeeChat >= 0.4.4) | |
943 if ($weechat_version >= 0x00040400) | |
944 { | |
945 next if (weechat::infolist_integer($infolist, "hidden")); | |
946 } | |
947 my $buffer; | |
948 my $number = weechat::infolist_integer($infolist, "number"); | |
949 if ($number ne $old_number) | |
950 { | |
951 @buffers = (@buffers, @current2, @current1); | |
952 @current1 = (); | |
953 @current2 = (); | |
954 $active_seen = 0; | |
955 } | |
956 if ($number > $max_number) | |
957 { | |
958 $max_number = $number; | |
959 } | |
960 $old_number = $number; | |
961 my $active = weechat::infolist_integer($infolist, "active"); | |
962 if ($active) | |
963 { | |
964 $active_seen = 1; | |
965 } | |
966 $buffer->{"pointer"} = weechat::infolist_pointer($infolist, "pointer"); | |
967 $buffer->{"number"} = $number; | |
968 $buffer->{"active"} = $active; | |
969 $buffer->{"current_buffer"} = weechat::infolist_integer($infolist, "current_buffer"); | |
970 $buffer->{"num_displayed"} = weechat::infolist_integer($infolist, "num_displayed"); | |
971 $buffer->{"plugin_name"} = weechat::infolist_string($infolist, "plugin_name"); | |
972 $buffer->{"name"} = weechat::infolist_string($infolist, "name"); | |
973 $buffer->{"short_name"} = weechat::infolist_string($infolist, "short_name"); | |
974 $buffer->{"full_name"} = $buffer->{"plugin_name"}.".".$buffer->{"name"}; | |
975 $buffer->{"type"} = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type"); | |
976 #weechat::print("", $buffer->{"type"}); | |
977 | |
978 # check if buffer is active (or maybe a /part, /kick channel) | |
979 if ($buffer->{"type"} eq "channel" and weechat::config_boolean( $options{"mark_inactive"} ) eq 1) | |
980 { | |
981 my $server = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_server"); | |
982 my $channel = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_channel"); | |
983 my $infolist_channel = weechat::infolist_get("irc_channel", "", $server.",".$channel); | |
984 if ($infolist_channel) | |
985 { | |
986 weechat::infolist_next($infolist_channel); | |
987 $buffer->{"nicks_count"} = weechat::infolist_integer($infolist_channel, "nicks_count"); | |
988 }else | |
989 { | |
990 $buffer->{"nicks_count"} = 0; | |
991 } | |
992 weechat::infolist_free($infolist_channel); | |
993 } | |
994 | |
995 my $result = check_immune_detached_buffers($buffer->{"name"}); # checking for wildcard | |
996 | |
997 next if ( check_detach_buffer_immediately($buffer->{"name"}) eq 1 | |
998 and $buffer->{"current_buffer"} eq 0 | |
999 and ( not exists $hotlist{$buffer->{"pointer"}} or $hotlist{$buffer->{"pointer"}} < 2) ); # checking for buffer to immediately detach | |
1000 | |
1001 unless ($result) | |
1002 { | |
1003 my $detach_time = weechat::config_integer( $options{"detach"}); | |
1004 my $current_time = time(); | |
1005 # set timer for buffers with no hotlist action | |
1006 $buffers_timer{$buffer->{"pointer"}} = $current_time | |
1007 if ( not exists $hotlist{$buffer->{"pointer"}} | |
1008 and $buffer->{"type"} eq "channel" | |
1009 and not exists $buffers_timer{$buffer->{"pointer"}} | |
1010 and $detach_time > 0); | |
1011 | |
1012 $buffers_timer{$buffer->{"pointer"}} = $current_time | |
1013 if (weechat::config_boolean($options{"detach_query"}) eq 1 | |
1014 and not exists $hotlist{$buffer->{"pointer"}} | |
1015 and $buffer->{"type"} eq "private" | |
1016 and not exists $buffers_timer{$buffer->{"pointer"}} | |
1017 and $detach_time > 0); | |
1018 | |
1019 $detach_time = 0 | |
1020 if (weechat::config_boolean($options{"detach_query"}) eq 0 | |
1021 and $buffer->{"type"} eq "private"); | |
1022 | |
1023 # free content buffer | |
1024 $buffers_timer{$buffer->{"pointer"}} = $current_time | |
1025 if (weechat::config_boolean($options{"detach_free_content"}) eq 1 | |
1026 and not exists $hotlist{$buffer->{"pointer"}} | |
1027 and $buffer->{"type"} eq "" | |
1028 and not exists $buffers_timer{$buffer->{"pointer"}} | |
1029 and $detach_time > 0); | |
1030 $detach_time = 0 | |
1031 if (weechat::config_boolean($options{"detach_free_content"}) eq 0 | |
1032 and $buffer->{"type"} eq ""); | |
1033 | |
1034 $detach_time = 0 if (weechat::config_boolean($options{"mark_inactive"}) eq 1 and defined $buffer->{"nicks_count"} and $buffer->{"nicks_count"} == 0); | |
1035 | |
1036 # check for detach | |
1037 unless ( $buffer->{"current_buffer"} eq 0 | |
1038 and not exists $hotlist{$buffer->{"pointer"}} | |
1039 # and $buffer->{"type"} eq "channel" | |
1040 and exists $buffers_timer{$buffer->{"pointer"}} | |
1041 and $detach_time > 0 | |
1042 and $weechat_version >= 0x00030800 | |
1043 and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time) | |
1044 { | |
1045 if ($active_seen) | |
1046 { | |
1047 push(@current2, $buffer); | |
1048 } | |
1049 else | |
1050 { | |
1051 push(@current1, $buffer); | |
1052 } | |
1053 } | |
1054 elsif ( $buffer->{"current_buffer"} eq 0 | |
1055 and not exists $hotlist{$buffer->{"pointer"}} | |
1056 # and $buffer->{"type"} eq "channel" | |
1057 and exists $buffers_timer{$buffer->{"pointer"}} | |
1058 and $detach_time > 0 | |
1059 and $weechat_version >= 0x00030800 | |
1060 and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time) | |
1061 { # check for option detach_displayed_buffers and if buffer is displayed in a split window | |
1062 if ( $buffer->{"num_displayed"} eq 1 | |
1063 and weechat::config_boolean($options{"detach_displayed_buffers"}) eq 0 ) | |
1064 { | |
1065 my $infolist_window = weechat::infolist_get("window", "", ""); | |
1066 while (weechat::infolist_next($infolist_window)) | |
1067 { | |
1068 my $buffer_ptr = weechat::infolist_pointer($infolist_window, "buffer"); | |
1069 if ($buffer_ptr eq $buffer->{"pointer"}) | |
1070 { | |
1071 $buffer->{"window"} = weechat::infolist_integer($infolist_window, "number"); | |
1072 } | |
1073 } | |
1074 weechat::infolist_free($infolist_window); | |
1075 | |
1076 push(@current2, $buffer); | |
1077 } | |
1078 } | |
1079 } | |
1080 else # buffer in "immune_detach_buffers" | |
1081 { | |
1082 if ($active_seen) | |
1083 { | |
1084 push(@current2, $buffer); | |
1085 } | |
1086 else | |
1087 { | |
1088 push(@current1, $buffer); | |
1089 } | |
1090 } | |
1091 } # while end | |
1092 | |
1093 | |
1094 if ($max_number >= 1) | |
1095 { | |
1096 $max_number_digits = length(int($max_number)); | |
1097 } | |
1098 @buffers = (@buffers, @current2, @current1); | |
1099 weechat::infolist_free($infolist); | |
1100 | |
1101 # sort buffers by number, name or shortname | |
1102 my %sorted_buffers; | |
1103 if (1) | |
1104 { | |
1105 my $number = 0; | |
1106 for my $buffer (@buffers) | |
1107 { | |
1108 my $key; | |
1109 if (weechat::config_integer( $options{"sort"} ) eq 1) # number = 0; name = 1 | |
1110 { | |
1111 my $name = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_custom_name"); | |
1112 if (not defined $name or $name eq "") { | |
1113 if (weechat::config_boolean( $options{"short_names"} ) eq 1) { | |
1114 $name = $buffer->{"short_name"}; | |
1115 } else { | |
1116 $name = $buffer->{"name"}; | |
1117 } | |
1118 } | |
1119 if (weechat::config_integer($options{"name_size_max"}) >= 1){ | |
1120 $name = encode("UTF-8", substr(decode("UTF-8", $name), 0, weechat::config_integer($options{"name_size_max"}))); | |
1121 } | |
1122 if ( weechat::config_boolean($options{"core_to_front"}) eq 1) | |
1123 { | |
1124 if ( (weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "channel" ) and ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "private") ) | |
1125 { | |
1126 my $type = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type"); | |
1127 if ( $type eq "" and $name ne "weechat") | |
1128 { | |
1129 $name = " " . $name | |
1130 }else | |
1131 { | |
1132 $name = " " . $name; | |
1133 } | |
1134 } | |
1135 } | |
1136 $key = sprintf("%s%08d", lc($name), $buffer->{"number"}); | |
1137 } | |
1138 else | |
1139 { | |
1140 $key = sprintf("%08d", $number); | |
1141 } | |
1142 $sorted_buffers{$key} = $buffer; | |
1143 $number++; | |
1144 } | |
1145 } | |
1146 | |
1147 # build string with buffers | |
1148 $old_number = -1; | |
1149 foreach my $key (sort keys %sorted_buffers) | |
1150 { | |
1151 my $buffer = $sorted_buffers{$key}; | |
1152 | |
1153 if ( weechat::config_string($options{"hide_merged_buffers"}) eq "server" ) | |
1154 { | |
1155 # buffer type "server" or merged with core? | |
1156 if ( ($buffer->{"type"} eq "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) ) | |
1157 { | |
1158 next; | |
1159 } | |
1160 } | |
1161 if ( weechat::config_string($options{"hide_merged_buffers"}) eq "channel" ) | |
1162 { | |
1163 # buffer type "channel" or merged with core? | |
1164 if ( ($buffer->{"type"} eq "channel" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) ) | |
1165 { | |
1166 next; | |
1167 } | |
1168 } | |
1169 if ( weechat::config_string($options{"hide_merged_buffers"}) eq "private" ) | |
1170 { | |
1171 # buffer type "private" or merged with core? | |
1172 if ( ($buffer->{"type"} eq "private" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) ) | |
1173 { | |
1174 next; | |
1175 } | |
1176 } | |
1177 if ( weechat::config_string($options{"hide_merged_buffers"}) eq "keepserver" ) | |
1178 { | |
1179 if ( ($buffer->{"type"} ne "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) ) | |
1180 { | |
1181 next; | |
1182 } | |
1183 } | |
1184 if ( weechat::config_string($options{"hide_merged_buffers"}) eq "all" ) | |
1185 { | |
1186 if ( ! $buffer->{"active"} ) | |
1187 { | |
1188 next; | |
1189 } | |
1190 } | |
1191 | |
1192 push(@buffers_focus, $buffer); # buffer > buffers_focus, for mouse support | |
1193 my $color = ""; | |
1194 my $bg = ""; | |
1195 | |
1196 $color = weechat::config_color( $options{"color_default_fg"} ); | |
1197 $bg = weechat::config_color( $options{"color_default_bg"} ); | |
1198 | |
1199 if ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "private" ) | |
1200 { | |
1201 if ( (weechat::config_color($options{"queries_default_bg"})) ne "default" || (weechat::config_color($options{"queries_default_fg"})) ne "default" ) | |
1202 { | |
1203 $bg = weechat::config_color( $options{"queries_default_bg"} ); | |
1204 $color = weechat::config_color( $options{"queries_default_fg"} ); | |
1205 } | |
1206 } | |
1207 # check for core and buffer with free content | |
1208 if ( (weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "channel" ) and ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "private") ) | |
1209 { | |
1210 $color = weechat::config_color( $options{"color_none_channel_fg"} ); | |
1211 $bg = weechat::config_color( $options{"color_none_channel_bg"} ); | |
1212 } | |
1213 # default whitelist buffer? | |
1214 if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers) | |
1215 { | |
1216 $color = weechat::config_color( $options{"color_whitelist_default_fg"} ); | |
1217 $bg = weechat::config_color( $options{"color_whitelist_default_bg"} ); | |
1218 } | |
1219 | |
1220 $color = "default" if ($color eq ""); | |
1221 | |
1222 # color for channel and query buffer | |
1223 if (exists $hotlist{$buffer->{"pointer"}}) | |
1224 { | |
1225 delete $buffers_timer{$buffer->{"pointer"}}; | |
1226 # check if buffer is in whitelist buffer | |
1227 if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers) | |
1228 { | |
1229 $bg = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} ); | |
1230 $color = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} ); | |
1231 } | |
1232 elsif ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "private" ) | |
1233 { | |
1234 # queries_default_fg/bg and buffers.color.queries_message_fg/bg | |
1235 if ( (weechat::config_color($options{"queries_highlight_fg"})) ne "default" || | |
1236 (weechat::config_color($options{"queries_highlight_bg"})) ne "default" || | |
1237 (weechat::config_color($options{"queries_message_fg"})) ne "default" || | |
1238 (weechat::config_color($options{"queries_message_bg"})) ne "default" ) | |
1239 { | |
1240 if ( ($hotlist{$buffer->{"pointer"}}) == 2 ) | |
1241 { | |
1242 $bg = weechat::config_color( $options{"queries_message_bg"} ); | |
1243 $color = weechat::config_color( $options{"queries_message_fg"} ); | |
1244 } | |
1245 | |
1246 elsif ( ($hotlist{$buffer->{"pointer"}}) == 3 ) | |
1247 { | |
1248 $bg = weechat::config_color( $options{"queries_highlight_bg"} ); | |
1249 $color = weechat::config_color( $options{"queries_highlight_fg"} ); | |
1250 } | |
1251 }else | |
1252 { | |
1253 $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} ); | |
1254 $color = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} ); | |
1255 } | |
1256 }else | |
1257 { | |
1258 $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} ); | |
1259 $color = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} ); | |
1260 } | |
1261 } | |
1262 | |
1263 if ($buffer->{"current_buffer"}) | |
1264 { | |
1265 $color = weechat::config_color( $options{"color_current_fg"} ); | |
1266 $bg = weechat::config_color( $options{"color_current_bg"} ); | |
1267 } | |
1268 my $color_bg = ""; | |
1269 $color_bg = weechat::color(",".$bg) if ($bg ne ""); | |
1270 | |
1271 # create channel number for output | |
1272 if ( weechat::config_string( $options{"show_prefix_bufname"} ) ne "" ) | |
1273 { | |
1274 $str .= $color_bg . | |
1275 weechat::color( weechat::config_color( $options{"color_prefix_bufname"} ) ). | |
1276 weechat::config_string( $options{"show_prefix_bufname"} ). | |
1277 weechat::color("default"); | |
1278 } | |
1279 | |
1280 if ( weechat::config_boolean( $options{"show_number"} ) eq 1 ) # on | |
1281 { | |
1282 if (( weechat::config_boolean( $options{"indenting_number"} ) eq 1) | |
1283 && (($position eq "left") || ($position eq "right"))) | |
1284 { | |
1285 $str .= weechat::color("default").$color_bg | |
1286 .(" " x ($max_number_digits - length(int($buffer->{"number"})))); | |
1287 } | |
1288 if ($old_number ne $buffer->{"number"}) | |
1289 { | |
1290 $str .= weechat::color( weechat::config_color( $options{"color_number"} ) ) | |
1291 .$color_bg | |
1292 .$buffer->{"number"} | |
1293 .weechat::color("default") | |
1294 .$color_bg | |
1295 .weechat::color( weechat::config_color( $options{"color_number_char"} ) ) | |
1296 .weechat::config_string( $options{"show_number_char"} ) | |
1297 .$color_bg; | |
1298 } | |
1299 else | |
1300 { | |
1301 my $indent = ""; | |
1302 $indent = ((" " x length($buffer->{"number"}))." ") if (($position eq "left") || ($position eq "right")); | |
1303 $str .= weechat::color("default") | |
1304 .$color_bg | |
1305 .$indent; | |
1306 } | |
1307 } | |
1308 | |
1309 if (( weechat::config_integer( $options{"indenting"} ) ne 0 ) # indenting NOT off | |
1310 && (($position eq "left") || ($position eq "right"))) | |
1311 { | |
1312 my $type = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type"); | |
1313 if (($type eq "channel") || ($type eq "private")) | |
1314 { | |
1315 if ( weechat::config_integer( $options{"indenting"} ) eq 1 ) | |
1316 { | |
1317 $str .= " "; | |
1318 } | |
1319 elsif ( (weechat::config_integer($options{"indenting"}) eq 2) and (weechat::config_integer($options{"indenting_number"}) eq 0) ) #under_name | |
1320 { | |
1321 if ( weechat::config_boolean( $options{"show_number"} ) eq 0 ) | |
1322 { | |
1323 $str .= " "; | |
1324 }else | |
1325 { | |
1326 $str .= ( (" " x ( $max_number_digits - length($buffer->{"number"}) ))." " ); | |
1327 } | |
1328 } | |
1329 } | |
1330 } | |
1331 | |
1332 $str .= weechat::config_string( $options{"show_prefix_query"}) if (weechat::config_string( $options{"show_prefix_query"} ) ne "" and $buffer->{"type"} eq "private"); | |
1333 | |
1334 if (weechat::config_boolean( $options{"show_prefix"} ) eq 1) | |
1335 { | |
1336 my $nickname = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_nick"); | |
1337 if ($nickname ne "") | |
1338 { | |
1339 # with version >= 0.3.2, this infolist will return only nick | |
1340 # with older versions, whole nicklist is returned for buffer, and this can be very slow | |
1341 my $infolist_nick = weechat::infolist_get("nicklist", $buffer->{"pointer"}, "nick_".$nickname); | |
1342 if ($infolist_nick ne "") | |
1343 { | |
1344 while (weechat::infolist_next($infolist_nick)) | |
1345 { | |
1346 if ((weechat::infolist_string($infolist_nick, "type") eq "nick") | |
1347 && (weechat::infolist_string($infolist_nick, "name") eq $nickname)) | |
1348 { | |
1349 my $prefix = weechat::infolist_string($infolist_nick, "prefix"); | |
1350 if (($prefix ne " ") or (weechat::config_boolean( $options{"show_prefix_empty"} ) eq 1)) | |
1351 { | |
1352 # with version >= 0.3.5, it is now a color name (for older versions: option name with color) | |
1353 if (int($weechat_version) >= 0x00030500) | |
1354 { | |
1355 $str .= weechat::color(weechat::infolist_string($infolist_nick, "prefix_color")); | |
1356 } | |
1357 else | |
1358 { | |
1359 $str .= weechat::color(weechat::config_color( | |
1360 weechat::config_get( | |
1361 weechat::infolist_string($infolist_nick, "prefix_color")))); | |
1362 } | |
1363 $str .= $prefix; | |
1364 } | |
1365 last; | |
1366 } | |
1367 } | |
1368 weechat::infolist_free($infolist_nick); | |
1369 } | |
1370 } | |
1371 } | |
1372 if ($buffer->{"type"} eq "channel" and weechat::config_boolean( $options{"mark_inactive"} ) eq 1 and $buffer->{"nicks_count"} == 0) | |
1373 { | |
1374 $str .= "("; | |
1375 } | |
1376 | |
1377 $str .= weechat::color($color) . weechat::color(",".$bg); | |
1378 | |
1379 my $name = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_custom_name"); | |
1380 if (not defined $name or $name eq "") | |
1381 { | |
1382 if (weechat::config_boolean( $options{"short_names"} ) eq 1) { | |
1383 $name = $buffer->{"short_name"}; | |
1384 } else { | |
1385 $name = $buffer->{"name"}; | |
1386 } | |
1387 } | |
1388 | |
1389 if (weechat::config_integer($options{"name_size_max"}) >= 1) # check max_size of buffer name | |
1390 { | |
1391 $name = decode("UTF-8", $name); | |
1392 $str .= encode("UTF-8", substr($name, 0, weechat::config_integer($options{"name_size_max"}))); | |
1393 $str .= weechat::color(weechat::config_color( $options{"color_number_char"})).weechat::config_string($options{"name_crop_suffix"}) if (length($name) > weechat::config_integer($options{"name_size_max"})); | |
1394 $str .= add_inactive_parentless($buffer->{"type"}, $buffer->{"nicks_count"}); | |
1395 $str .= add_hotlist_count($buffer->{"pointer"}, %hotlist); | |
1396 } | |
1397 else | |
1398 { | |
1399 $str .= $name; | |
1400 $str .= add_inactive_parentless($buffer->{"type"}, $buffer->{"nicks_count"}); | |
1401 $str .= add_hotlist_count($buffer->{"pointer"}, %hotlist); | |
1402 } | |
1403 | |
1404 if ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "server" and weechat::config_boolean($options{"show_lag"}) eq 1) | |
1405 { | |
1406 my $color_lag = weechat::config_color(weechat::config_get("irc.color.item_lag_finished")); | |
1407 my $min_lag = weechat::config_integer(weechat::config_get("irc.network.lag_min_show")); | |
1408 my $infolist_server = weechat::infolist_get("irc_server", "", $buffer->{"short_name"}); | |
1409 weechat::infolist_next($infolist_server); | |
1410 my $lag = (weechat::infolist_integer($infolist_server, "lag")); | |
1411 weechat::infolist_free($infolist_server); | |
1412 if ( int($lag) > int($min_lag) ) | |
1413 { | |
1414 $lag = $lag / 1000; | |
1415 $str .= weechat::color("default") . " (" . weechat::color($color_lag) . $lag . weechat::color("default") . ")"; | |
1416 } | |
1417 } | |
1418 if (weechat::config_boolean($options{"detach_displayed_buffers"}) eq 0 | |
1419 and weechat::config_boolean($options{"detach_display_window_number"}) eq 1) | |
1420 { | |
1421 if ($buffer->{"window"}) | |
1422 { | |
1423 $str .= weechat::color("default") . " (" . weechat::color(weechat::config_color( $options{"color_number"})) . $buffer->{"window"} . weechat::color("default") . ")"; | |
1424 } | |
1425 } | |
1426 $str .= weechat::color("default"); | |
1427 | |
1428 if ( weechat::config_string( $options{"show_suffix_bufname"} ) ne "" ) | |
1429 { | |
1430 $str .= weechat::color( weechat::config_color( $options{"color_suffix_bufname"} ) ). | |
1431 weechat::config_string( $options{"show_suffix_bufname"} ). | |
1432 weechat::color("default"); | |
1433 } | |
1434 | |
1435 $str .= "\n"; | |
1436 $old_number = $buffer->{"number"}; | |
1437 } | |
1438 | |
1439 # remove spaces and/or linefeed at the end | |
1440 $str =~ s/\s+$//; | |
1441 chomp($str); | |
1442 return $str; | |
1443 } | |
1444 | |
1445 sub add_inactive_parentless | |
1446 { | |
1447 my ($buf_type, $buf_nicks_count) = @_; | |
1448 my $str = ""; | |
1449 if ($buf_type eq "channel" and weechat::config_boolean( $options{"mark_inactive"} ) eq 1 and $buf_nicks_count == 0) | |
1450 { | |
1451 $str .= weechat::color(weechat::config_color( $options{"color_number_char"})); | |
1452 $str .= ")"; | |
1453 } | |
1454 return $str; | |
1455 } | |
1456 | |
1457 sub add_hotlist_count | |
1458 { | |
1459 my ($bufpointer, %hotlist) = @_; | |
1460 | |
1461 return "" if ( weechat::config_boolean( $options{"hotlist_counter"} ) eq 0 or ($weechat_version < 0x00030500)); # off | |
1462 my $col_number_char = weechat::color(weechat::config_color( $options{"color_number_char"}) ); | |
1463 my $str = " ".$col_number_char."("; | |
1464 | |
1465 # 0 = low level | |
1466 if (defined $hotlist{$bufpointer."_count_00"}) | |
1467 { | |
1468 my $bg = weechat::config_color( $options{"color_hotlist_low_bg"} ); | |
1469 my $color = weechat::config_color( $options{"color_hotlist_low_fg"} ); | |
1470 $str .= weechat::color($bg). | |
1471 weechat::color($color). | |
1472 $hotlist{$bufpointer."_count_00"} if ($hotlist{$bufpointer."_count_00"} ne "0"); | |
1473 } | |
1474 | |
1475 # 1 = message | |
1476 if (defined $hotlist{$bufpointer."_count_01"}) | |
1477 { | |
1478 my $bg = weechat::config_color( $options{"color_hotlist_message_bg"} ); | |
1479 my $color = weechat::config_color( $options{"color_hotlist_message_fg"} ); | |
1480 if ($str =~ /[0-9]$/) | |
1481 { | |
1482 $str .= ",". | |
1483 weechat::color($bg). | |
1484 weechat::color($color). | |
1485 $hotlist{$bufpointer."_count_01"} if ($hotlist{$bufpointer."_count_01"} ne "0"); | |
1486 }else | |
1487 { | |
1488 $str .= weechat::color($bg). | |
1489 weechat::color($color). | |
1490 $hotlist{$bufpointer."_count_01"} if ($hotlist{$bufpointer."_count_01"} ne "0"); | |
1491 } | |
1492 } | |
1493 # 2 = private | |
1494 if (defined $hotlist{$bufpointer."_count_02"}) | |
1495 { | |
1496 my $bg = weechat::config_color( $options{"color_hotlist_private_bg"} ); | |
1497 my $color = weechat::config_color( $options{"color_hotlist_private_fg"} ); | |
1498 if ($str =~ /[0-9]$/) | |
1499 { | |
1500 $str .= ",". | |
1501 weechat::color($bg). | |
1502 weechat::color($color). | |
1503 $hotlist{$bufpointer."_count_02"} if ($hotlist{$bufpointer."_count_02"} ne "0"); | |
1504 }else | |
1505 { | |
1506 $str .= weechat::color($bg). | |
1507 weechat::color($color). | |
1508 $hotlist{$bufpointer."_count_02"} if ($hotlist{$bufpointer."_count_02"} ne "0"); | |
1509 } | |
1510 } | |
1511 # 3 = highlight | |
1512 if (defined $hotlist{$bufpointer."_count_03"}) | |
1513 { | |
1514 my $bg = weechat::config_color( $options{"color_hotlist_highlight_bg"} ); | |
1515 my $color = weechat::config_color( $options{"color_hotlist_highlight_fg"} ); | |
1516 if ($str =~ /[0-9]$/) | |
1517 { | |
1518 $str .= ",". | |
1519 weechat::color($bg). | |
1520 weechat::color($color). | |
1521 $hotlist{$bufpointer."_count_03"} if ($hotlist{$bufpointer."_count_03"} ne "0"); | |
1522 }else | |
1523 { | |
1524 $str .= weechat::color($bg). | |
1525 weechat::color($color). | |
1526 $hotlist{$bufpointer."_count_03"} if ($hotlist{$bufpointer."_count_03"} ne "0"); | |
1527 } | |
1528 } | |
1529 $str .= $col_number_char. ")"; | |
1530 | |
1531 $str = "" if (weechat::string_remove_color($str, "") eq " ()"); # remove color and check for buffer with no messages | |
1532 return $str; | |
1533 } | |
1534 | |
1535 sub buffers_signal_buffer | |
1536 { | |
1537 my ($data, $signal, $signal_data) = @_; | |
1538 | |
1539 # check for buffer_switch and set or remove detach time | |
1540 if ($weechat_version >= 0x00030800) | |
1541 { | |
1542 if ($signal eq "buffer_switch") | |
1543 { | |
1544 my $pointer = weechat::hdata_get_list (weechat::hdata_get("buffer"), "gui_buffer_last_displayed"); # get switched buffer | |
1545 my $current_time = time(); | |
1546 if ( weechat::buffer_get_string($pointer, "localvar_type") eq "channel") | |
1547 { | |
1548 $buffers_timer{$pointer} = $current_time; | |
1549 } | |
1550 else | |
1551 { | |
1552 delete $buffers_timer{$pointer}; | |
1553 } | |
1554 } | |
1555 if ($signal eq "buffer_opened") | |
1556 { | |
1557 my $current_time = time(); | |
1558 $buffers_timer{$signal_data} = $current_time; | |
1559 } | |
1560 if ($signal eq "buffer_closing") | |
1561 { | |
1562 delete $buffers_timer{$signal_data}; | |
1563 } | |
1564 } | |
1565 weechat::bar_item_update($SCRIPT_NAME); | |
1566 return weechat::WEECHAT_RC_OK; | |
1567 } | |
1568 | |
1569 sub buffers_signal_hotlist | |
1570 { | |
1571 weechat::bar_item_update($SCRIPT_NAME); | |
1572 return weechat::WEECHAT_RC_OK; | |
1573 } | |
1574 | |
1575 | |
1576 sub buffers_signal_config_whitelist | |
1577 { | |
1578 @whitelist_buffers = (); | |
1579 @whitelist_buffers = split( /,/, weechat::config_string( $options{"look_whitelist_buffers"} ) ); | |
1580 weechat::bar_item_update($SCRIPT_NAME); | |
1581 return weechat::WEECHAT_RC_OK; | |
1582 } | |
1583 | |
1584 sub buffers_signal_config_immune_detach_buffers | |
1585 { | |
1586 @immune_detach_buffers = (); | |
1587 @immune_detach_buffers = split( /,/, weechat::config_string( $options{"immune_detach_buffers"} ) ); | |
1588 weechat::bar_item_update($SCRIPT_NAME); | |
1589 return weechat::WEECHAT_RC_OK; | |
1590 } | |
1591 | |
1592 sub buffers_signal_config_detach_buffer_immediately | |
1593 { | |
1594 @detach_buffer_immediately = (); | |
1595 @detach_buffer_immediately = split( /,/, weechat::config_string( $options{"detach_buffer_immediately"} ) ); | |
1596 weechat::bar_item_update($SCRIPT_NAME); | |
1597 return weechat::WEECHAT_RC_OK; | |
1598 } | |
1599 | |
1600 sub buffers_signal_config | |
1601 { | |
1602 weechat::bar_item_update($SCRIPT_NAME); | |
1603 return weechat::WEECHAT_RC_OK; | |
1604 } | |
1605 | |
1606 # called when mouse click occured in buffers item: this callback returns buffer | |
1607 # hash according to line of item where click occured | |
1608 sub buffers_focus_buffers | |
1609 { | |
1610 my %info = %{$_[1]}; | |
1611 my $item_line = int($info{"_bar_item_line"}); | |
1612 undef my $hash; | |
1613 if (($info{"_bar_item_name"} eq $SCRIPT_NAME) && ($item_line >= 0) && ($item_line <= $#buffers_focus)) | |
1614 { | |
1615 $hash = $buffers_focus[$item_line]; | |
1616 } | |
1617 else | |
1618 { | |
1619 $hash = {}; | |
1620 my $hash_focus = $buffers_focus[0]; | |
1621 foreach my $key (keys %$hash_focus) | |
1622 { | |
1623 $hash->{$key} = "?"; | |
1624 } | |
1625 } | |
1626 return $hash; | |
1627 } | |
1628 | |
1629 # called when a mouse action is done on buffers item, to execute action | |
1630 # possible actions: jump to a buffer or move buffer in list (drag & drop of buffer) | |
1631 sub buffers_hsignal_mouse | |
1632 { | |
1633 my ($data, $signal, %hash) = ($_[0], $_[1], %{$_[2]}); | |
1634 my $current_buffer = weechat::buffer_get_integer(weechat::current_buffer(), "number"); # get current buffer number | |
1635 | |
1636 if ( $hash{"_key"} eq "button1" ) | |
1637 { | |
1638 # left mouse button | |
1639 if ($hash{"number"} eq $hash{"number2"}) | |
1640 { | |
1641 if ( weechat::config_boolean($options{"jump_prev_next_visited_buffer"}) ) | |
1642 { | |
1643 if ( $current_buffer eq $hash{"number"} ) | |
1644 { | |
1645 weechat::command("", "/input jump_previously_visited_buffer"); | |
1646 } | |
1647 else | |
1648 { | |
1649 weechat::command("", "/buffer ".$hash{"full_name"}); | |
1650 } | |
1651 } | |
1652 else | |
1653 { | |
1654 weechat::command("", "/buffer ".$hash{"full_name"}); | |
1655 } | |
1656 } | |
1657 else | |
1658 { | |
1659 move_buffer(%hash) if (weechat::config_boolean($options{"mouse_move_buffer"})); | |
1660 } | |
1661 } | |
1662 elsif ( ($hash{"_key"} eq "button2") && (weechat::config_boolean($options{"jump_prev_next_visited_buffer"})) ) | |
1663 { | |
1664 # right mouse button | |
1665 if ( $current_buffer eq $hash{"number2"} ) | |
1666 { | |
1667 weechat::command("", "/input jump_next_visited_buffer"); | |
1668 } | |
1669 } | |
1670 elsif ( $hash{"_key"} =~ /wheelup$/ ) | |
1671 { | |
1672 # wheel up | |
1673 if (weechat::config_boolean($options{"mouse_wheel"})) | |
1674 { | |
1675 weechat::command("", "/buffer -1"); | |
1676 } | |
1677 } | |
1678 elsif ( $hash{"_key"} =~ /wheeldown$/ ) | |
1679 { | |
1680 # wheel down | |
1681 if (weechat::config_boolean($options{"mouse_wheel"})) | |
1682 { | |
1683 weechat::command("", "/buffer +1"); | |
1684 } | |
1685 } | |
1686 else | |
1687 { | |
1688 my $infolist = weechat::infolist_get("hook", "", "command,menu"); | |
1689 my $has_menu_command = weechat::infolist_next($infolist); | |
1690 weechat::infolist_free($infolist); | |
1691 | |
1692 if ( $has_menu_command && $hash{"_key"} =~ /button2/ ) | |
1693 { | |
1694 if ($hash{"number"} eq $hash{"number2"}) | |
1695 { | |
1696 weechat::command($hash{"pointer"}, "/menu buffer1 $hash{short_name} $hash{number}"); | |
1697 } | |
1698 else | |
1699 { | |
1700 weechat::command($hash{"pointer"}, "/menu buffer2 $hash{short_name}/$hash{short_name2} $hash{number} $hash{number2}") | |
1701 } | |
1702 } | |
1703 else | |
1704 { | |
1705 move_buffer(%hash) if (weechat::config_boolean($options{"mouse_move_buffer"})); | |
1706 } | |
1707 } | |
1708 } | |
1709 | |
1710 sub move_buffer | |
1711 { | |
1712 my %hash = @_; | |
1713 my $number2 = $hash{"number2"}; | |
1714 if ($number2 eq "?") | |
1715 { | |
1716 # if number 2 is not known (end of gesture outside buffers list), then set it | |
1717 # according to mouse gesture | |
1718 $number2 = "1"; | |
1719 if (($hash{"_key"} =~ /gesture-right/) || ($hash{"_key"} =~ /gesture-down/)) | |
1720 { | |
1721 $number2 = "999999"; | |
1722 if ($weechat_version >= 0x00030600) | |
1723 { | |
1724 my $hdata_buffer = weechat::hdata_get("buffer"); | |
1725 my $last_gui_buffer = weechat::hdata_get_list($hdata_buffer, "last_gui_buffer"); | |
1726 if ($last_gui_buffer) | |
1727 { | |
1728 $number2 = weechat::hdata_integer($hdata_buffer, $last_gui_buffer, "number") + 1; | |
1729 } | |
1730 } | |
1731 } | |
1732 } | |
1733 my $ptrbuf = weechat::current_buffer(); | |
1734 weechat::command($hash{"pointer"}, "/buffer move ".$number2); | |
1735 } | |
1736 | |
1737 sub check_immune_detached_buffers | |
1738 { | |
1739 my ($buffername) = @_; | |
1740 foreach ( @immune_detach_buffers ){ | |
1741 my $immune_buffer = weechat::string_mask_to_regex($_); | |
1742 if ($buffername =~ /^$immune_buffer$/i) | |
1743 { | |
1744 return 1; | |
1745 } | |
1746 } | |
1747 return 0; | |
1748 } | |
1749 | |
1750 sub check_detach_buffer_immediately | |
1751 { | |
1752 my ($buffername) = @_; | |
1753 foreach ( @detach_buffer_immediately ){ | |
1754 my $detach_buffer = weechat::string_mask_to_regex($_); | |
1755 if ($buffername =~ /^$detach_buffer$/i) | |
1756 { | |
1757 return 1; | |
1758 } | |
1759 } | |
1760 return 0; | |
1761 } | |
1762 | |
1763 sub shutdown_cb | |
1764 { | |
1765 weechat::command("", "/bar hide " . $SCRIPT_NAME) if ( weechat::config_boolean($options{"toggle_bar"}) eq 1 ); | |
1766 return weechat::WEECHAT_RC_OK | |
1767 } | |
1768 | |
1769 sub check_bar_item | |
1770 { | |
1771 my $item = 0; | |
1772 my $infolist = weechat::infolist_get("bar", "", ""); | |
1773 while (weechat::infolist_next($infolist)) | |
1774 { | |
1775 my $bar_items = weechat::infolist_string($infolist, "items"); | |
1776 if (index($bar_items, $SCRIPT_NAME) != -1) | |
1777 { | |
1778 my $name = weechat::infolist_string($infolist, "name"); | |
1779 if ($name ne $SCRIPT_NAME) | |
1780 { | |
1781 $item = 1; | |
1782 last; | |
1783 } | |
1784 } | |
1785 } | |
1786 weechat::infolist_free($infolist); | |
1787 return $item; | |
1788 } |