html/resize_split.pl


   1 use Irssi;
   2 use strict;
   3 use vars qw/$VERSION %IRSSI/;
   4 $VERSION = 1.0;
   5 %IRSSI = (
   6    authors     => 'David Leadbeater',
   7    contact     => 'dgl@dgl.cx',
   8    name        => 'resize_split',
   9    description => 'Resizes a split window when it is made active (see comments in script for details)',
  10    license     => 'GNU GPLv2 or later',
  11    url         => 'http://irssi.dgl.cx/',
  12 );
  13 
  14 # This script is for if you have a split window for status (or anything else)
  15 # it makes it bigger when it's active.
  16 # (The way I have Irssi setup is with a split status window along the top,
  17 # created with /window show 1 in a channel window).
  18  
  19 # For example you do a command that outputs a large amount of text into
  20 # the status window such as /help or /motd (depending on what you put in
  21 # your status window). Then simply hit alt+up and the status window resizes
  22 # to give you more room to read the output, when you go back to another window
  23 # the status window will automatically go back to its previous size.
  24 
  25 # BUGS (mostly due to lack of Irssi API for split windows).
  26 # As far as I can see there is no easy way to find out where in a split a
  27 # window is displayed, so if more than one window is sticky inside a split
  28 # and you set that window in the setting below this script will have problems.
  29 # Also if you have more than 2 split windows things won't work as expected.
  30 
  31 # Setting: resize_windows
  32 # A space seperated list of windows that you want to be resized when you
  33 # change to them.
  34 # If it contains something that's not a (permanently displayed) split window
  35 # then windows will probably end up with incorrect sizes.
  36 Irssi::settings_add_str("misc", "resize_windows", "1");
  37 
  38 Irssi::signal_add("window changed", \&winchg);
  39 
  40 sub winchg {
  41    my($newwin, $oldwin) = @_;
  42    if(is_resized($oldwin->{refnum})) {
  43       my $height = $oldwin->{height} - $newwin->{height};
  44       return if $height < 0; # Work around bug in Irssi, minus numbers here
  45                              # do weird things (i.e. grow without error
  46                              # checking)
  47       $oldwin->command("window shrink $height");
  48    }
  49    
  50    if(is_resized($newwin->{refnum})) {
  51       my $height = $oldwin->{height} - $newwin->{height};
  52       return if $height < 0; # same problem as above..
  53       $newwin->command("window grow $height");
  54    }
  55 }
  56 
  57 sub is_resized {
  58    for my $refnum(split ' ', Irssi::settings_get_str("resize_windows")) {
  59       return 1 if $refnum == $_[0];
  60    }
  61 }
  62