Proper urxvt resizing.
authorIain Patterson <me@iain.cx>
Thu, 27 Aug 2009 10:51:01 +0000 (11:51 +0100)
committerIain Patterson <me@iain.cx>
Thu, 27 Aug 2009 16:16:08 +0000 (17:16 +0100)
Use Perl extension to dynamically change fontsets.
Note that because we can't put variables into the URxvt.perl-lib
resource we assume that urxvt is run from the home directory and can
thus find .urxvt in there.

.Xdefaults
.urxvt/font [new file with mode: 0644]

index 0f74741..2ceb3c9 100644 (file)
@@ -40,8 +40,10 @@ urxvt.scrollstyle: next
 urxvt.secondaryscroll: True
 urxvt.answerbackString: urxvt
 ! Change font size.
-urxvt.keysym.M-minus: command:\033]50;xft:DejaVu Sans Mono:pixelsize=10:aspect=0.9,xft:AR PL UMing HK\007
-urxvt.keysym.M-equal: command:\033]50;xft:DejaVu Sans Mono:pixelsize=12:aspect=0.9,xft:AR PL UMing HK\007
+urxvt.perl-lib: .urxvt
+urxvt.perl-ext: font
+urxvt.keysym.M-minus: perl:font:smaller
+urxvt.keysym.M-equal: perl:font:bigger
 
 ! transparency
 !rxvt*inheritPixmap:   True
diff --git a/.urxvt/font b/.urxvt/font
new file mode 100644 (file)
index 0000000..1796a45
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+
+# Perl extension to resize the terminal.
+sub on_user_command {
+  my ($self, $cmd) = @_;
+
+  # Get existing fontset, something like:
+  # xft:DejaVu Sans Mono:pixelsize=12:aspect=0.9,xft:AR PL Uming HK
+  my $fontset = $self->{term}->resource("font");
+  my @fonts = split /,/, $fontset;
+  my @new = ();
+
+  # Split into individual font definitions.
+  foreach my $font (@fonts) {
+    if ($font =~ /:pixelsize=(\d+)/) {
+      my $size = $1;
+      my $adjusted = $size;
+
+      # Rewrite the font definition to be resized.
+      if ($cmd =~ /:bigger/) { $adjusted++ }
+      elsif ($cmd =~ /:smaller/) { $adjusted-- }
+
+      $font =~ s/:pixelsize=$size/:pixelsize=$adjusted/;
+    }
+
+    push @new, $font;
+  }
+
+  # Set the new fontset.  Just putting the resource doesn't work so
+  # use an escape sequence.
+  $fontset = join(",", @new);
+  $self->{term}->cmd_parse("\033]50;$fontset\007");
+}