3 # I tried to write this with Tk, as it uses less memory and is
4 # more widely available. Alas, Tk is rather broken with respect to embedding.
7 # apt-get install libgtk2-perl
9 # Also see the Gtk2::URxvt module family, which does this much cleaner
10 # and provides a real tabbed-terminal.
12 my $RXVT_BASENAME = "rxvt";
17 $SIG{CHLD} = 'IGNORE';
19 my $event_cb; # $wid => $cb
23 my $window = new Gtk2::Window 'toplevel';
25 my $vbox = new Gtk2::VBox;
28 my $notebook = new Gtk2::Notebook;
29 $vbox->pack_start ($notebook, 1, 1, 0);
31 $notebook->can_focus (0);
32 $notebook->set (scrollable => 1);
35 my ($title, @args) = @_;
37 my $label = new Gtk2::Label $title;
39 my $rxvt = new Gtk2::Socket;
42 my $wm_normal_hints = sub {
44 my ($type, $format, @data)
45 = $window->property_get (
46 Gtk2::Gdk::Atom->intern ("WM_NORMAL_HINTS", 0),
47 Gtk2::Gdk::Atom->intern ("WM_SIZE_HINTS", 0),
50 my ($width_inc, $height_inc, $base_width, $base_height) = @data[9,10,15,16];
52 my $hints = new Gtk2::Gdk::Geometry;
53 $hints->base_width ($base_width); $hints->base_height ($base_height);
54 $hints->width_inc ($width_inc); $hints->height_inc ($height_inc);
56 $rxvt->get_toplevel->set_geometry_hints ($rxvt, $hints, [qw(base-size resize-inc)]);
59 $rxvt->signal_connect_after (realize => sub {
60 my $win = $_[0]->window;
64 -embed => $win->get_xid, @args;
71 $rxvt->signal_connect_after (plug_added => sub {
73 my $plugged = ($socket->window->get_children)[0];
75 $plugged->set_events ($plugged->get_events + ["property-change-mask"]);
77 $wm_normal_hints->($plugged);
79 $event_cb{$plugged} = sub {
81 my $window = $event->window;
83 if (Gtk2::Gdk::Event::Configure:: eq ref $event) {
84 $wm_normal_hints->($window);
85 } elsif (Gtk2::Gdk::Event::Property:: eq ref $event) {
86 my $atom = $event->atom;
87 my $name = $atom->name;
89 return if $event->state; # GDK_PROPERTY_NEW_VALUE == 0
92 if ($name eq "_NET_WM_NAME") {
93 my ($type, $format, $data)
94 = $window->property_get (
96 Gtk2::Gdk::Atom->intern ("UTF8_STRING", 0),
100 $label->set_text (Encode::decode_utf8 $data);
110 $rxvt->signal_connect_after (map_event => sub {
115 $notebook->append_page ($rxvt, $label);
119 $notebook->set_current_page ($notebook->page_num ($rxvt));
124 my $new = new Gtk2::Frame;
125 $notebook->prepend_page ($new, "New");
127 $notebook->signal_connect_after (switch_page => sub {
129 new_terminal $RXVT_BASENAME;
133 $window->set_default_size (700, 400);
136 # ugly, but gdk_window_filters are ot available in perl
138 Gtk2::Gdk::Event->handler_set (sub {
140 my $window = $event->window;
142 ($event_cb{$window} && $event_cb{$window}->($event))
143 or Gtk2->main_do_event ($event);