This file is indexed.

/usr/share/perl5/Gtk2/GladeXML/Simple.pm is in libgtk2-gladexml-simple-perl 0.32-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
package Gtk2::GladeXML::Simple;

use 5.008;
use strict;
use warnings;
use Carp;
use Gtk2;
use Gtk2::GladeXML;

our $VERSION = '0.32';

sub new {
    my ( $caller, $gladefile, $root, $domain ) = @_;
    croak "You need to specify a glade file first" unless $gladefile;
    my $self = bless {}, ref( $caller ) || $caller;
    Gtk2::Glade->set_custom_handler( sub{ $self->_custom_handler( @_ ) } );
    $self->{xml} = Gtk2::GladeXML->new( $gladefile, $root, $domain );
    $self->_signal_autoconnect_simple;
    $self->_get_widgets;
    return $self;
}

sub glade_object {
    my ( $self ) = @_;
    return $self->{xml};
}

sub get_widget {
    my ( $self, $widget ) = @_;
    return $self->{$widget};
}

sub get_widgets {
    my ( $self ) = @_;
    return $self->glade_object->get_widget_prefix( '' );
}

sub run {
    my ( $self ) = @_;
    Gtk2->main;
}

sub _get_widgets {
    my ( $self ) = @_;
    $self->{ $_->get_widget_name } = $_ foreach $self->get_widgets;
}

sub _custom_handler {
    my ( $self, $xml, $func_name, $name, $str1, $str2, $int1, $int2 ) = @_;
    $self->$func_name( $str1, $str2, $int1, $int2 );
}

sub _signal_autoconnect_simple {
    my ( $self ) = @_;
    $self->glade_object->signal_autoconnect( \&_autoconnect_helper, $self );
}

sub _autoconnect_helper {
    my ( $handler_name, $object, $signal_name, $signal_data,
	 $connect_object, $is_after, $self ) = @_;

    my $connect_func = $is_after ? 'signal_connect_after' : 'signal_connect';
    $object->$connect_func( $signal_name,
			    sub { $self->$handler_name( @_ ) },
			    $signal_data );
}

1;
__END__

=head1 NAME

Gtk2::GladeXML::Simple - A clean object-oriented interface to Gtk2::GladeXML

=head1 SYNOPSIS

   package MyApp;
   use base qw( Gtk2::GladeXML::Simple );

   sub new {
      my $class = shift;
      my $self = $class->SUPER::new( $gladefile );
      return $self;
   }

   ...

   # Signal handlers are methods of your class
   sub on_button_clicked {
      my $self = shift;
      # You have access to your widgets directly
      # or using $self->get_widget( widget_name )
      my $button = $self->{button1};
   }

=head1 DESCRIPTION

Gtk2::GladeXML::Simple is a module that provides a clean and easy interface
for Gnome/Gtk2 and Glade applications using an object-oriented syntax. You just
make Gtk2::GladeXML::Simple your application's base class, have your C<new> call
C<SUPER::new>, and the module will do the tedious and dirty work for you.

Gtk2::GladeXML::Simple offers:

=over

=item *

Signal handler callbacks as methods of your class.

   sub on_button1_clicked {
      my $self = shift; # $self always received as first parameter
      ...
      # do anything you want in a OO fashioned way
   }

=item *

Autoconnection of signal handlers.

=item *

Autocalling of creation functions for custom widgets.

=item *

Access to the widgets as instance attributes.

   my $btn = $self->{button1}; # fetch widgets as instance attributes by their names
   my $window = $self->{main_window};
   my $custom = $self->{custom_widget};

=back


=head1 METHODS

This class provides the following public methods:

=over

=item new( $gladefile I<[, $root, $domain ]> );

This method creates a new object of your subclass of Gtk2::GladeXML::Simple.
The C<$gladefile> parameter is the name of the file created by the Glade Visual Editor.
The C<$root> is an optional parameter that tells C<libglade> the name of the widget
to start building from. The optional C<$domain> parameter that specifies the translation
domain for the glade xml file ( undef by default ).

=item glade_object

This method returns the Gtk2::GladeXML object in play.

=item get_widget( $widget_name )

Returns the widget with given name. Same as calling $self->{$widget_name}.

=item get_widgets

Returns a list with all the widgets in the glade file.

=item run

Call this method in order to run your application. If you need another event loop
rather than the Gtk one, override I<run> in your class with your event loop (for
example the GStreamer event loop).

=back

=head1 EXTENDED EXAMPLE

This example shows the usage of the module by creating a small Yahoo search
engine using WWW::Search::Yahoo.

   package YahooApp;

   use strict;
   use warnings;
   use Gtk2 '-init';
   use Gtk2::Html2; #not part of the Gtk2 core widgets
   use Gtk2::GladeXML::Simple;
   use WWW::Search;

   use base qw( Gtk2::GladeXML::Simple );

   my $header =<<HEADER;
   <html>
   <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
   <header><title>Yahoo Gtk2 App</title>
   <style type="text/css">
   .title {font-family: Georgia; color: blue; font-size: 13px}
   .description {padding-left: 3px; font-family: Georgia; font-size:10px}
   .url {padding-left: 3px; font-family: Georgia; font-size:10px; color: green}
   </style>
   </head>
   <body>
   <h2 style="font-family: Georgia, Arial; font-weight: bold">
   Found:
   </h2>
   HEADER

   my $footer =<<FOOTER;
   </body>
   </html>
   FOOTER

   sub new {
       my $class = shift;
       #Calling our super class constructor
       my $self = $class->SUPER::new( 'yahoo.glade' );
       #Initialize the search engine
       $self->{_yahoo} = WWW::Search->new( 'Yahoo' );
       return $self;
   }

   sub do_search {
       my $self = shift;
       $self->{_yahoo}->native_query( shift );
       my $buf = $header;
       for( 1..10 ) {
	   my $rv = $self->{_yahoo}->next_result || last;
	   $buf .= qq{<p><div class="title">} . $rv->title;
	   $buf .= qq{</div><br /><div class="description">} . $rv->description;
	   $buf .= qq{</div><br /><div class="url">} . $rv->url . q{</div></p><br />};
       }
       $buf .= $footer;
       $self->{buf} = $buf;
   }

   ### Signal handlers, now they're methods of the class ###
   sub on_Clear_clicked {
       my $self = shift;
       my $html = $self->{custom1}; #fetch widgets by their names
       $html->{document}->clear;
       my $statusbar = $self->{statusbar1}; #another widget
       $statusbar->pop( $statusbar->get_context_id( "Yahoo" ) );
   }

   sub on_Search_clicked {
       my $self = shift;
       my $text = $self->{text_entry}->get_text;
       return unless $text ne '';
       my $statusbar = $self->{statusbar1};
       $statusbar->push( $statusbar->get_context_id( "Yahoo" ), "Searching for: $text" );
       $self->do_search( $text );
       my $html = $self->{custom1};
       $html->{document}->clear;
       $html->{document}->open_stream( "text/html" );
       $html->{document}->write_stream( $self->{buf} );
       $html->{document}->close_stream;
   }

   ### Creation function for the custom widget, method of the class as well ###
   sub create_htmlview {
       my $self = shift;
       my $view = Gtk2::Html2::View->new;
       my $document = Gtk2::Html2::Document->new;
       $view->set_document( $document );
       $view->{document} = $document;
       $view->show_all;
       return $view;
   }

   sub gtk_main_quit { Gtk2->main_quit }

   1;

   package main;

   YahooApp->new->run; #Go!

   1;

The I<yahoo.glade> file needed for this example is in the I<examples> directory,
along with other example programs.

=head1 UTILITIES

=head2 Rapid Application Development with I<gpsketcher>

The Gtk2::GladeXML::Simple distribution includes I<gpsketcher>, a program that
generates Perl code stubs from glade XML files. The code stubs include the basic
framework for Gtk2::GladeXML::Simple interaction, method signatures, and everything
that describes the application itself. Developers must fill in the code stubs to
add the correct functionality to the application.

=head1 SEE ALSO

L<Gtk2::GladeXML>, L<Gtk2>, L<gpsketcher>

The Libglade Reference Manual at L<http://developer.gnome.org/doc/API/2.0/libglade/>

The gtk2 API Reference at L<http://developer.gnome.org/doc/API/2.0/gtk/index.html>

=head1 TODO

Tests.

More examples?

Add Gtk2::GladeXML::Simple::new_from_buffer()?

Support to I18N ( bindtextdomain )

=head1 AUTHOR

Marco Antonio Manzo <marcoam@perl.org.mx>

Special thanks in no order to Scott Arrington "muppet" <scott at asofyet dot org> who provided
lots of great ideas to improve this module. Sandino "tigrux" Flores <tigrux at ximian dot com>
who is the author of SimpleGladeApp and the main source of this module's core idea.
Sean M. Burke <sburke at cpan dot org> and Rocco Caputo <rcaputo at cpan dot org> for constantly
helping me with ideas and cleaning my POD.

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2005 by Marco Antonio Manzo

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.

=cut