ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/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

# User Rev Content
1 root 1.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