ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/rxvt-unicode/doc/rxvt-tabbed
Revision: 1.1
Committed: Sun Feb 20 00:09:25 2005 UTC (19 years, 4 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# Content
1 #!/usr/bin/perl
2
3 # I tried to write this with Tk, as it uses elss memory and is
4 # more widely available. Alas, Tk is rather broken with respect to embedding.
5
6 # on debian, do:
7 # apt-get install libgtk2-perl
8
9 my $RXVT_BASENAME = "rxvt";
10
11 use Gtk2;
12 use Encode;
13
14 my $event_cb; # $wid => $cb
15
16 init Gtk2;
17
18 my $window = new Gtk2::Window 'toplevel';
19
20 my $vbox = new Gtk2::VBox;
21 $window->add ($vbox);
22
23 my $notebook = new Gtk2::Notebook;
24 $vbox->pack_start ($notebook, 1, 1, 0);
25
26 $notebook->can_focus (0);
27 $notebook->set (scrollable => 1);
28
29 sub new_terminal {
30 my ($title, @args) = @_;
31
32 my $label = new Gtk2::Label $title;
33
34 my $rxvt = new Gtk2::Socket;
35 $rxvt->can_focus (1);
36
37 my $wm_normal_hints = sub {
38 my ($window) = @_;
39 my ($type, $format, @data)
40 = $window->property_get (
41 Gtk2::Gdk::Atom->intern ("WM_NORMAL_HINTS", 0),
42 Gtk2::Gdk::Atom->intern ("WM_SIZE_HINTS", 0),
43 0, 70*4, 0
44 );
45 my ($width_inc, $height_inc, $base_width, $base_height) = @data[9,10,15,16];
46
47 my $hints = new Gtk2::Gdk::Geometry;
48 $hints->base_width ($base_width); $hints->base_height ($base_height);
49 $hints->width_inc ($width_inc); $hints->height_inc ($height_inc);
50
51 $rxvt->get_toplevel->set_geometry_hints ($rxvt, $hints, [qw(base-size resize-inc)]);
52 };
53
54 $rxvt->signal_connect_after (realize => sub {
55 my $win = $_[0]->window;
56
57 if (fork == 0) {
58 exec $RXVT_BASENAME,
59 -embed => $win->get_xid, @args;
60 exit (255);
61 }
62
63 0
64 });
65
66 $rxvt->signal_connect_after (plug_added => sub {
67 my ($socket) = @_;
68 my $plugged = ($socket->window->get_children)[0];
69
70 $plugged->set_events ($plugged->get_events + ["property-change-mask"]);
71
72 $wm_normal_hints->($plugged);
73
74 $event_cb{$plugged} = sub {
75 my ($event) = @_;
76 my $window = $event->window;
77
78 if (Gtk2::Gdk::Event::Configure:: eq ref $event) {
79 $wm_normal_hints->($window);
80 } elsif (Gtk2::Gdk::Event::Property:: eq ref $event) {
81 my $atom = $event->atom;
82 my $name = $atom->name;
83
84 return if $event->state; # GDK_PROPERTY_NEW_VALUE == 0
85
86
87 if ($name eq "_NET_WM_NAME") {
88 my ($type, $format, $data)
89 = $window->property_get (
90 $atom,
91 Gtk2::Gdk::Atom->intern ("UTF8_STRING", 0),
92 0, 128, 0
93 );
94
95 $label->set_text (Encode::decode_utf8 $data);
96 }
97 }
98
99 0;
100 };
101
102 0;
103 });
104
105 $rxvt->signal_connect_after (map_event => sub {
106 $_[0]->grab_focus;
107 0
108 });
109
110 $notebook->append_page ($rxvt, $label);
111
112 $rxvt->show_all;
113
114 $notebook->set_current_page ($notebook->page_num ($rxvt));
115
116 $rxvt;
117 }
118
119 my $new = new Gtk2::Frame;
120 $notebook->prepend_page ($new, "New");
121
122 $notebook->signal_connect_after (switch_page => sub {
123 if ($_[2] == 0) {
124 new_terminal $RXVT_BASENAME;
125 }
126 });
127
128 $window->set_default_size (700, 400);
129 $window->show_all;
130
131 # ugly, but gdk_window_filters are ot available in perl
132
133 Gtk2::Gdk::Event->handler_set (sub {
134 my ($event) = @_;
135 my $window = $event->window;
136
137 ($event_cb{$window} && $event_cb{$window}->($event))
138 or Gtk2->main_do_event ($event);
139 });
140
141 main Gtk2;
142