From: John Runyon Date: Sat, 24 Feb 2024 07:33:37 +0000 (-0700) Subject: add title.pl X-Git-Url: https://jfr.im/git/irssi-scripts.git/commitdiff_plain/f9e11d049221fb7fc212a4789633427cc9c9ed03 add title.pl --- diff --git a/title.pl b/title.pl new file mode 100644 index 0000000..bec0d4f --- /dev/null +++ b/title.pl @@ -0,0 +1,150 @@ +use strict; +use vars qw($VERSION %IRSSI); +use Irssi 20020120.0250 (); +$VERSION = "3.2b"; +%IRSSI = ( + authors => 'Timo Sirainen, David Leadbeater', + contact => 'tss@iki.fi, dgl@dgl.cx', + name => 'title', + description => 'Display configurable title as XTerm title', + license => 'GNU GPL', + url => 'http://irssi.dgl.cx/', +); + +# Settings: +# title_string: The string used in the title, see below for explaination +# title_topic_length: The length to truncate the topic to (some terminals have +# problems with long titles). +# title_screen_window: (EXPERIMENTAL), sets the screen window title rather than +# the Xterm title. + +# The $vars are normal Irssi vars (docs/special_vars.txt). +# $.var does some magic, adds a space at the begining and brackets around +# the item but only if it produces output. + +# Here is some examples: +# The default: +# /set title_string Irssi: [$N@$tag]$.C$.winname$.act +# Quite nice with lots of info: +# /set title_string $cumode$winname$C$.M$.act$.topic +# Nickname with usermode +# /set title_string $N(+$usermode) + +# To use this with screen you need some lines in your ~/.screenrc +# termcap xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007' +# terminfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007' +# This probably only works if you have $TERM set to xterm. + +my %act; +use IO::Handle; + +sub xterm_topic { + my($text) = @_; + + STDERR->autoflush(1); + if(Irssi::settings_get_bool('title_screen_window')) { + print STDERR "\033k$text\033\\"; + }else{ + print STDERR "\033]0;$text\007"; + } +} + +sub refresh_topic { + my $title = Irssi::settings_get_str('title_string'); + $title =~ s/\$([A-Za-z.,;:]+)/special_var($1)/eg; + xterm_topic($title); +} + +sub special_var { + my($str) = @_; + + my($begin,$end); + if($str =~ s/^\.//) { + $begin = ' ['; + $end = ']'; + }else{ + $begin = $end = ''; + } + + my $result; + if($str eq 'topic') { + $result = topic_str(); + }elsif($str eq 'act') { + $result = act_str(); + }else{ + my $item = ref Irssi::active_win() ? Irssi::active_win()->{active} : ''; + $item = Irssi::active_server() unless ref $item; + return '' unless ref $item; + + $result = $item->parse_special('$' . $str); + } + + $begin = '(+', $end = ')' if $str eq 'M' && $begin; + + return $result ? $begin . $result . $end : ''; +} + +sub topic_str { + my $server = Irssi::active_server(); + my $item = ref Irssi::active_win() ? Irssi::active_win()->{active} : ''; + + if(ref $server && ref $item && $item->{type} eq 'CHANNEL') { + my $topic = $item->{topic}; + # Remove colour and bold from topic... + $topic =~ s/\003(\d{1,2})(\,(\d{1,2})|)//g; + $topic =~ s/[\x00-\x1f]//g; + $topic = substr($topic, 0,Irssi::settings_get_int('title_topic_length')); + return $topic if length $topic; + } + return ''; +} + +sub act_str { + my @acts; + for my $winref(keys %act) { + # handle windows with items and not gracefully + my $window = Irssi::window_find_refnum($winref); + if(defined($window)) { + for my $win ($window->items or $window) { + if($win->{data_level} >= 3 || $win->{data_lev} >= 3) { + push(@acts,$win->{name}); + } else { + delete($act{$winref}); + } + } + } else { + delete($act{$winref}); + } + } + return join(', ',@acts); +} + +sub topic_changed { + my($chan) = @_; + return unless ref Irssi::active_win() && + Irssi::active_win()->{active}->{type} eq 'CHANNEL'; + return unless lc $chan->{name} eq lc Irssi::active_win()->{active}->{name}; + + refresh_topic(); +} + +sub hilight_win { + my($win) = @_; + return unless ref $win && $win->{data_level} >= 3; + $act{$win->{refnum}}++; + + refresh_topic(); +} + +Irssi::signal_add_last('window changed', 'refresh_topic'); +Irssi::signal_add_last('window item changed', 'refresh_topic'); +Irssi::signal_add_last('window server changed', 'refresh_topic'); +Irssi::signal_add_last('server nick changed', 'refresh_topic'); +Irssi::signal_add_last('channel topic changed', 'topic_changed'); +Irssi::signal_add_last('window hilight', 'hilight_win'); +Irssi::signal_add_last('setup changed', 'refresh_topic'); + +Irssi::settings_add_str('misc', 'title_string', 'Irssi: [$N@$tag]$.C$.winname$.act'); +Irssi::settings_add_int('misc', 'title_topic_length', 250); +Irssi::settings_add_bool('misc', 'title_screen_window', 0); +