# This example is a step above Minilla, showing all of the signals # that can be used from Gtk2::MozEmbed. Comments already noted in # Minilla are omitted. # # $CVSHeader: Mozilla-DOM/examples/Signals.pm,v 1.4 2007-06-06 21:46:56 slanning Exp $ package Signals; use strict; use warnings; use Glib qw(TRUE FALSE); use Gtk2; use Gtk2::MozEmbed '0.04'; use Glib::Object::Subclass Gtk2::Window::; sub INIT_INSTANCE { my $self = shift; my $embed = Gtk2::MozEmbed->new(); $embed->load_url("file://$ENV{HOME}"); # List of all signals in GtkMozEmbed. Some of them are lacking # signal marshallers (functions to convert arguments from C to Perl) # in Gtk2::MozEmbed, so they won't be as useful as they could be. # The signal handlers are below. my @signals = qw(link_message js_status location title progress progress_all net_state net_state_all net_start net_stop new_window visibility destroy_browser open_uri size_to dom_key_down dom_key_press dom_key_up dom_mouse_down dom_mouse_up dom_mouse_click dom_mouse_dbl_click dom_mouse_over dom_mouse_out security_change status_change); foreach my $sig (@signals) { my $cb = \&{$sig . '_cb'}; $embed->signal_connect($sig => sub {print "$sig\n"; $cb->(@_)}); # or for example # $embed->signal_connect($sig => $cb); # or simply # $embed->signal_connect($sig => sub {print "$sig\n"}); } $self->add($embed); $self->{_embed} = $embed; } ## Signal handlers # When the link message changes. This happens when # the user moves the mouse over a link in a web page. sub link_message_cb { my $embed = shift; print "\tlink_message=", $embed->get_link_message, $/; } # When the JavaScript status message changes. sub js_status_cb { my $embed = shift; print "\tjs_status=", $embed->get_js_status, $/; } # When the location of the document changes. sub location_cb { my $embed = shift; print "\tlocation=", $embed->get_location, $/; } # When the title of a document changes. sub title_cb { my $embed = shift; print "\ttitle=", $embed->get_title, $/; } # When there is a change in the progress of loading a document. # The cur value indicates how much of the document has been downloaded. # The max value indicates the length of the document. If the value of # max is less than one the full length of the document can not be determined. sub progress_cb { my ($embed, $cur, $max) = @_; print "\tcur=$cur\n\tmax=$max\n"; } # void (* progress_all) (GtkMozEmbed *embed, const char *aURI, # gint curprogress, gint maxprogress); sub progress_all_cb { my ($embed, $uri, $cur, $max) = @_; print "\tcur=$cur\n\tmax=$max\n\turi=$uri\n"; } # When there's a change in the state of the loading of a document. sub net_state_cb { my ($embed, $state_flags, $status) = @_; print "\tflags=$state_flags\n\tstatus=$status\n"; } # void (* net_state_all) (GtkMozEmbed *embed, const char *aURI, # gint state, guint status); sub net_state_all_cb { my ($embed, $uri, $state_flags, $status) = @_; print "\turi=$uri\n\tflags=$state_flags\n\tstatus=$status\n"; } # When the loading of a document starts. sub net_start_cb { my $embed = shift; } # When the loading of a document completes. sub net_stop_cb { my $embed = shift; } # When a new toplevel window is requested by the document. # This will happen in the case of a window.open() in JavaScript. # Responding to this signal allows you to surround a new toplevel # window with your chrome. # You should return the newly created GtkMozEmbed object. sub new_window_cb { my ($embed, $chromemask) = @_; my $newwin = __PACKAGE__->new(chrome => $chromemask); $newwin->set_default_size(600, 400); $newwin->show_all(); # NB: we return the GtkMozEmbed widget inside the window, # not the new window itself. return $newwin->{_embed}; } # When the toplevel window in question needs to be shown or hidden. # If the visibility argument is I then the window should be # shown. If it's I it should be hidden. sub visibility_cb { my ($embed, $visibility) = @_; print "\tvisibility=", ($visibility ? 'true' : 'false'), $/; } # When the document requests that the toplevel window be closed. # This will happen in the case of a JavaScript window.close(). sub destroy_browser_cb { my $embed = shift; } # When the document tries to load a new document, for example when # someone clicks on a link in a web page. This signal gives the # embedder the opportunity to keep the new document from being loaded. # The uri argument is the URI that's going to be loaded. # If you return TRUE from this signal, the new document will NOT # be loaded. If you return FALSE the new document will be loaded. sub open_uri_cb { my ($embed, $uri) = @_; print "\tURI=$uri\n"; return FALSE; } # I'm not sure if this works with Gtk2::MozEmbed. sub size_to_cb { my ($embed, $width, $height) = @_; print "\twidth=$width\n\theight=$height\n"; } # When a key is pressed down. # $event is a Mozilla::DOM::KeyEvent. sub dom_key_down_cb { my ($embed, $event) = @_; _dump_key_event($event); return FALSE; } # When a key is pressed and released. # $event is a Mozilla::DOM::KeyEvent. sub dom_key_press_cb { my ($embed, $event) = @_; _dump_key_event($event); return FALSE; } # When a key is released. # $event is a Mozilla::DOM::KeyEvent. sub dom_key_up_cb { my ($embed, $event) = @_; _dump_key_event($event); return FALSE; } # When the mouse button is pressed. # $event is a Mozilla::DOM::MouseEvent. sub dom_mouse_down_cb { my ($embed, $event) = @_; _dump_mouse_event($event); return FALSE; } # When the mouse button is released. # $event is a Mozilla::DOM::MouseEvent. sub dom_mouse_up_cb { my ($embed, $event) = @_; _dump_mouse_event($event); return FALSE; } # When the mouse button is pressed and released. # $event is a Mozilla::DOM::MouseEvent. sub dom_mouse_click_cb { my ($embed, $event) = @_; _dump_mouse_event($event); return FALSE; } # When the mouse button is quickly clicked twice. # $event is a Mozilla::DOM::MouseEvent. sub dom_mouse_dbl_click_cb { my ($embed, $event) = @_; _dump_mouse_event($event); return FALSE; } # When the mouse cursor moves onto an element. # In the case of nested elements, this event type is always targeted # at the most deeply nested element. # $event is a Mozilla::DOM::MouseEvent. sub dom_mouse_over_cb { my ($embed, $event) = @_; _dump_mouse_event($event); return FALSE; } # When the mouse cursor moves out of an element. # In the case of nested elements, this event type is always targeted # at the most deeply nested element. # $event is a Mozilla::DOM::MouseEvent. sub dom_mouse_out_cb { my ($embed, $event) = @_; _dump_mouse_event($event); return FALSE; } sub security_change_cb { my ($embed, $request, $state) = @_; } sub status_change { my ($embed, $request, $status, $message) = @_; } ## Helper functions sub _dump_mouse_event { my $event = shift; if (ref $event) { my $type = $event->GetType(); print "\tType: $type\n"; # Properties are not only from Mozilla::DOM::MouseEvent, # but also Mozilla::DOM::UIEvent and Mozilla::DOM::Event. foreach my $prop (qw(ScreenX ScreenY ClientX ClientY CtrlKey ShiftKey AltKey MetaKey Button EventPhase Bubbles Cancelable Detail)) { # Button and Detail properties only make sense # for mouse clicks. next if ($prop eq 'Button' or $prop eq 'Detail') and ($type eq 'mouseover' or $type eq 'mouseout'); my $method = "Get$prop"; my $val = $event->$method; print "\t$prop: '$val'\n"; } } } sub _dump_key_event { my $event = shift; if (ref $event) { # Properties are not only from Mozilla::DOM::KeyEvent, # but also Mozilla::DOM::UIEvent and Mozilla::DOM::Event. foreach my $prop (qw(CharCode KeyCode CtrlKey ShiftKey AltKey MetaKey EventPhase Bubbles Cancelable Type TimeStamp Detail)) { my $method = "Get$prop"; my $val = $event->$method; print "\t$prop: '$val'\n"; } } } 1;