2 # Copyright (C) 2008-2014 Sebastien Helleu <flashcode@flashtux.org>
3 # Copyright (C) 2011-2013 Nils G <weechatter@arcor.de>
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.
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.
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/>.
19 # Display sidebar with list of buffers.
23 # 2014-08-29, Patrick Steinhardt <ps@pks.im>:
24 # v4.9: add support for specifying custom buffer names
25 # 2014-07-19, Sebastien Helleu <flashcode@flashtux.org>:
26 # v4.8: add support of ctrl + mouse wheel to jump to previous/next buffer,
27 # new option "mouse_wheel"
28 # 2014-06-22, Sebastien Helleu <flashcode@flashtux.org>:
29 # v4.7: fix typos in options
30 # 2014-04-05, Sebastien Helleu <flashcode@flashtux.org>:
31 # v4.6: add support of hidden buffers (WeeChat >= 0.4.4)
32 # 2014-01-01, Sebastien Helleu <flashcode@flashtux.org>:
33 # v4.5: add option "mouse_move_buffer"
34 # 2013-12-11, Sebastien Helleu <flashcode@flashtux.org>:
35 # v4.4: fix buffer number on drag to the end of list when option
36 # weechat.look.buffer_auto_renumber is off
37 # 2013-12-10, nils_2@freenode.#weechat:
38 # v4.3: add options "prefix_bufname" and "suffix_bufname (idea by silverd)
39 # : fix hook_timer() for show_lag wasn't disabled
40 # : improved signal handling (less updating of buffers list)
41 # 2013-11-07, Sebastien Helleu <flashcode@flashtux.org>:
42 # v4.2: use default filling "columns_vertical" when bar position is top/bottom
43 # 2013-10-31, nils_2@freenode.#weechat:
44 # v4.1: add option "detach_buffer_immediately" (idea by farn)
45 # 2013-10-20, nils_2@freenode.#weechat:
46 # v4.0: add options "detach_displayed_buffers", "detach_display_window_number"
47 # 2013-09-27, nils_2@freenode.#weechat:
48 # v3.9: add option "toggle_bar" and option "show_prefix_query" (idea by IvarB)
49 # : fix problem with linefeed at end of list of buffers (reported by grawity)
50 # 2012-10-18, nils_2@freenode.#weechat:
51 # v3.8: add option "mark_inactive", to mark buffers you are not in (idea by xrdodrx)
52 # : add wildcard "*" for immune_detach_buffers (idea by StarWeaver)
53 # : add new options "detach_query" and "detach_free_content" (idea by StarWeaver)
54 # 2012-10-06, Nei <anti.teamidiot.de>:
55 # v3.7: call menu on right mouse if menu script is loaded.
56 # 2012-10-06, nils_2 <weechatter@arcor.de>:
57 # v3.6: add new option "hotlist_counter" (idea by torque).
58 # 2012-06-02, nils_2 <weechatter@arcor.de>:
59 # v3.5: add values "server|channel|private|all|keepserver|none" to option "hide_merged_buffers" (suggested by dominikh).
60 # 2012-05-25, nils_2 <weechatter@arcor.de>:
61 # v3.4: add new option "show_lag".
62 # 2012-04-07, Sebastien Helleu <flashcode@flashtux.org>:
63 # v3.3: fix truncation of wide chars in buffer name (option name_size_max) (bug #36034)
64 # 2012-03-15, nils_2 <weechatter@arcor.de>:
65 # v3.2: add new option "detach"(weechat >= 0.3.8)
66 # add new option "immune_detach_buffers" (requested by Mkaysi)
67 # add new function buffers_whitelist add|del|reset (suggested by FiXato)
68 # add new function buffers_detach add|del|reset
69 # 2012-03-09, Sebastien Helleu <flashcode@flashtux.org>:
70 # v3.1: fix reload of config file
71 # 2012-01-29, nils_2 <weechatter@arcor.de>:
72 # v3.0: fix: buffers did not update directly during window_switch (reported by FiXato)
73 # 2012-01-29, nils_2 <weechatter@arcor.de>:
74 # v2.9: add options "name_size_max" and "name_crop_suffix"
75 # 2012-01-08, nils_2 <weechatter@arcor.de>:
76 # v2.8: fix indenting for option "show_number off"
77 # fix unset of buffer activity in hotlist when buffer was moved with mouse
78 # add buffer with free content and core buffer sorted first (suggested by nyuszika7h)
79 # add options queries_default_fg/bg and queries_message_fg/bg (suggested by FiXato)
80 # add clicking with left button on current buffer will do a jump_previously_visited_buffer (suggested by FiXato)
81 # add clicking with right button on current buffer will do a jump_next_visited_buffer
82 # add additional informations in help texts
83 # add default_fg and default_bg for whitelist channels
84 # internal changes (script is now 3Kb smaller)
85 # 2012-01-04, Sebastien Helleu <flashcode@flashtux.org>:
86 # v2.7: fix regex lookup in whitelist buffers list
87 # 2011-12-04, nils_2 <weechatter@arcor.de>:
88 # v2.6: add own config file (buffers.conf)
89 # add new behavior for indenting (under_name)
90 # add new option to set different color for server buffers and buffers with free content
91 # 2011-10-30, nils_2 <weechatter@arcor.de>:
92 # v2.5: add new options "show_number_char" and "color_number_char",
93 # add help-description for options
94 # 2011-08-24, Sebastien Helleu <flashcode@flashtux.org>:
95 # v2.4: add mouse support
96 # 2011-06-06, nils_2 <weechatter@arcor.de>:
97 # v2.3: added: missed option "color_whitelist_default"
98 # 2011-03-23, Sebastien Helleu <flashcode@flashtux.org>:
99 # v2.2: fix color of nick prefix with WeeChat >= 0.3.5
100 # 2011-02-13, nils_2 <weechatter@arcor.de>:
101 # v2.1: add options "color_whitelist_*"
102 # 2010-10-05, Sebastien Helleu <flashcode@flashtux.org>:
103 # v2.0: add options "sort" and "show_number"
104 # 2010-04-12, Sebastien Helleu <flashcode@flashtux.org>:
105 # v1.9: replace call to log() by length() to align buffer numbers
106 # 2010-04-02, Sebastien Helleu <flashcode@flashtux.org>:
107 # v1.8: fix bug with background color and option indenting_number
108 # 2010-04-02, Helios <helios@efemes.de>:
109 # v1.7: add indenting_number option
110 # 2010-02-25, m4v <lambdae2@gmail.com>:
111 # v1.6: add option to hide empty prefixes
112 # 2010-02-12, Sebastien Helleu <flashcode@flashtux.org>:
113 # v1.5: add optional nick prefix for buffers like IRC channels
114 # 2009-09-30, Sebastien Helleu <flashcode@flashtux.org>:
115 # v1.4: remove spaces for indenting when bar position is top/bottom
116 # 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
117 # v1.3: add option "hide_merged_buffers"
118 # 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
119 # v1.2: improve display with merged buffers
120 # 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
121 # v1.1: sync with last API changes
122 # 2009-02-21, Sebastien Helleu <flashcode@flashtux.org>:
123 # v1.0: remove timer used to update bar item first time (not needed any more)
124 # 2009-02-17, Sebastien Helleu <flashcode@flashtux.org>:
125 # v0.9: fix bug with indenting of private buffers
126 # 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
127 # v0.8: update syntax for command /set (comments)
128 # 2008-10-20, Jiri Golembiovsky <golemj@gmail.com>:
129 # v0.7: add indenting option
130 # 2008-10-01, Sebastien Helleu <flashcode@flashtux.org>:
131 # v0.6: add default color for buffers, and color for current active buffer
132 # 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
133 # v0.5: fix color for "low" level entry in hotlist
134 # 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
135 # v0.4: rename option "show_category" to "short_names",
136 # remove option "color_slash"
137 # 2008-09-15, Sebastien Helleu <flashcode@flashtux.org>:
138 # v0.3: fix bug with priority in hotlist (var not defined)
139 # 2008-09-02, Sebastien Helleu <flashcode@flashtux.org>:
140 # v0.2: add color for buffers with activity and config options for
141 # colors, add config option to display/hide categories
142 # 2008-03-15, Sebastien Helleu <flashcode@flashtux.org>:
143 # v0.1: script creation
145 # Help about settings:
146 # display all settings for script (or use iset.pl script to change settings):
148 # show help text for option buffers.look.whitelist_buffers:
149 # /help buffers.look.whitelist_buffers
151 # Mouse-support (standard key bindings):
153 # - click on a buffer to switch to selected buffer
154 # - click on current buffer will do action jump_previously_visited_buffer
155 # - drag a buffer and drop it on another position will move the buffer to position
156 # right mouse-button:
157 # - click on current buffer will do action jump_next_visited_buffer
158 # - moving buffer to the left/right will close buffer.
162 use Encode
qw( decode encode );
163 # -----------------------------[ internal ]-------------------------------------
164 my $SCRIPT_NAME = "buffers";
165 my $SCRIPT_VERSION = "4.9";
167 my $BUFFERS_CONFIG_FILE_NAME = "buffers";
168 my $buffers_config_file;
169 my $cmd_buffers_whitelist= "buffers_whitelist";
170 my $cmd_buffers_detach = "buffers_detach";
172 my %mouse_keys = ("\@item(buffers):button1*" => "hsignal:buffers_mouse",
173 "\@item(buffers):button2*" => "hsignal:buffers_mouse",
174 "\@bar(buffers):ctrl-wheelup" => "hsignal:buffers_mouse",
175 "\@bar(buffers):ctrl-wheeldown" => "hsignal:buffers_mouse");
177 my %hotlist_level = (0 => "low", 1 => "message", 2 => "private", 3 => "highlight");
178 my @whitelist_buffers = ();
179 my @immune_detach_buffers= ();
180 my @detach_buffer_immediately= ();
181 my @buffers_focus = ();
182 my %buffers_timer = ();
185 # --------------------------------[ init ]--------------------------------------
186 weechat
::register
($SCRIPT_NAME, "Sebastien Helleu <flashcode\@flashtux.org>",
187 $SCRIPT_VERSION, "GPL3",
188 "Sidebar with list of buffers", "shutdown_cb", "");
189 my $weechat_version = weechat
::info_get
("version_number", "") || 0;
191 buffers_config_init
();
192 buffers_config_read
();
194 weechat
::bar_item_new
($SCRIPT_NAME, "build_buffers", "");
195 weechat
::bar_new
($SCRIPT_NAME, "0", "0", "root", "", "left", "columns_vertical",
196 "vertical", "0", "0", "default", "default", "default", "1",
199 if ( check_bar_item
() == 0 )
201 weechat
::command
("", "/bar show " . $SCRIPT_NAME) if ( weechat
::config_boolean
($options{"toggle_bar"}) eq 1 );
204 weechat
::hook_signal
("buffer_opened", "buffers_signal_buffer", "");
205 weechat
::hook_signal
("buffer_closed", "buffers_signal_buffer", "");
206 weechat
::hook_signal
("buffer_merged", "buffers_signal_buffer", "");
207 weechat
::hook_signal
("buffer_unmerged", "buffers_signal_buffer", "");
208 weechat
::hook_signal
("buffer_moved", "buffers_signal_buffer", "");
209 weechat
::hook_signal
("buffer_renamed", "buffers_signal_buffer", "");
210 weechat
::hook_signal
("buffer_switch", "buffers_signal_buffer", "");
211 weechat
::hook_signal
("buffer_hidden", "buffers_signal_buffer", ""); # WeeChat >= 0.4.4
212 weechat
::hook_signal
("buffer_unhidden", "buffers_signal_buffer", ""); # WeeChat >= 0.4.4
213 weechat
::hook_signal
("buffer_localvar_added", "buffers_signal_buffer", "");
214 weechat
::hook_signal
("buffer_localvar_changed", "buffers_signal_buffer", "");
216 weechat
::hook_signal
("window_switch", "buffers_signal_buffer", "");
217 weechat
::hook_signal
("hotlist_changed", "buffers_signal_hotlist", "");
218 #weechat::hook_command_run("/input switch_active_*", "buffers_signal_buffer", "");
219 weechat
::bar_item_update
($SCRIPT_NAME);
222 if ($weechat_version >= 0x00030600)
224 weechat
::hook_focus
($SCRIPT_NAME, "buffers_focus_buffers", "");
225 weechat
::hook_hsignal
("buffers_mouse", "buffers_hsignal_mouse", "");
226 weechat
::key_bind
("mouse", \
%mouse_keys);
229 weechat
::hook_command
($cmd_buffers_whitelist,
230 "add/del current buffer to/from buffers whitelist",
231 "[add] || [del] || [reset]",
232 " add: add current buffer in configuration file\n".
233 " del: delete current buffer from configuration file\n".
234 "reset: reset all buffers from configuration file ".
235 "(no confirmation!)\n\n".
237 "/$cmd_buffers_whitelist add\n",
241 "buffers_cmd_whitelist", "");
242 weechat
::hook_command
($cmd_buffers_detach,
243 "add/del current buffer to/from buffers detach",
244 "[add] || [del] || [reset]",
245 " add: add current buffer in configuration file\n".
246 " del: delete current buffer from configuration file\n".
247 "reset: reset all buffers from configuration file ".
248 "(no confirmation!)\n\n".
250 "/$cmd_buffers_detach add\n",
254 "buffers_cmd_detach", "");
256 if ($weechat_version >= 0x00030800)
258 weechat
::hook_config
("buffers.look.detach", "hook_timer_detach", "");
259 if (weechat
::config_integer
($options{"detach"}) > 0)
261 $Hooks{timer_detach
} = weechat
::hook_timer
(weechat
::config_integer
($options{"detach"}) * 1000,
262 60, 0, "buffers_signal_hotlist", "");
266 weechat
::hook_config
("buffers.look.show_lag", "hook_timer_lag", "");
268 if (weechat
::config_boolean
($options{"show_lag"}))
270 $Hooks{timer_lag
} = weechat
::hook_timer
(
271 weechat
::config_integer
(weechat
::config_get
("irc.network.lag_refresh_interval")) * 1000,
272 0, 0, "buffers_signal_hotlist", "");
275 # -------------------------------- [ command ] --------------------------------
276 sub buffers_cmd_whitelist
278 my ( $data, $buffer, $args ) = @_;
280 my $buffers_whitelist = weechat
::config_string
( weechat
::config_get
("buffers.look.whitelist_buffers") );
281 return weechat
::WEECHAT_RC_OK
if ( $buffers_whitelist eq "" and $args eq "del" or $buffers_whitelist eq "" and $args eq "reset" );
282 my @buffers_list = split( /,/, $buffers_whitelist );
284 my $infolist = weechat
::infolist_get
("buffer", weechat
::current_buffer
(), "");
285 weechat
::infolist_next
($infolist);
286 my $buffers_name = weechat
::infolist_string
($infolist, "name");
287 weechat
::infolist_free
($infolist);
288 return weechat
::WEECHAT_RC_OK
if ( $buffers_name eq "" ); # should never happen
290 if ( $args eq "add" )
292 return weechat
::WEECHAT_RC_OK
if ( grep /^$buffers_name$/, @buffers_list ); # check if buffer already in list
293 push @buffers_list, ( $buffers_name );
294 my $buffers_list = &create_whitelist
(\
@buffers_list);
295 weechat
::config_option_set
( weechat
::config_get
("buffers.look.whitelist_buffers"), $buffers_list, 1);
296 weechat
::print(weechat
::current_buffer
(), "buffer \"$buffers_name\" added to buffers whitelist");
298 elsif ( $args eq "del" )
300 return weechat
::WEECHAT_RC_OK
unless ( grep /^$buffers_name$/, @buffers_list ); # check if buffer is in list
301 @buffers_list = grep {$_ ne $buffers_name} @buffers_list; # delete entry
302 my $buffers_list = &create_whitelist
(\
@buffers_list);
303 weechat
::config_option_set
( weechat
::config_get
("buffers.look.whitelist_buffers"), $buffers_list, 1);
304 weechat
::print(weechat
::current_buffer
(), "buffer \"$buffers_name\" deleted from buffers whitelist");
306 elsif ( $args eq "reset" )
308 return weechat
::WEECHAT_RC_OK
if ( $buffers_whitelist eq "" );
309 weechat
::config_option_set
( weechat
::config_get
("buffers.look.whitelist_buffers"), "", 1);
310 weechat
::print(weechat
::current_buffer
(), "buffers whitelist is empty, now...");
312 return weechat
::WEECHAT_RC_OK
;
314 sub buffers_cmd_detach
316 my ( $data, $buffer, $args ) = @_;
318 my $immune_detach_buffers = weechat
::config_string
( weechat
::config_get
("buffers.look.immune_detach_buffers") );
319 return weechat
::WEECHAT_RC_OK
if ( $immune_detach_buffers eq "" and $args eq "del" or $immune_detach_buffers eq "" and $args eq "reset" );
321 my @buffers_list = split( /,/, $immune_detach_buffers );
323 my $infolist = weechat
::infolist_get
("buffer", weechat
::current_buffer
(), "");
324 weechat
::infolist_next
($infolist);
325 my $buffers_name = weechat
::infolist_string
($infolist, "name");
326 weechat
::infolist_free
($infolist);
327 return weechat
::WEECHAT_RC_OK
if ( $buffers_name eq "" ); # should never happen
329 if ( $args eq "add" )
331 return weechat
::WEECHAT_RC_OK
if ( grep /^$buffers_name$/, @buffers_list ); # check if buffer already in list
332 push @buffers_list, ( $buffers_name );
333 my $buffers_list = &create_whitelist
(\
@buffers_list);
334 weechat
::config_option_set
( weechat
::config_get
("buffers.look.immune_detach_buffers"), $buffers_list, 1);
335 weechat
::print(weechat
::current_buffer
(), "buffer \"$buffers_name\" added to immune detach buffers");
337 elsif ( $args eq "del" )
339 return weechat
::WEECHAT_RC_OK
unless ( grep /^$buffers_name$/, @buffers_list ); # check if buffer is in list
340 @buffers_list = grep {$_ ne $buffers_name} @buffers_list; # delete entry
341 my $buffers_list = &create_whitelist
(\
@buffers_list);
342 weechat
::config_option_set
( weechat
::config_get
("buffers.look.immune_detach_buffers"), $buffers_list, 1);
343 weechat
::print(weechat
::current_buffer
(), "buffer \"$buffers_name\" deleted from immune detach buffers");
345 elsif ( $args eq "reset" )
347 return weechat
::WEECHAT_RC_OK
if ( $immune_detach_buffers eq "" );
348 weechat
::config_option_set
( weechat
::config_get
("buffers.look.immune_detach_buffers"), "", 1);
349 weechat
::print(weechat
::current_buffer
(), "immune detach buffers is empty, now...");
351 return weechat
::WEECHAT_RC_OK
;
356 my @buffers_list = @{$_[0]};
357 my $buffers_list = "";
358 foreach (@buffers_list)
360 $buffers_list .= $_ .",";
364 return $buffers_list;
367 # -------------------------------- [ config ] --------------------------------
368 sub hook_timer_detach
373 weechat
::unhook
($Hooks{timer_detach
}) if $Hooks{timer_detach
};
374 $Hooks{timer_detach
} = "";
378 weechat
::unhook
($Hooks{timer_detach
}) if $Hooks{timer_detach
};
379 $Hooks{timer_detach
} = weechat
::hook_timer
( weechat
::config_integer
( $options{"detach"}) * 1000, 60, 0, "buffers_signal_hotlist", "");
381 weechat
::bar_item_update
($SCRIPT_NAME);
382 return weechat
::WEECHAT_RC_OK
;
390 weechat
::unhook
($Hooks{timer_lag
}) if $Hooks{timer_lag
};
391 $Hooks{timer_lag
} = "";
395 weechat
::unhook
($Hooks{timer_lag
}) if $Hooks{timer_lag
};
396 $Hooks{timer_lag
} = weechat
::hook_timer
( weechat
::config_integer
(weechat
::config_get
("irc.network.lag_refresh_interval")) * 1000, 0, 0, "buffers_signal_hotlist", "");
398 weechat
::bar_item_update
($SCRIPT_NAME);
399 return weechat
::WEECHAT_RC_OK
;
402 sub buffers_config_read
404 return weechat
::config_read
($buffers_config_file) if ($buffers_config_file ne "");
406 sub buffers_config_write
408 return weechat
::config_write
($buffers_config_file) if ($buffers_config_file ne "");
410 sub buffers_config_reload_cb
412 my ($data, $config_file) = ($_[0], $_[1]);
413 return weechat
::config_reload
($config_file)
415 sub buffers_config_init
417 $buffers_config_file = weechat
::config_new
($BUFFERS_CONFIG_FILE_NAME,
418 "buffers_config_reload_cb", "");
419 return if ($buffers_config_file eq "");
421 my %default_options_color =
422 ("color_current_fg" => [
423 "current_fg", "color",
424 "foreground color for current buffer",
425 "", 0, 0, "lightcyan", "lightcyan", 0,
426 "", "", "buffers_signal_config", "", "", ""
428 "color_current_bg" => [
429 "current_bg", "color",
430 "background color for current buffer",
431 "", 0, 0, "red", "red", 0,
432 "", "", "buffers_signal_config", "", "", ""
434 "color_default_fg" => [
435 "default_fg", "color",
436 "default foreground color for buffer name",
437 "", 0, 0, "default", "default", 0,
438 "", "", "buffers_signal_config", "", "", ""
440 "color_default_bg" => [
441 "default_bg", "color",
442 "default background color for buffer name",
443 "", 0, 0, "default", "default", 0,
444 "", "", "buffers_signal_config", "", "", ""
446 "color_hotlist_highlight_fg" => [
447 "hotlist_highlight_fg", "color",
448 "change foreground color of buffer name if a highlight messaged received",
449 "", 0, 0, "magenta", "magenta", 0,
450 "", "", "buffers_signal_config", "", "", ""
452 "color_hotlist_highlight_bg" => [
453 "hotlist_highlight_bg", "color",
454 "change background color of buffer name if a highlight messaged received",
455 "", 0, 0, "default", "default", 0,
456 "", "", "buffers_signal_config", "", "", ""
458 "color_hotlist_low_fg" => [
459 "hotlist_low_fg", "color",
460 "change foreground color of buffer name if a low message received",
461 "", 0, 0, "white", "white", 0,
462 "", "", "buffers_signal_config", "", "", ""
464 "color_hotlist_low_bg" => [
465 "hotlist_low_bg", "color",
466 "change background color of buffer name if a low message received",
467 "", 0, 0, "default", "default", 0,
468 "", "", "buffers_signal_config", "", "", ""
470 "color_hotlist_message_fg" => [
471 "hotlist_message_fg", "color",
472 "change foreground color of buffer name if a normal message received",
473 "", 0, 0, "yellow", "yellow", 0,
474 "", "", "buffers_signal_config", "", "", ""
476 "color_hotlist_message_bg" => [
477 "hotlist_message_bg", "color",
478 "change background color of buffer name if a normal message received",
479 "", 0, 0, "default", "default", 0,
480 "", "", "buffers_signal_config", "", "", ""
482 "color_hotlist_private_fg" => [
483 "hotlist_private_fg", "color",
484 "change foreground color of buffer name if a private message received",
485 "", 0, 0, "lightgreen", "lightgreen", 0,
486 "", "", "buffers_signal_config", "", "", ""
488 "color_hotlist_private_bg" => [
489 "hotlist_private_bg", "color",
490 "change background color of buffer name if a private message received",
491 "", 0, 0, "default", "default", 0,
492 "", "", "buffers_signal_config", "", "", ""
496 "color for buffer number",
497 "", 0, 0, "lightgreen", "lightgreen", 0,
498 "", "", "buffers_signal_config", "", "", ""
500 "color_number_char" => [
501 "number_char", "color",
502 "color for buffer number char",
503 "", 0, 0, "lightgreen", "lightgreen", 0,
504 "", "", "buffers_signal_config", "", "", ""
506 "color_whitelist_default_fg" => [
507 "whitelist_default_fg", "color",
508 "default foreground color for whitelist buffer name",
510 "", "", "buffers_signal_config", "", "", ""
512 "color_whitelist_default_bg" => [
513 "whitelist_default_bg", "color",
514 "default background color for whitelist buffer name",
516 "", "", "buffers_signal_config", "", "", ""
518 "color_whitelist_low_fg" => [
519 "whitelist_low_fg", "color",
520 "low color of whitelist buffer name",
522 "", "", "buffers_signal_config", "", "", ""
524 "color_whitelist_low_bg" => [
525 "whitelist_low_bg", "color",
526 "low color of whitelist buffer name",
528 "", "", "buffers_signal_config", "", "", ""
530 "color_whitelist_message_fg" => [
531 "whitelist_message_fg", "color",
532 "message color of whitelist buffer name",
534 "", "", "buffers_signal_config", "", "", ""
536 "color_whitelist_message_bg" => [
537 "whitelist_message_bg", "color",
538 "message color of whitelist buffer name",
540 "", "", "buffers_signal_config", "", "", ""
542 "color_whitelist_private_fg" => [
543 "whitelist_private_fg", "color",
544 "private color of whitelist buffer name",
546 "", "", "buffers_signal_config", "", "", ""
548 "color_whitelist_private_bg" => [
549 "whitelist_private_bg", "color",
550 "private color of whitelist buffer name",
552 "", "", "buffers_signal_config", "", "", ""
554 "color_whitelist_highlight_fg" => [
555 "whitelist_highlight_fg", "color",
556 "highlight color of whitelist buffer name",
558 "", "", "buffers_signal_config", "", "", ""
560 "color_whitelist_highlight_bg" => [
561 "whitelist_highlight_bg", "color",
562 "highlight color of whitelist buffer name",
564 "", "", "buffers_signal_config", "", "", ""
566 "color_none_channel_fg" => [
567 "none_channel_fg", "color",
568 "foreground color for none channel buffer (e.g.: core/server/plugin ".
570 "", 0, 0, "default", "default", 0,
571 "", "", "buffers_signal_config", "", "", ""
573 "color_none_channel_bg" => [
574 "none_channel_bg", "color",
575 "background color for none channel buffer (e.g.: core/server/plugin ".
577 "", 0, 0, "default", "default", 0,
578 "", "", "buffers_signal_config", "", "", ""
580 "queries_default_fg" => [
581 "queries_default_fg", "color",
582 "foreground color for query buffer without message",
583 "", 0, 0, "default", "default", 0,
584 "", "", "buffers_signal_config", "", "", ""
586 "queries_default_bg" => [
587 "queries_default_bg", "color",
588 "background color for query buffer without message",
589 "", 0, 0, "default", "default", 0,
590 "", "", "buffers_signal_config", "", "", ""
592 "queries_message_fg" => [
593 "queries_message_fg", "color",
594 "foreground color for query buffer with unread message",
595 "", 0, 0, "default", "default", 0,
596 "", "", "buffers_signal_config", "", "", ""
598 "queries_message_bg" => [
599 "queries_message_bg", "color",
600 "background color for query buffer with unread message",
601 "", 0, 0, "default", "default", 0,
602 "", "", "buffers_signal_config", "", "", ""
604 "queries_highlight_fg" => [
605 "queries_highlight_fg", "color",
606 "foreground color for query buffer with unread highlight",
607 "", 0, 0, "default", "default", 0,
608 "", "", "buffers_signal_config", "", "", ""
610 "queries_highlight_bg" => [
611 "queries_highlight_bg", "color",
612 "background color for query buffer with unread highlight",
613 "", 0, 0, "default", "default", 0,
614 "", "", "buffers_signal_config", "", "", ""
616 "color_prefix_bufname" => [
617 "prefix_bufname", "color",
618 "color for prefix of buffer name",
619 "", 0, 0, "default", "default", 0,
620 "", "", "buffers_signal_config", "", "", ""
622 "color_suffix_bufname" => [
623 "suffix_bufname", "color",
624 "color for suffix of buffer name",
625 "", 0, 0, "default", "default", 0,
626 "", "", "buffers_signal_config", "", "", ""
630 my %default_options_look =
632 "hotlist_counter" => [
633 "hotlist_counter", "boolean",
634 "show number of message for the buffer (this option needs WeeChat >= ".
635 "0.3.5). The relevant option for notification is \"weechat.look.".
636 "buffer_notify_default\"",
637 "", 0, 0, "off", "off", 0,
638 "", "", "buffers_signal_config", "", "", ""
641 "show_lag", "boolean",
642 "show lag behind server name. This option is using \"irc.color.".
643 "item_lag_finished\", ".
644 "\"irc.network.lag_min_show\" and \"irc.network.lag_refresh_interval\"",
645 "", 0, 0, "off", "off", 0,
646 "", "", "buffers_signal_config", "", "", ""
648 "look_whitelist_buffers" => [
649 "whitelist_buffers", "string",
650 "comma separated list of buffers for using a different color scheme ".
651 "(for example: freenode.#weechat,freenode.#weechat-fr)",
653 "", "", "buffers_signal_config_whitelist", "", "", ""
655 "hide_merged_buffers" => [
656 "hide_merged_buffers", "integer",
657 "hide merged buffers. The value determines which merged buffers should ".
658 "be hidden, keepserver meaning 'all except server buffers'. Other values ".
659 "correspondent to the buffer type.",
660 "server|channel|private|keepserver|all|none", 0, 0, "none", "none", 0,
661 "", "", "buffers_signal_config", "", "", ""
664 "indenting", "integer", "use indenting for channel and query buffers. ".
665 "This option only takes effect if bar is left/right positioned",
666 "off|on|under_name", 0, 0, "off", "off", 0,
667 "", "", "buffers_signal_config", "", "", ""
669 "indenting_number" => [
670 "indenting_number", "boolean",
671 "use indenting for numbers. This option only takes effect if bar is ".
672 "left/right positioned",
673 "", 0, 0, "on", "on", 0,
674 "", "", "buffers_signal_config", "", "", ""
677 "short_names", "boolean",
678 "display short names (remove text before first \".\" in buffer name)",
679 "", 0, 0, "on", "on", 0,
680 "", "", "buffers_signal_config", "", "", ""
683 "show_number", "boolean",
684 "display buffer number in front of buffer name",
685 "", 0, 0, "on", "on", 0,
686 "", "", "buffers_signal_config", "", "", ""
688 "show_number_char" => [
689 "number_char", "string",
690 "display a char behind buffer number",
691 "", 0, 0, ".", ".", 0,
692 "", "", "buffers_signal_config", "", "", ""
694 "show_prefix_bufname" => [
695 "prefix_bufname", "string",
696 "prefix displayed in front of buffer name",
698 "", "", "buffers_signal_config", "", "", ""
700 "show_suffix_bufname" => [
701 "suffix_bufname", "string",
702 "suffix displayed at end of buffer name",
704 "", "", "buffers_signal_config", "", "", ""
708 "displays your prefix for channel in front of buffer name",
709 "", 0, 0, "off", "off", 0,
710 "", "", "buffers_signal_config", "", "", ""
712 "show_prefix_empty" => [
713 "prefix_empty", "boolean",
714 "use a placeholder for channels without prefix",
715 "", 0, 0, "on", "on", 0,
716 "", "", "buffers_signal_config", "", "", ""
718 "show_prefix_query" => [
719 "prefix_for_query", "string",
720 "prefix displayed in front of query buffer",
722 "", "", "buffers_signal_config", "", "", ""
726 "sort buffer-list by \"number\" or \"name\"",
727 "number|name", 0, 0, "number", "number", 0,
728 "", "", "buffers_signal_config", "", "", ""
731 "core_to_front", "boolean",
732 "core buffer and buffers with free content will be listed first. ".
733 "Take only effect if buffer sort is by name",
734 "", 0, 0, "off", "off", 0,
735 "", "", "buffers_signal_config", "", "", ""
737 "jump_prev_next_visited_buffer" => [
738 "jump_prev_next_visited_buffer", "boolean",
739 "jump to previously or next visited buffer if you click with ".
740 "left/right mouse button on currently visiting buffer",
741 "", 0, 0, "off", "off", 0,
742 "", "", "buffers_signal_config", "", "", ""
745 "name_size_max", "integer",
746 "maximum size of buffer name. 0 means no limitation",
748 "", "", "buffers_signal_config", "", "", ""
750 "name_crop_suffix" => [
751 "name_crop_suffix", "string",
752 "contains an optional char(s) that is appended when buffer name is ".
754 "", 0, 0, "+", "+", 0,
755 "", "", "buffers_signal_config", "", "", ""
759 "detach buffer from buffers list after a specific period of time ".
760 "(in seconds) without action (weechat ≥ 0.3.8 required) (0 means \"off\")",
761 "", 0, 31536000, 0, "number", 0,
762 "", "", "buffers_signal_config", "", "", ""
764 "immune_detach_buffers" => [
765 "immune_detach_buffers", "string",
766 "comma separated list of buffers to NOT automatically detach. ".
767 "Allows \"*\" wildcard. Ex: \"BitlBee,freenode.*\"",
769 "", "", "buffers_signal_config_immune_detach_buffers", "", "", ""
772 "detach_query", "boolean",
773 "query buffer will be detached",
774 "", 0, 0, "off", "off", 0,
775 "", "", "buffers_signal_config", "", "", ""
777 "detach_buffer_immediately" => [
778 "detach_buffer_immediately", "string",
779 "comma separated list of buffers to detach immediately. A query and ".
780 "highlight message will attach buffer again. Allows \"*\" wildcard. ".
781 "Ex: \"BitlBee,freenode.*\"",
783 "", "", "buffers_signal_config_detach_buffer_immediately", "", "", ""
785 "detach_free_content" => [
786 "detach_free_content", "boolean",
787 "buffers with free content will be detached (Ex: iset, chanmon)",
788 "", 0, 0, "off", "off", 0,
789 "", "", "buffers_signal_config", "", "", ""
791 "detach_displayed_buffers" => [
792 "detach_displayed_buffers", "boolean",
793 "buffers displayed in a (split) window will be detached",
794 "", 0, 0, "on", "on", 0,
795 "", "", "buffers_signal_config", "", "", ""
797 "detach_display_window_number" => [
798 "detach_display_window_number", "boolean",
799 "window number will be add, behind buffer name (this option takes only ".
800 "effect with \"detach_displayed_buffers\" option)",
801 "", 0, 0, "off", "off", 0,
802 "", "", "buffers_signal_config", "", "", ""
805 "mark_inactive", "boolean",
806 "if option is \"on\", inactive buffers (those you are not in) will have ".
807 "parentheses around them. An inactive buffer will not be detached.",
808 "", 0, 0, "off", "off", 0,
809 "", "", "buffers_signal_config", "", "", ""
812 "toggle_bar", "boolean",
813 "if option is \"on\", buffers bar will hide/show when script is ".
815 "", 0, 0, "on", "on", 0,
816 "", "", "buffers_signal_config", "", "", ""
818 "mouse_move_buffer" => [
819 "mouse_move_buffer", "boolean",
820 "if option is \"on\", mouse gestures (drag & drop) can move buffers in list.",
821 "", 0, 0, "on", "on", 0,
822 "", "", "buffers_signal_config", "", "", ""
825 "mouse_wheel", "boolean",
826 "if option is \"on\", mouse wheel jumps to previous/next buffer in list.",
827 "", 0, 0, "on", "on", 0,
828 "", "", "buffers_signal_config", "", "", ""
832 my $section_color = weechat
::config_new_section
(
833 $buffers_config_file,
834 "color", 0, 0, "", "", "", "", "", "", "", "", "", "");
835 if ($section_color eq "")
837 weechat
::config_free
($buffers_config_file);
840 foreach my $option (keys %default_options_color)
842 $options{$option} = weechat
::config_new_option
(
843 $buffers_config_file,
845 $default_options_color{$option}[0],
846 $default_options_color{$option}[1],
847 $default_options_color{$option}[2],
848 $default_options_color{$option}[3],
849 $default_options_color{$option}[4],
850 $default_options_color{$option}[5],
851 $default_options_color{$option}[6],
852 $default_options_color{$option}[7],
853 $default_options_color{$option}[8],
854 $default_options_color{$option}[9],
855 $default_options_color{$option}[10],
856 $default_options_color{$option}[11],
857 $default_options_color{$option}[12],
858 $default_options_color{$option}[13],
859 $default_options_color{$option}[14]);
863 my $section_look = weechat
::config_new_section
(
864 $buffers_config_file,
865 "look", 0, 0, "", "", "", "", "", "", "", "", "", "");
866 if ($section_look eq "")
868 weechat
::config_free
($buffers_config_file);
871 foreach my $option (keys %default_options_look)
873 $options{$option} = weechat
::config_new_option
(
874 $buffers_config_file,
876 $default_options_look{$option}[0],
877 $default_options_look{$option}[1],
878 $default_options_look{$option}[2],
879 $default_options_look{$option}[3],
880 $default_options_look{$option}[4],
881 $default_options_look{$option}[5],
882 $default_options_look{$option}[6],
883 $default_options_look{$option}[7],
884 $default_options_look{$option}[8],
885 $default_options_look{$option}[9],
886 $default_options_look{$option}[10],
887 $default_options_look{$option}[11],
888 $default_options_look{$option}[12],
889 $default_options_look{$option}[13],
890 $default_options_look{$option}[14],
891 $default_options_look{$option}[15]);
899 # get bar position (left/right/top/bottom)
900 my $position = "left";
901 my $option_position = weechat
::config_get
("weechat.bar.buffers.position");
902 if ($option_position ne "")
904 $position = weechat
::config_string
($option_position);
909 my $infolist = weechat
::infolist_get
("hotlist", "", "");
910 while (weechat
::infolist_next
($infolist))
912 $hotlist{weechat
::infolist_pointer
($infolist, "buffer_pointer")} =
913 weechat
::infolist_integer
($infolist, "priority");
914 if ( weechat
::config_boolean
( $options{"hotlist_counter"} ) eq 1 and $weechat_version >= 0x00030500)
916 $hotlist{weechat
::infolist_pointer
($infolist, "buffer_pointer")."_count_00"} =
917 weechat
::infolist_integer
($infolist, "count_00"); # low message
918 $hotlist{weechat
::infolist_pointer
($infolist, "buffer_pointer")."_count_01"} =
919 weechat
::infolist_integer
($infolist, "count_01"); # channel message
920 $hotlist{weechat
::infolist_pointer
($infolist, "buffer_pointer")."_count_02"} =
921 weechat
::infolist_integer
($infolist, "count_02"); # private message
922 $hotlist{weechat
::infolist_pointer
($infolist, "buffer_pointer")."_count_03"} =
923 weechat
::infolist_integer
($infolist, "count_03"); # highlight message
926 weechat
::infolist_free
($infolist);
935 my $max_number_digits = 0;
937 $infolist = weechat
::infolist_get
("buffer", "", "");
938 while (weechat
::infolist_next
($infolist))
940 # ignore hidden buffers (WeeChat >= 0.4.4)
941 if ($weechat_version >= 0x00040400)
943 next if (weechat
::infolist_integer
($infolist, "hidden"));
946 my $number = weechat
::infolist_integer
($infolist, "number");
947 if ($number ne $old_number)
949 @buffers = (@buffers, @current2, @current1);
954 if ($number > $max_number)
956 $max_number = $number;
958 $old_number = $number;
959 my $active = weechat
::infolist_integer
($infolist, "active");
964 $buffer->{"pointer"} = weechat
::infolist_pointer
($infolist, "pointer");
965 $buffer->{"number"} = $number;
966 $buffer->{"active"} = $active;
967 $buffer->{"current_buffer"} = weechat
::infolist_integer
($infolist, "current_buffer");
968 $buffer->{"num_displayed"} = weechat
::infolist_integer
($infolist, "num_displayed");
969 $buffer->{"plugin_name"} = weechat
::infolist_string
($infolist, "plugin_name");
970 $buffer->{"name"} = weechat
::infolist_string
($infolist, "name");
971 $buffer->{"short_name"} = weechat
::infolist_string
($infolist, "short_name");
972 $buffer->{"full_name"} = $buffer->{"plugin_name"}.".".$buffer->{"name"};
973 $buffer->{"type"} = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type");
974 #weechat::print("", $buffer->{"type"});
976 # check if buffer is active (or maybe a /part, /kick channel)
977 if ($buffer->{"type"} eq "channel" and weechat
::config_boolean
( $options{"mark_inactive"} ) eq 1)
979 my $server = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_server");
980 my $channel = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_channel");
981 my $infolist_channel = weechat
::infolist_get
("irc_channel", "", $server.",".$channel);
982 if ($infolist_channel)
984 weechat
::infolist_next
($infolist_channel);
985 $buffer->{"nicks_count"} = weechat
::infolist_integer
($infolist_channel, "nicks_count");
988 $buffer->{"nicks_count"} = 0;
990 weechat
::infolist_free
($infolist_channel);
993 my $result = check_immune_detached_buffers
($buffer->{"name"}); # checking for wildcard
995 next if ( check_detach_buffer_immediately
($buffer->{"name"}) eq 1
996 and $buffer->{"current_buffer"} eq 0
997 and ( not exists $hotlist{$buffer->{"pointer"}} or $hotlist{$buffer->{"pointer"}} < 2) ); # checking for buffer to immediately detach
1001 my $detach_time = weechat
::config_integer
( $options{"detach"});
1002 my $current_time = time();
1003 # set timer for buffers with no hotlist action
1004 $buffers_timer{$buffer->{"pointer"}} = $current_time
1005 if ( not exists $hotlist{$buffer->{"pointer"}}
1006 and $buffer->{"type"} eq "channel"
1007 and not exists $buffers_timer{$buffer->{"pointer"}}
1008 and $detach_time > 0);
1010 $buffers_timer{$buffer->{"pointer"}} = $current_time
1011 if (weechat
::config_boolean
($options{"detach_query"}) eq 1
1012 and not exists $hotlist{$buffer->{"pointer"}}
1013 and $buffer->{"type"} eq "private"
1014 and not exists $buffers_timer{$buffer->{"pointer"}}
1015 and $detach_time > 0);
1018 if (weechat
::config_boolean
($options{"detach_query"}) eq 0
1019 and $buffer->{"type"} eq "private");
1021 # free content buffer
1022 $buffers_timer{$buffer->{"pointer"}} = $current_time
1023 if (weechat
::config_boolean
($options{"detach_free_content"}) eq 1
1024 and not exists $hotlist{$buffer->{"pointer"}}
1025 and $buffer->{"type"} eq ""
1026 and not exists $buffers_timer{$buffer->{"pointer"}}
1027 and $detach_time > 0);
1029 if (weechat
::config_boolean
($options{"detach_free_content"}) eq 0
1030 and $buffer->{"type"} eq "");
1032 $detach_time = 0 if (weechat
::config_boolean
($options{"mark_inactive"}) eq 1 and defined $buffer->{"nicks_count"} and $buffer->{"nicks_count"} == 0);
1035 unless ( $buffer->{"current_buffer"} eq 0
1036 and not exists $hotlist{$buffer->{"pointer"}}
1037 # and $buffer->{"type"} eq "channel"
1038 and exists $buffers_timer{$buffer->{"pointer"}}
1039 and $detach_time > 0
1040 and $weechat_version >= 0x00030800
1041 and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time)
1045 push(@current2, $buffer);
1049 push(@current1, $buffer);
1052 elsif ( $buffer->{"current_buffer"} eq 0
1053 and not exists $hotlist{$buffer->{"pointer"}}
1054 # and $buffer->{"type"} eq "channel"
1055 and exists $buffers_timer{$buffer->{"pointer"}}
1056 and $detach_time > 0
1057 and $weechat_version >= 0x00030800
1058 and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time)
1059 { # check for option detach_displayed_buffers and if buffer is displayed in a split window
1060 if ( $buffer->{"num_displayed"} eq 1
1061 and weechat
::config_boolean
($options{"detach_displayed_buffers"}) eq 0 )
1063 my $infolist_window = weechat
::infolist_get
("window", "", "");
1064 while (weechat
::infolist_next
($infolist_window))
1066 my $buffer_ptr = weechat
::infolist_pointer
($infolist_window, "buffer");
1067 if ($buffer_ptr eq $buffer->{"pointer"})
1069 $buffer->{"window"} = weechat
::infolist_integer
($infolist_window, "number");
1072 weechat
::infolist_free
($infolist_window);
1074 push(@current2, $buffer);
1078 else # buffer in "immune_detach_buffers"
1082 push(@current2, $buffer);
1086 push(@current1, $buffer);
1092 if ($max_number >= 1)
1094 $max_number_digits = length(int($max_number));
1096 @buffers = (@buffers, @current2, @current1);
1097 weechat
::infolist_free
($infolist);
1099 # sort buffers by number, name or shortname
1104 for my $buffer (@buffers)
1107 if (weechat
::config_integer
( $options{"sort"} ) eq 1) # number = 0; name = 1
1109 my $name = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_custom_name");
1110 if (not defined $name or $name eq "") {
1111 if (weechat
::config_boolean
( $options{"short_names"} ) eq 1) {
1112 $name = $buffer->{"short_name"};
1114 $name = $buffer->{"name"};
1117 if (weechat
::config_integer
($options{"name_size_max"}) >= 1){
1118 $name = encode
("UTF-8", substr(decode
("UTF-8", $name), 0, weechat
::config_integer
($options{"name_size_max"})));
1120 if ( weechat
::config_boolean
($options{"core_to_front"}) eq 1)
1122 if ( (weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type") ne "channel" ) and ( weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type") ne "private") )
1124 my $type = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type");
1125 if ( $type eq "" and $name ne "weechat")
1130 $name = " " . $name;
1134 $key = sprintf("%s%08d", lc($name), $buffer->{"number"});
1138 $key = sprintf("%08d", $number);
1140 $sorted_buffers{$key} = $buffer;
1145 # build string with buffers
1147 foreach my $key (sort keys %sorted_buffers)
1149 my $buffer = $sorted_buffers{$key};
1151 if ( weechat
::config_string
($options{"hide_merged_buffers"}) eq "server" )
1153 # buffer type "server" or merged with core?
1154 if ( ($buffer->{"type"} eq "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
1159 if ( weechat
::config_string
($options{"hide_merged_buffers"}) eq "channel" )
1161 # buffer type "channel" or merged with core?
1162 if ( ($buffer->{"type"} eq "channel" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
1167 if ( weechat
::config_string
($options{"hide_merged_buffers"}) eq "private" )
1169 # buffer type "private" or merged with core?
1170 if ( ($buffer->{"type"} eq "private" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
1175 if ( weechat
::config_string
($options{"hide_merged_buffers"}) eq "keepserver" )
1177 if ( ($buffer->{"type"} ne "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
1182 if ( weechat
::config_string
($options{"hide_merged_buffers"}) eq "all" )
1184 if ( ! $buffer->{"active"} )
1190 push(@buffers_focus, $buffer); # buffer > buffers_focus, for mouse support
1194 $color = weechat
::config_color
( $options{"color_default_fg"} );
1195 $bg = weechat
::config_color
( $options{"color_default_bg"} );
1197 if ( weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type") eq "private" )
1199 if ( (weechat
::config_color
($options{"queries_default_bg"})) ne "default" || (weechat
::config_color
($options{"queries_default_fg"})) ne "default" )
1201 $bg = weechat
::config_color
( $options{"queries_default_bg"} );
1202 $color = weechat
::config_color
( $options{"queries_default_fg"} );
1205 # check for core and buffer with free content
1206 if ( (weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type") ne "channel" ) and ( weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type") ne "private") )
1208 $color = weechat
::config_color
( $options{"color_none_channel_fg"} );
1209 $bg = weechat
::config_color
( $options{"color_none_channel_bg"} );
1211 # default whitelist buffer?
1212 if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers)
1214 $color = weechat
::config_color
( $options{"color_whitelist_default_fg"} );
1215 $bg = weechat
::config_color
( $options{"color_whitelist_default_bg"} );
1218 $color = "default" if ($color eq "");
1220 # color for channel and query buffer
1221 if (exists $hotlist{$buffer->{"pointer"}})
1223 delete $buffers_timer{$buffer->{"pointer"}};
1224 # check if buffer is in whitelist buffer
1225 if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers)
1227 $bg = weechat
::config_color
( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
1228 $color = weechat
::config_color
( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
1230 elsif ( weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type") eq "private" )
1232 # queries_default_fg/bg and buffers.color.queries_message_fg/bg
1233 if ( (weechat
::config_color
($options{"queries_highlight_fg"})) ne "default" ||
1234 (weechat
::config_color
($options{"queries_highlight_bg"})) ne "default" ||
1235 (weechat
::config_color
($options{"queries_message_fg"})) ne "default" ||
1236 (weechat
::config_color
($options{"queries_message_bg"})) ne "default" )
1238 if ( ($hotlist{$buffer->{"pointer"}}) == 2 )
1240 $bg = weechat
::config_color
( $options{"queries_message_bg"} );
1241 $color = weechat
::config_color
( $options{"queries_message_fg"} );
1244 elsif ( ($hotlist{$buffer->{"pointer"}}) == 3 )
1246 $bg = weechat
::config_color
( $options{"queries_highlight_bg"} );
1247 $color = weechat
::config_color
( $options{"queries_highlight_fg"} );
1251 $bg = weechat
::config_color
( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
1252 $color = weechat
::config_color
( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
1256 $bg = weechat
::config_color
( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
1257 $color = weechat
::config_color
( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
1261 if ($buffer->{"current_buffer"})
1263 $color = weechat
::config_color
( $options{"color_current_fg"} );
1264 $bg = weechat
::config_color
( $options{"color_current_bg"} );
1267 $color_bg = weechat
::color
(",".$bg) if ($bg ne "");
1269 # create channel number for output
1270 if ( weechat
::config_string
( $options{"show_prefix_bufname"} ) ne "" )
1273 weechat
::color
( weechat
::config_color
( $options{"color_prefix_bufname"} ) ).
1274 weechat
::config_string
( $options{"show_prefix_bufname"} ).
1275 weechat
::color
("default");
1278 if ( weechat
::config_boolean
( $options{"show_number"} ) eq 1 ) # on
1280 if (( weechat
::config_boolean
( $options{"indenting_number"} ) eq 1)
1281 && (($position eq "left") || ($position eq "right")))
1283 $str .= weechat
::color
("default").$color_bg
1284 .(" " x
($max_number_digits - length(int($buffer->{"number"}))));
1286 if ($old_number ne $buffer->{"number"})
1288 $str .= weechat
::color
( weechat
::config_color
( $options{"color_number"} ) )
1290 .$buffer->{"number"}
1291 .weechat
::color
("default")
1293 .weechat
::color
( weechat
::config_color
( $options{"color_number_char"} ) )
1294 .weechat
::config_string
( $options{"show_number_char"} )
1300 $indent = ((" " x
length($buffer->{"number"}))." ") if (($position eq "left") || ($position eq "right"));
1301 $str .= weechat
::color
("default")
1307 if (( weechat
::config_integer
( $options{"indenting"} ) ne 0 ) # indenting NOT off
1308 && (($position eq "left") || ($position eq "right")))
1310 my $type = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type");
1311 if (($type eq "channel") || ($type eq "private"))
1313 if ( weechat
::config_integer
( $options{"indenting"} ) eq 1 )
1317 elsif ( (weechat
::config_integer
($options{"indenting"}) eq 2) and (weechat
::config_integer
($options{"indenting_number"}) eq 0) ) #under_name
1319 if ( weechat
::config_boolean
( $options{"show_number"} ) eq 0 )
1324 $str .= ( (" " x
( $max_number_digits - length($buffer->{"number"}) ))." " );
1330 $str .= weechat
::config_string
( $options{"show_prefix_query"}) if (weechat
::config_string
( $options{"show_prefix_query"} ) ne "" and $buffer->{"type"} eq "private");
1332 if (weechat
::config_boolean
( $options{"show_prefix"} ) eq 1)
1334 my $nickname = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_nick");
1335 if ($nickname ne "")
1337 # with version >= 0.3.2, this infolist will return only nick
1338 # with older versions, whole nicklist is returned for buffer, and this can be very slow
1339 my $infolist_nick = weechat
::infolist_get
("nicklist", $buffer->{"pointer"}, "nick_".$nickname);
1340 if ($infolist_nick ne "")
1342 while (weechat
::infolist_next
($infolist_nick))
1344 if ((weechat
::infolist_string
($infolist_nick, "type") eq "nick")
1345 && (weechat
::infolist_string
($infolist_nick, "name") eq $nickname))
1347 my $prefix = weechat
::infolist_string
($infolist_nick, "prefix");
1348 if (($prefix ne " ") or (weechat
::config_boolean
( $options{"show_prefix_empty"} ) eq 1))
1350 # with version >= 0.3.5, it is now a color name (for older versions: option name with color)
1351 if (int($weechat_version) >= 0x00030500)
1353 $str .= weechat
::color
(weechat
::infolist_string
($infolist_nick, "prefix_color"));
1357 $str .= weechat
::color
(weechat
::config_color
(
1358 weechat
::config_get
(
1359 weechat
::infolist_string
($infolist_nick, "prefix_color"))));
1366 weechat
::infolist_free
($infolist_nick);
1370 if ($buffer->{"type"} eq "channel" and weechat
::config_boolean
( $options{"mark_inactive"} ) eq 1 and $buffer->{"nicks_count"} == 0)
1375 $str .= weechat
::color
($color) . weechat
::color
(",".$bg);
1377 my $name = weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_custom_name");
1378 if (not defined $name or $name eq "")
1380 if (weechat
::config_boolean
( $options{"short_names"} ) eq 1) {
1381 $name = $buffer->{"short_name"};
1383 $name = $buffer->{"name"};
1387 if (weechat
::config_integer
($options{"name_size_max"}) >= 1) # check max_size of buffer name
1389 $str .= encode
("UTF-8", substr(decode
("UTF-8", $name), 0, weechat
::config_integer
($options{"name_size_max"})));
1390 $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"}));
1391 $str .= add_inactive_parentless
($buffer->{"type"}, $buffer->{"nicks_count"});
1392 $str .= add_hotlist_count
($buffer->{"pointer"}, %hotlist);
1397 $str .= add_inactive_parentless
($buffer->{"type"}, $buffer->{"nicks_count"});
1398 $str .= add_hotlist_count
($buffer->{"pointer"}, %hotlist);
1401 if ( weechat
::buffer_get_string
($buffer->{"pointer"}, "localvar_type") eq "server" and weechat
::config_boolean
($options{"show_lag"}) eq 1)
1403 my $color_lag = weechat
::config_color
(weechat
::config_get
("irc.color.item_lag_finished"));
1404 my $min_lag = weechat
::config_integer
(weechat
::config_get
("irc.network.lag_min_show"));
1405 my $infolist_server = weechat
::infolist_get
("irc_server", "", $buffer->{"short_name"});
1406 weechat
::infolist_next
($infolist_server);
1407 my $lag = (weechat
::infolist_integer
($infolist_server, "lag"));
1408 weechat
::infolist_free
($infolist_server);
1409 if ( int($lag) > int($min_lag) )
1412 $str .= weechat
::color
("default") . " (" . weechat
::color
($color_lag) . $lag . weechat
::color
("default") . ")";
1415 if (weechat
::config_boolean
($options{"detach_displayed_buffers"}) eq 0
1416 and weechat
::config_boolean
($options{"detach_display_window_number"}) eq 1)
1418 if ($buffer->{"window"})
1420 $str .= weechat
::color
("default") . " (" . weechat
::color
(weechat
::config_color
( $options{"color_number"})) . $buffer->{"window"} . weechat
::color
("default") . ")";
1423 $str .= weechat
::color
("default");
1425 if ( weechat
::config_string
( $options{"show_suffix_bufname"} ) ne "" )
1427 $str .= weechat
::color
( weechat
::config_color
( $options{"color_suffix_bufname"} ) ).
1428 weechat
::config_string
( $options{"show_suffix_bufname"} ).
1429 weechat
::color
("default");
1433 $old_number = $buffer->{"number"};
1436 # remove spaces and/or linefeed at the end
1442 sub add_inactive_parentless
1444 my ($buf_type, $buf_nicks_count) = @_;
1446 if ($buf_type eq "channel" and weechat
::config_boolean
( $options{"mark_inactive"} ) eq 1 and $buf_nicks_count == 0)
1448 $str .= weechat
::color
(weechat
::config_color
( $options{"color_number_char"}));
1454 sub add_hotlist_count
1456 my ($bufpointer, %hotlist) = @_;
1458 return "" if ( weechat
::config_boolean
( $options{"hotlist_counter"} ) eq 0 or ($weechat_version < 0x00030500)); # off
1459 my $col_number_char = weechat
::color
(weechat
::config_color
( $options{"color_number_char"}) );
1460 my $str = " ".$col_number_char."(";
1463 if (defined $hotlist{$bufpointer."_count_00"})
1465 my $bg = weechat
::config_color
( $options{"color_hotlist_low_bg"} );
1466 my $color = weechat
::config_color
( $options{"color_hotlist_low_fg"} );
1467 $str .= weechat
::color
($bg).
1468 weechat
::color
($color).
1469 $hotlist{$bufpointer."_count_00"} if ($hotlist{$bufpointer."_count_00"} ne "0");
1473 if (defined $hotlist{$bufpointer."_count_01"})
1475 my $bg = weechat
::config_color
( $options{"color_hotlist_message_bg"} );
1476 my $color = weechat
::config_color
( $options{"color_hotlist_message_fg"} );
1477 if ($str =~ /[0-9]$/)
1480 weechat
::color
($bg).
1481 weechat
::color
($color).
1482 $hotlist{$bufpointer."_count_01"} if ($hotlist{$bufpointer."_count_01"} ne "0");
1485 $str .= weechat
::color
($bg).
1486 weechat
::color
($color).
1487 $hotlist{$bufpointer."_count_01"} if ($hotlist{$bufpointer."_count_01"} ne "0");
1491 if (defined $hotlist{$bufpointer."_count_02"})
1493 my $bg = weechat
::config_color
( $options{"color_hotlist_private_bg"} );
1494 my $color = weechat
::config_color
( $options{"color_hotlist_private_fg"} );
1495 if ($str =~ /[0-9]$/)
1498 weechat
::color
($bg).
1499 weechat
::color
($color).
1500 $hotlist{$bufpointer."_count_02"} if ($hotlist{$bufpointer."_count_02"} ne "0");
1503 $str .= weechat
::color
($bg).
1504 weechat
::color
($color).
1505 $hotlist{$bufpointer."_count_02"} if ($hotlist{$bufpointer."_count_02"} ne "0");
1509 if (defined $hotlist{$bufpointer."_count_03"})
1511 my $bg = weechat
::config_color
( $options{"color_hotlist_highlight_bg"} );
1512 my $color = weechat
::config_color
( $options{"color_hotlist_highlight_fg"} );
1513 if ($str =~ /[0-9]$/)
1516 weechat
::color
($bg).
1517 weechat
::color
($color).
1518 $hotlist{$bufpointer."_count_03"} if ($hotlist{$bufpointer."_count_03"} ne "0");
1521 $str .= weechat
::color
($bg).
1522 weechat
::color
($color).
1523 $hotlist{$bufpointer."_count_03"} if ($hotlist{$bufpointer."_count_03"} ne "0");
1526 $str .= $col_number_char. ")";
1528 $str = "" if (weechat
::string_remove_color
($str, "") eq " ()"); # remove color and check for buffer with no messages
1532 sub buffers_signal_buffer
1534 my ($data, $signal, $signal_data) = @_;
1536 # check for buffer_switch and set or remove detach time
1537 if ($weechat_version >= 0x00030800)
1539 if ($signal eq "buffer_switch")
1541 my $pointer = weechat
::hdata_get_list
(weechat
::hdata_get
("buffer"), "gui_buffer_last_displayed"); # get switched buffer
1542 my $current_time = time();
1543 if ( weechat
::buffer_get_string
($pointer, "localvar_type") eq "channel")
1545 $buffers_timer{$pointer} = $current_time;
1549 delete $buffers_timer{$pointer};
1552 if ($signal eq "buffer_opened")
1554 my $current_time = time();
1555 $buffers_timer{$signal_data} = $current_time;
1557 if ($signal eq "buffer_closing")
1559 delete $buffers_timer{$signal_data};
1562 weechat
::bar_item_update
($SCRIPT_NAME);
1563 return weechat
::WEECHAT_RC_OK
;
1566 sub buffers_signal_hotlist
1568 weechat
::bar_item_update
($SCRIPT_NAME);
1569 return weechat
::WEECHAT_RC_OK
;
1573 sub buffers_signal_config_whitelist
1575 @whitelist_buffers = ();
1576 @whitelist_buffers = split( /,/, weechat
::config_string
( $options{"look_whitelist_buffers"} ) );
1577 weechat
::bar_item_update
($SCRIPT_NAME);
1578 return weechat
::WEECHAT_RC_OK
;
1581 sub buffers_signal_config_immune_detach_buffers
1583 @immune_detach_buffers = ();
1584 @immune_detach_buffers = split( /,/, weechat
::config_string
( $options{"immune_detach_buffers"} ) );
1585 weechat
::bar_item_update
($SCRIPT_NAME);
1586 return weechat
::WEECHAT_RC_OK
;
1589 sub buffers_signal_config_detach_buffer_immediately
1591 @detach_buffer_immediately = ();
1592 @detach_buffer_immediately = split( /,/, weechat
::config_string
( $options{"detach_buffer_immediately"} ) );
1593 weechat
::bar_item_update
($SCRIPT_NAME);
1594 return weechat
::WEECHAT_RC_OK
;
1597 sub buffers_signal_config
1599 weechat
::bar_item_update
($SCRIPT_NAME);
1600 return weechat
::WEECHAT_RC_OK
;
1603 # called when mouse click occured in buffers item: this callback returns buffer
1604 # hash according to line of item where click occured
1605 sub buffers_focus_buffers
1607 my %info = %{$_[1]};
1608 my $item_line = int($info{"_bar_item_line"});
1610 if (($info{"_bar_item_name"} eq $SCRIPT_NAME) && ($item_line >= 0) && ($item_line <= $#buffers_focus))
1612 $hash = $buffers_focus[$item_line];
1617 my $hash_focus = $buffers_focus[0];
1618 foreach my $key (keys %$hash_focus)
1620 $hash->{$key} = "?";
1626 # called when a mouse action is done on buffers item, to execute action
1627 # possible actions: jump to a buffer or move buffer in list (drag & drop of buffer)
1628 sub buffers_hsignal_mouse
1630 my ($data, $signal, %hash) = ($_[0], $_[1], %{$_[2]});
1631 my $current_buffer = weechat
::buffer_get_integer
(weechat
::current_buffer
(), "number"); # get current buffer number
1633 if ( $hash{"_key"} eq "button1" )
1636 if ($hash{"number"} eq $hash{"number2"})
1638 if ( weechat
::config_boolean
($options{"jump_prev_next_visited_buffer"}) )
1640 if ( $current_buffer eq $hash{"number"} )
1642 weechat
::command
("", "/input jump_previously_visited_buffer");
1646 weechat
::command
("", "/buffer ".$hash{"full_name"});
1651 weechat
::command
("", "/buffer ".$hash{"full_name"});
1656 move_buffer
(%hash) if (weechat
::config_boolean
($options{"mouse_move_buffer"}));
1659 elsif ( ($hash{"_key"} eq "button2") && (weechat
::config_boolean
($options{"jump_prev_next_visited_buffer"})) )
1661 # right mouse button
1662 if ( $current_buffer eq $hash{"number2"} )
1664 weechat
::command
("", "/input jump_next_visited_buffer");
1667 elsif ( $hash{"_key"} =~ /wheelup$/ )
1670 if (weechat
::config_boolean
($options{"mouse_wheel"}))
1672 weechat
::command
("", "/buffer -1");
1675 elsif ( $hash{"_key"} =~ /wheeldown$/ )
1678 if (weechat
::config_boolean
($options{"mouse_wheel"}))
1680 weechat
::command
("", "/buffer +1");
1685 my $infolist = weechat
::infolist_get
("hook", "", "command,menu");
1686 my $has_menu_command = weechat
::infolist_next
($infolist);
1687 weechat
::infolist_free
($infolist);
1689 if ( $has_menu_command && $hash{"_key"} =~ /button2/ )
1691 if ($hash{"number"} eq $hash{"number2"})
1693 weechat
::command
($hash{"pointer"}, "/menu buffer1 $hash{short_name} $hash{number}");
1697 weechat
::command
($hash{"pointer"}, "/menu buffer2 $hash{short_name}/$hash{short_name2} $hash{number} $hash{number2}")
1702 move_buffer
(%hash) if (weechat
::config_boolean
($options{"mouse_move_buffer"}));
1710 my $number2 = $hash{"number2"};
1711 if ($number2 eq "?")
1713 # if number 2 is not known (end of gesture outside buffers list), then set it
1714 # according to mouse gesture
1716 if (($hash{"_key"} =~ /gesture-right/) || ($hash{"_key"} =~ /gesture-down/))
1718 $number2 = "999999";
1719 if ($weechat_version >= 0x00030600)
1721 my $hdata_buffer = weechat
::hdata_get
("buffer");
1722 my $last_gui_buffer = weechat
::hdata_get_list
($hdata_buffer, "last_gui_buffer");
1723 if ($last_gui_buffer)
1725 $number2 = weechat
::hdata_integer
($hdata_buffer, $last_gui_buffer, "number") + 1;
1730 my $ptrbuf = weechat
::current_buffer
();
1731 weechat
::command
($hash{"pointer"}, "/buffer move ".$number2);
1734 sub check_immune_detached_buffers
1736 my ($buffername) = @_;
1737 foreach ( @immune_detach_buffers ){
1738 my $immune_buffer = weechat
::string_mask_to_regex
($_);
1739 if ($buffername =~ /^$immune_buffer$/i)
1747 sub check_detach_buffer_immediately
1749 my ($buffername) = @_;
1750 foreach ( @detach_buffer_immediately ){
1751 my $detach_buffer = weechat
::string_mask_to_regex
($_);
1752 if ($buffername =~ /^$detach_buffer$/i)
1762 weechat
::command
("", "/bar hide " . $SCRIPT_NAME) if ( weechat
::config_boolean
($options{"toggle_bar"}) eq 1 );
1763 return weechat
::WEECHAT_RC_OK
1769 my $infolist = weechat
::infolist_get
("bar", "", "");
1770 while (weechat
::infolist_next
($infolist))
1772 my $bar_items = weechat
::infolist_string
($infolist, "items");
1773 if (index($bar_items, $SCRIPT_NAME) != -1)
1775 my $name = weechat
::infolist_string
($infolist, "name");
1776 if ($name ne $SCRIPT_NAME)
1783 weechat
::infolist_free
($infolist);