]> jfr.im git - irssi-scripts.git/commitdiff
add title.pl
authorJohn Runyon <redacted>
Sat, 24 Feb 2024 07:33:37 +0000 (00:33 -0700)
committerJohn Runyon <redacted>
Sat, 24 Feb 2024 07:38:05 +0000 (00:38 -0700)
title.pl [new file with mode: 0644]

diff --git a/title.pl b/title.pl
new file mode 100644 (file)
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);
+