diff options
Diffstat (limited to 'archive/.irssi/scripts/autorun/trackbar.pl')
-rw-r--r-- | archive/.irssi/scripts/autorun/trackbar.pl | 408 |
1 files changed, 408 insertions, 0 deletions
diff --git a/archive/.irssi/scripts/autorun/trackbar.pl b/archive/.irssi/scripts/autorun/trackbar.pl new file mode 100644 index 00000000..ee660910 --- /dev/null +++ b/archive/.irssi/scripts/autorun/trackbar.pl @@ -0,0 +1,408 @@ +# trackbar.pl +# +# Track what you read last when switching to a window. +# +# Copyright (C) 2003 Peter Leurs +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# This little script will do just one thing: it will draw a line each time you +# switch away from a window. This way, you always know just upto where you've +# been reading that window :) It also removes the previous drawn line, so you +# don't see double lines. +# +# Usage: +# +# The script works right out of the box, but if you want you can change +# the working by /set'ing the following variables: +# +# trackbar_string The characters to repeat to draw the bar +# "---" => U+2500 => a line +# "===" => U+2550 => a double line +# "___" => U+2501 => a wide line +# "# #" => U+25ad.U+0020 => a white rectangle and a space +# trackbar_style The style for the bar, %r is red for example +# See formats.txt that came with irssi +# trackbar_hide_windows Comma seperated list of window names where the +# trackbar should not be drawn. +# trackbar_timestamp Prints a timestamp at the start of the bar +# trackbar_timestamp_styled When enabled, the timestamp respects +# trackbar_style +# +# /tb or /tb scroll is a command that will scroll to trackbar. +# +# /tb mark is a command that will redraw the line at the bottom. However! +# This requires irssi version after 20021228. otherwise you'll get the +# error redraw: unknown command, and your screen is all goofed up :) +# +# /upgrade & buf.pl notice: This version tries to remove the trackbars +# before the upgrade is done, so buf.pl does not restore them, as they are +# not removeable afterwards by trackbar. Unfortunately, to make this work, +# trackbar and buf.pl need to be loaded in a specific order. Please +# experiment to see which order works for you (strangely, it differs from +# configuration to configuration, something I will try to fix in a next +# version) +# +# Authors: +# - Main maintainer & author: Peter 'kinlo' Leurs +# - Many thanks to Timo 'cras' Sirainen for placing me on my way +# - on-upgrade-remove-line patch by Uwe Dudenhoeffer +# - trackbar resizing by Michiel Holtkamp (02 Jul 2012) +# - scroll to trackbar, window excludes, and timestamp options by Nico R. +# Wohlgemuth (22 Sep 2012) +# +# Version history: +# 1.9: - add version guard +# 1.8: - sub draw_bar +# 1.7: - Added /tb scroll, trackbar_hide_windows, trackbar_timestamp_timestamp +# and trackbar_timestamp_styled +# 1.6: - Work around Irssi resize bug, please do /upgrade! (see below) +# 1.5: - Resize trackbars in all windows when terminal is resized +# 1.4: - Changed our's by my's so the irssi script header is valid +# - Removed utf-8 support. In theory, the script should work w/o any +# problems for utf-8, just set trackbar_string to a valid utf-8 character +# and everything *should* work. However, this script is being plagued by +# irssi internal bugs. The function Irssi::settings_get_str does NOT handle +# unicode strings properly, hence you will notice problems when setting the bar +# to a unicode char. For changing your bar to utf-8 symbols, read the line sub. +# 1.3: - Upgrade now removes the trackbars. +# - Some code cleanups, other defaults +# - /mark sets the line to the bottom +# 1.2: - Support for utf-8 +# - How the bar looks can now be configured with trackbar_string +# and trackbar_style +# 1.1: - Fixed bug when closing window +# 1.0: - Initial release +# +# Contacts +# https://github.com/mjholtkamp/irssi-trackbar +# +# Known bugs: +# - if you /clear a window, it will be uncleared when returning to the window +# - changing the trackbar style is only visible after returning to a window +# however, changing style/resize takes in effect after you left the window. +# +# Whishlist/todo: +# - instead of drawing a line, just invert timestamp or something, +# to save a line (but I don't think this is possible with current irssi) +# - <@coekie> kinlo: if i switch to another window, in another split window, i +# want the trackbar to go down in the previouswindow in that splitwindow :) +# - < bob_2> anyway to clear the line once the window is read? +# +# BTW: when you have feature requests, mailing a patch that works is the fastest way +# to get it added :p + +# IRSSI RESIZE BUG: +# when resizing from a larger window to a smaller one, the width of the +# trackbar causes some lines at the bottom not to be shown. This only happens +# if the trackbar was not the last line. This glitch can be 'fixed' by +# resetting the trackbar to the last line (e.g. by switching to another window +# and back) and then resize twice (e.g. to a bigger size and back). Of course, +# this is not convenient for the user. +# This script works around this problem by printing not one, but two lines and +# then removing the second line. My guess is that irssi does something to the +# previous line (or the line cache) whenever a line is 'completed' (i.e. the +# EOL is sent). When only one line is printed, it is not 'completed', but when +# printing the second line, the first line is 'completed'. The second line is +# still not completed, but since we delete it straight away, it doesn't matter. +# +# Some effects from older versions (<1.6) of trackbar.pl can still screw up your +# buffer so we recommend to restart your irssi, or do an "/upgrade". After +# installing this version of trackbar.pl + +use strict; +use 5.6.1; +use Irssi 20140701; +use Irssi::TextUI; +use POSIX qw(strftime); +use utf8; + +our $VERSION = "1.9"; + +our %IRSSI = ( + authors => "Peter 'kinlo' Leurs, Uwe Dudenhoeffer, " . + "Michiel Holtkamp, Nico R. Wohlgemuth", + contact => "irssi-trackbar\@supermind.nl", + name => "trackbar", + description => "Shows a bar where you've last read a window", + license => "GPLv2", + url => "http://github.com/mjholtkamp/irssi-trackbar/", + changed => "2015-01-15 08:00", +); + +my %config; + +my $screen_resizing = 0; # terminal is being resized + +# This could be '(status)' if you want to hide the status window +Irssi::settings_add_str('trackbar', 'trackbar_hide_windows' => ''); +$config{'trackbar_hide_windows'} = Irssi::settings_get_str('trackbar_hide_windows'); + +Irssi::settings_add_str('trackbar', 'trackbar_string' => '-'); +$config{'trackbar_string'} = Irssi::settings_get_str('trackbar_string'); + +Irssi::settings_add_str('trackbar', 'trackbar_style' => '%K'); +$config{'trackbar_style'} = Irssi::settings_get_str('trackbar_style'); + +Irssi::settings_add_bool('trackbar', 'trackbar_timestamp' => 0); +$config{'trackbar_timestamp'} = Irssi::settings_get_bool('trackbar_timestamp'); + +Irssi::settings_add_bool('trackbar', 'trackbar_timestamp_styled' => 1); +$config{'trackbar_timestamp_styled'} = Irssi::settings_get_bool('trackbar_timestamp_styled'); + +$config{'timestamp_format'} = Irssi::settings_get_str('timestamp_format'); + +Irssi::signal_add( + 'setup changed' => sub { + $config{'trackbar_string'} = Irssi::settings_get_str('trackbar_string'); + $config{'trackbar_style'} = Irssi::settings_get_str('trackbar_style'); + $config{'trackbar_hide_windows'} = Irssi::settings_get_str('trackbar_hide_windows'); + $config{'trackbar_timestamp'} = Irssi::settings_get_bool('trackbar_timestamp'); + $config{'trackbar_timestamp_styled'} = Irssi::settings_get_bool('trackbar_timestamp_styled'); + $config{'timestamp_format'} = Irssi::settings_get_str('timestamp_format'); + if ($config{'trackbar_style'} =~ /(?<!%)[^%]|%%|%$/) { + Irssi::print( + "trackbar: %RWarning!%n 'trackbar_style' seems to contain " + . "printable characters. Only use format codes (read " + . "formats.txt).", MSGLEVEL_CLIENTERROR); + } + } +); + +Irssi::signal_add( + 'window changed' => sub { + my (undef, $oldwindow) = @_; + + draw_bar($oldwindow); + } +); + +# handel the line creation and the removing of the old lines +sub draw_bar ($) { + (my $window) = @_; + if ($window) { + my $line = $window->view()->get_bookmark('trackbar'); + + if (defined $line) { + $window->view()->remove_line($line); + $window->view()->redraw(); + } + + my $hidden =$config{'trackbar_hide_windows'}; + my $wname =$window->{'name'}; + + if ($wname eq "" || $hidden !~ $wname) { + $window->print(line($window->{'width'}), MSGLEVEL_NEVER); + $window->view()->set_bookmark_bottom('trackbar'); + } + } +} + +# terminal resize code inspired on nicklist.pl +sub sig_terminal_resized { + if ($screen_resizing) { + # prevent multiple resize_trackbars from running + return; + } + $screen_resizing = 1; + Irssi::timeout_add_once(10,\&resize_trackbars,[]); +} + +sub resize_trackbars { + my $active_win = Irssi::active_win(); + for my $window (Irssi::windows) { + next unless defined $window; + my $line = $window->view()->get_bookmark('trackbar'); + next unless defined $line; + + # first add new trackbar line, then remove the old one. For some reason + # this works better than removing the old one, then adding a new one + $window->print_after($line, MSGLEVEL_NEVER, line($window->{'width'})); + my $next = $line->next(); + $window->view()->set_bookmark('trackbar', $next); + $window->view()->remove_line($line); + + # This hack exists to work around a bug: see IRSSI RESIZE BUG above. + # Add a line after the trackbar and delete it immediately + $window->print_after($next, MSGLEVEL_NEVER, line(1)); + $window->view()->remove_line($next->next); + } + $active_win->view()->redraw(); + $screen_resizing = 0; +} + +Irssi::signal_add('terminal resized' => \&sig_terminal_resized); + +sub line { + my $width = shift; + my $string = $config{'trackbar_string'}; + + my $tslen = 0; + + if ($config{'trackbar_timestamp'}) { + $tslen = int(1 + length $config{'timestamp_format'}); + } + + if (!defined($string) || $string eq '') { + $string = '-'; + } + + # There is a bug in (irssi's) utf-8 handling on config file settings, as you + # can reproduce/see yourself by the following code sniplet: + # + # my $quake = pack 'U*', 8364; # EUR symbol + # Irssi::settings_add_str 'temp', 'temp_foo' => $quake; + # $a= length($quake); + # # $a => 1 + # $a= length(Irssi::settings_get_str 'temp_foo'); + # # $a => 3 + # $a= utf8::is_utf8(Irssi::settings_get_str 'temp_foo'); + # # $a => false + + utf8::decode($string); + + if ($string =~ m/---/) { + $string = pack('U*', 0x2500); + } + + if ($string =~ m/===/) { + $string = pack('U*', 0x2550); + } + + if ($string =~ m/___/) { + $string = pack('U*', 0x2501); + } + + if ($string =~ m/# #/) { + $string = pack('U*', 0x25ad)." "; + } + + my $length = length $string; + + my $times = $width / $length - $tslen; + $times = int(1 + $times) if $times != int($times); + $string =~ s/%/%%/g; + + if ($tslen) { + # why $config{'timestamp_format'} won't work here? + my $ts = strftime(Irssi::settings_get_str('timestamp_format')." ", localtime); + + if ($config{'trackbar_timestamp_styled'}) { + return $config{'trackbar_style'} . $ts . substr($string x $times, 0, $width); + } else { + return $ts . $config{'trackbar_style'} . substr($string x $times, 0, $width); + } + } else { + return $config{'trackbar_style'} . substr($string x $times, 0, $width); + } +} + +# Remove trackbars on upgrade - but this doesn't really work if the scripts are not loaded in the correct order... watch out! + +Irssi::signal_add_first('session save' => sub { + for my $window (Irssi::windows) { + next unless defined $window; + my $line = $window->view()->get_bookmark('trackbar'); + $window->view()->remove_line($line) if defined $line; + } +} +); + +sub cmd_mark { + my $window = Irssi::active_win(); + + draw_bar($window); +} + + +# mark all visible windows with a line +sub cmd_mark_visual { + my $w= Irssi::active_win(); + my $refs =$w->{refnum}; + my $refa; + + cmd_mark(); + + do { + Irssi::command('window down'); + $w= Irssi::active_win(); + $refa =$w->{refnum}; + + if ($refs != $refa) { + cmd_mark(); + } + + } while ($refs != $refa) +} + +# /tb or /trackbar +sub cmd_tb { + if ($#_ >=0 ) { + my $sc = shift @_; + $sc =~ s/\s+$//; + + if ($sc eq "mark") { + cmd_mark(); + } elsif ($sc eq "help") { + cmd_help("trackbar"); + } elsif ($sc eq "vmark") { + cmd_mark_visual(); + } else { + cmd_scroll(); + } + } +} + +sub cmd_scroll { + my $window = Irssi::active_win(); + my $line = $window->view()->get_bookmark('trackbar'); + $window->view()->scroll_line($line) if defined $line; +} + +sub cmd_help { + my $help = <<HELP; +/trackbar or /tb + /tb mark + - Set the trackbar of the current window at the bottom + /tb vmark + - Set the trackbar on all visible windows + /tb scroll + - Scroll to where the trackbar is right now + /tb help + - this help + /tb + - Same as /tb scroll +HELP + if ($_[0] =~ m/^tb/ or $_[0] =~ m/^trackbar/ ) { + Irssi::print($help, MSGLEVEL_CLIENTCRAP); + Irssi::signal_stop; + } +} + +Irssi::command_bind('tb', 'cmd_tb'); +Irssi::command_bind('tb help', 'cmd_tb'); +Irssi::command_bind('tb mark', 'cmd_tb'); +Irssi::command_bind('tb scroll', 'cmd_tb'); +Irssi::command_bind('tb vmark', 'cmd_tb'); + +Irssi::command_bind('trackbar', 'cmd_tb'); +Irssi::command_bind('trackbar help', 'cmd_tb'); +Irssi::command_bind('trackbar mark', 'cmd_tb'); +Irssi::command_bind('trackbar scroll', 'cmd_tb'); +Irssi::command_bind('trackbar vmark', 'cmd_tb'); + +Irssi::command_bind('mark', 'cmd_mark'); +#Irssi::command_bind('scroll', 'cmd_scroll'); +Irssi::command_bind('help', 'cmd_help'); |