]> git.rmz.io Git - dotfiles.git/blob - weechat/perl/buffers.pl
vim: show trailing space on first start
[dotfiles.git] / weechat / perl / buffers.pl
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 }