Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
192 lines (165 sloc) 4.63 KB
##############################################################################
#
# mh_windowfill.pl v1.07 (20160207)
#
# Copyright (c) 2015, 2016 Michael Hansen
#
# Permission to use, copy, modify, and distribute this software
# for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
##############################################################################
#
# fill windows so scrolling starts bottom-up instead of top-down
#
# screenshots:
#
# without script: http://escaflowne.hro.nl/~mh/mh_windowfill_without.png
# or
# http://rud0lf.webatu.com/mh_windowfill_without.png
#
# with script: http://escaflowne.hro.nl/~mh/mh_windowfill_with.png
# or
# http://rud0lf.webatu.com/mh_windowfill_with.png
#
# history:
#
# v1.07 (20160207)
# changed url of screenshots because picpaste have a weird definition of forever
# added namespace to MSGLEVEL
# v1.06 (20151220)
# added changed field to irssi header
# v1.05 (20151206)
# added a few comments
# v1.04 (20151128)
# call windowfill* directly from signals
# removed on load timeout
# v1.03 (20151125)
# cleaned up /clear
# added view()->redraw() to windowfill()
# optimistically changed url
# v1.02 (20151118)
# new windowfill routine
# fixed /clear
# v1.01 (20151116)
# source cleanup
# v1.00 (20151116)
# initial release
#
use v5.14.2;
use strict;
##############################################################################
#
# irssi head
#
##############################################################################
use Irssi 20100403;
use Irssi::TextUI;
our $VERSION = '1.07';
our %IRSSI =
(
'name' => 'mh_windowfill',
'description' => 'fill windows so scrolling starts bottom-up instead of top-down (screenshots linked in source)',
'license' => 'BSD',
'authors' => 'Michael Hansen',
'contact' => 'mh on IRCnet #help',
'url' => 'http://scripts.irssi.org / https://github.com/mh-source/irssi-scripts',
'changed' => 'Sun Feb 7 18:24:50 CET 2016',
);
##############################################################################
#
# script functions
#
##############################################################################
sub windowfill_fill
{
my ($window) = @_;
while ($window->view()->{'empty_linecount'})
{
$window->print('', Irssi::MSGLEVEL_NEVER);
}
}
sub windowfill_fill_all
{
for my $window (Irssi::windows())
{
windowfill_fill($window);
}
}
sub windowfill
{
my ($window) = @_;
#
# fill window with empty lines and move already printed lines to the bottom
#
if ($window->view()->{'empty_linecount'})
{
my $line = $window->view()->get_lines();
my $linecount = 0;
#
# count lines we need to move
#
while ($line)
{
$linecount++;
$line = $line->next();
}
windowfill_fill($window);
$line = $window->view()->get_lines();
#
# move lines down
#
while ($linecount)
{
my $linetext = $line->get_text(1);
$line = $line->next();
$window->print($linetext, Irssi::MSGLEVEL_NEVER);
$window->view()->remove_line($line->prev());
$linecount--;
}
$window->view()->redraw();
}
}
sub windowfill_all
{
for my $window (Irssi::windows())
{
windowfill($window);
}
}
##############################################################################
#
# irssi command functions
#
##############################################################################
sub command_clear
{
my ($data, $server, $windowitem) = @_;
Irssi::signal_continue($data, $server, $windowitem);
windowfill_fill_all();
}
##############################################################################
#
# script on load
#
##############################################################################
Irssi::signal_add_last('mainwindow resized', 'windowfill_all');
Irssi::signal_add_last('window created', 'windowfill');
Irssi::command_bind('clear', 'command_clear');
windowfill_all();
1;
##############################################################################
#
# eof mh_windowfill.pl
#
##############################################################################