diff -ru Gtk2-MozEmbed-0.03-orig/Makefile.PL Gtk2-MozEmbed-0.03/Makefile.PL --- Gtk2-MozEmbed-0.03-orig/Makefile.PL 2005-03-23 22:33:18.000000000 +0000 +++ Gtk2-MozEmbed-0.03/Makefile.PL 2005-04-02 00:35:38.000000000 +0000 @@ -13,7 +13,8 @@ 'perl-ExtUtils-Depends' => '0.20', 'perl-ExtUtils-PkgConfig' => '1.03', 'perl-Glib' => '1.06', - 'perl-Gtk2' => '1.00', + 'perl-Gtk2' => '1.00', # '1.081' when that's released + 'perl-Mozilla-DOM' => '0.01', 'GtkMozEmbed' => '1.7', ); @@ -36,6 +37,14 @@ exit 1; # not reached } +# Check if Mozilla::DOM is installed. (could use an ENABLE_DOM option) +my $use_dom = 1; +unless (eval "use Mozilla::DOM '$build_reqs{'perl-Mozilla-DOM'}'; 1") { + warn "$ \n"; + $use_dom = 0; +} + + my %pkgcfg = ExtUtils::PkgConfig->find("mozilla-gtkmozembed >= $build_reqs{'GtkMozEmbed'}"); mkdir 'build', 0777; @@ -54,12 +63,14 @@ "mozilla-gtkmozembed" => "GTK_MOZ_EMBED", ); -my $mozembed = ExtUtils::Depends->new('Gtk2::MozEmbed', 'Gtk2'); +my $mozembed = ExtUtils::Depends->new('Gtk2::MozEmbed', 'Gtk2', + ($use_dom ? ('Mozilla::DOM') : ())); + $mozembed->set_inc($pkgcfg{cflags}); $mozembed->set_libs($pkgcfg{libs}); $mozembed->add_xs(@xs_files); $mozembed->add_pm('MozEmbed.pm' => '$(INST_LIBDIR)/MozEmbed.pm'); -$mozembed->add_typemaps(map {File::Spec->catfile(cwd(), $_)} 'build/gtkmozembed2perl.typemap'); +$mozembed->add_typemaps(map {File::Spec->catfile(cwd(), $_)} qw(build/gtkmozembed2perl.typemap)); $mozembed->install(qw(gtkmozembed2perl.h build/gtkmozembed2perl-autogen.h)); $mozembed->save_config('build/IFiles.pm'); @@ -74,6 +85,7 @@ XSPROTOARG => '-noprototypes', MAN3PODS => \%pod_files, LD => "LD_RUN_PATH=$libdir $Config{ld}", + ($use_dom ? (CC => 'c++', XSOPT => '-C++') : ()), $mozembed->get_makefile_vars, ); diff -ru Gtk2-MozEmbed-0.03-orig/MozEmbed.pm Gtk2-MozEmbed-0.03/MozEmbed.pm --- Gtk2-MozEmbed-0.03-orig/MozEmbed.pm 2005-03-23 22:33:17.000000000 +0000 +++ Gtk2-MozEmbed-0.03/MozEmbed.pm 2005-04-02 00:35:38.000000000 +0000 @@ -7,6 +7,7 @@ use warnings; use Gtk2; +eval "use Mozilla::DOM; 1;"; require DynaLoader; diff -ru Gtk2-MozEmbed-0.03-orig/examples/pumzilla Gtk2-MozEmbed-0.03/examples/pumzilla --- Gtk2-MozEmbed-0.03-orig/examples/pumzilla 2005-03-23 22:33:17.000000000 +0000 +++ Gtk2-MozEmbed-0.03/examples/pumzilla 2005-04-02 16:34:42.000000000 +0000 @@ -157,6 +157,58 @@ return $pumzilla -> { _embed }; }); + # dom_key_* signals + foreach my $signal (map {"dom_key_$_"} qw/press down up/) { + $embed->signal_connect($signal => sub { + my ($embed, $event) = @_; + + print "$signal\n"; + if (ref $event) { + my %props = (); + foreach my $prop (qw(char_code key_code + ctrl_key shift_key alt_key meta_key + event_phase bubbles cancelable detail)) + { + my $method = "get_$prop"; + $props{$prop} = $event->$method; + } + + foreach my $prop (sort keys %props) { + print "\t$prop: '$props{$prop}'\n"; + } + } + + return 1; + }); + } + + # dom_mouse_* signals + foreach my $signal (map {"dom_mouse_$_"} qw/click down up dbl_click over out/) { + $embed->signal_connect($signal => sub { + my ($embed, $event) = @_; + + print "$signal\n"; + if (ref $event) { + my %props = (); + foreach my $prop (qw(screen_x screen_y client_x client_y + ctrl_key shift_key alt_key meta_key button + event_phase bubbles cancelable detail)) + { + next if ($prop eq 'button' or $prop eq 'detail') + and ($signal eq 'dom_mouse_over' or $signal eq 'dom_mouse_out'); + my $method = "get_$prop"; + $props{$prop} = $event->$method; + } + + foreach my $prop (sort keys %props) { + print "\t$prop: '$props{$prop}'\n"; + } + } + + return 1; + }); + } + $box -> show_all(); $self -> add($box); diff -ru Gtk2-MozEmbed-0.03-orig/gtkmozembed2perl.h Gtk2-MozEmbed-0.03/gtkmozembed2perl.h --- Gtk2-MozEmbed-0.03-orig/gtkmozembed2perl.h 2005-03-23 22:33:17.000000000 +0000 +++ Gtk2-MozEmbed-0.03/gtkmozembed2perl.h 2005-04-02 00:35:38.000000000 +0000 @@ -21,8 +21,19 @@ #ifndef _GTKMOZEMBED2PERL_H_ #define _GTKMOZEMBED2PERL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + #include +#ifdef __cplusplus /* implies Mozilla::DOM is installed */ +} + +#include +#endif + #include #include "gtkmozembed2perl-version.h" @@ -44,6 +55,7 @@ * #endif */ + #include "gtkmozembed2perl-autogen.h" #endif /* _GTKMOZEMBED2PERL_H_ */ Only in Gtk2-MozEmbed-0.03-orig/t: GtkMozEmbed.t~ diff -ru Gtk2-MozEmbed-0.03-orig/xs/GtkMozEmbed.xs Gtk2-MozEmbed-0.03/xs/GtkMozEmbed.xs --- Gtk2-MozEmbed-0.03-orig/xs/GtkMozEmbed.xs 2005-03-23 22:33:17.000000000 +0000 +++ Gtk2-MozEmbed-0.03/xs/GtkMozEmbed.xs 2005-04-02 00:35:38.000000000 +0000 @@ -129,6 +129,105 @@ /* ------------------------------------------------------------------------- */ +/* the following two can probably be combined + if we can find the signal name */ + +/* gint (* dom_key_press) (GtkMozEmbed *embed, gpointer dom_event); */ + +#ifdef __cplusplus /* implies Mozilla::DOM is installed */ + +static void +gtk2perl_moz_embed_dom_key_marshal (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + dGPERL_CLOSURE_MARSHAL_ARGS; + + GPERL_CLOSURE_MARSHAL_INIT (closure, marshal_data); + + ENTER; + SAVETMPS; + + PUSHMARK (SP); + + GPERL_CLOSURE_MARSHAL_PUSH_INSTANCE (param_values); + + /* param_values + 1 is the `gpointer dom_event' */ + XPUSHs (sv_2mortal (newSVnsIDOMKeyEvent ((nsIDOMKeyEvent *) + g_value_get_pointer (param_values + 1)))); + + + GPERL_CLOSURE_MARSHAL_PUSH_DATA; + + PUTBACK; + + GPERL_CLOSURE_MARSHAL_CALL (G_SCALAR); + + SPAGAIN; + + if (count != 1) + croak ("signal handlers for `dom_key_*' are supposed to " + "return an integer"); + + gperl_value_from_sv (return_value, POPs); + + PUTBACK; + + FREETMPS; + LEAVE; +} + +static void +gtk2perl_moz_embed_dom_mouse_marshal (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + dGPERL_CLOSURE_MARSHAL_ARGS; + + GPERL_CLOSURE_MARSHAL_INIT (closure, marshal_data); + + ENTER; + SAVETMPS; + + PUSHMARK (SP); + + GPERL_CLOSURE_MARSHAL_PUSH_INSTANCE (param_values); + + /* param_values + 1 is the `gpointer dom_event' */ + XPUSHs (sv_2mortal (newSVnsIDOMMouseEvent ((nsIDOMMouseEvent *) + g_value_get_pointer (param_values + 1)))); + + + GPERL_CLOSURE_MARSHAL_PUSH_DATA; + + PUTBACK; + + GPERL_CLOSURE_MARSHAL_CALL (G_SCALAR); + + SPAGAIN; + + if (count != 1) + croak ("signal handlers for `dom_mouse_*' are supposed to " + "return an integer"); + + gperl_value_from_sv (return_value, POPs); + + PUTBACK; + + FREETMPS; + LEAVE; +} + +#endif /* ifdef __cplusplus */ + +/* ------------------------------------------------------------------------- */ + MODULE = Gtk2::MozEmbed PACKAGE = Gtk2::MozEmbed PREFIX = gtk_moz_embed_ BOOT: @@ -140,6 +239,35 @@ /* gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED_SINGLE, "new_window_orphan", gtk2perl_moz_embed_new_window_marshal); */ +#ifdef __cplusplus + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_key_down", + gtk2perl_moz_embed_dom_key_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_key_press", + gtk2perl_moz_embed_dom_key_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_key_up", + gtk2perl_moz_embed_dom_key_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_mouse_down", + gtk2perl_moz_embed_dom_mouse_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_mouse_up", + gtk2perl_moz_embed_dom_mouse_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_mouse_click", + gtk2perl_moz_embed_dom_mouse_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_mouse_dbl_click", + gtk2perl_moz_embed_dom_mouse_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_mouse_over", + gtk2perl_moz_embed_dom_mouse_marshal); + gperl_signal_set_marshaller_for (GTK_TYPE_MOZ_EMBED, + "dom_mouse_out", + gtk2perl_moz_embed_dom_mouse_marshal); +#endif /* ifdef __cplusplus */ =for object Gtk2::MozEmbed::main @@ -405,6 +533,10 @@ GtkMozEmbedChromeFlags gtk_moz_embed_get_chrome_mask (embed) GtkMozEmbed *embed + CODE: + RETVAL = (GtkMozEmbedChromeFlags) gtk_moz_embed_get_chrome_mask (embed); + OUTPUT: + RETVAL # --------------------------------------------------------------------------- # @@ -495,6 +627,68 @@ interrupt the loading of a new document. By returning I you are saying "don't load this document." +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::KeyEvent) + +This signal is emitted when a key is pressed down. See the DOM Level 3 +specification for more details. + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::KeyEvent) + +This signal is emitted when a key is released. See the DOM Level 3 +specification for more details. + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::KeyEvent) + +This signal is presumably emitted when a key is pressed and released, +i.e. i.e. a combination of L and +L. (Note however that it seems to also +get emitted repeatedly if you hold the key down.) + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::MouseEvent) + +This signal is emitted when "a pointing device button is pressed over an +element. In the case of nested elements, this event type is always targeted +at the most deeply nested element." See the DOM Level 3 specification for +more details. + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::MouseEvent) + +This signal is emitted when "a pointing device button is released over an +element. In the case of nested elements, this event type is always targeted +at the most deeply nested element. See the DOM Level 3 specification for +more details. + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::MouseEvent) + +This signal is emitted when "a pointing device button is clicked over +an element. The definition of a click depends on the environment +configuration; i.e. may depend on the screen location or the delay +between the press and release of the pointing device button. In any case, +the target node must be the same between the mousedown, mouseup, and click." +In other words, it's basically L +followed quickly by L. See the DOM Level 3 +specification for more details. + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::MouseEvent) + +This signal is emitted when a mouse button is double clicked on an element. +(The only thing I found in the DOM Level 3 specification was an example +showing that two click events occur for a double click.) + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::MouseEvent) + +This signal is emitted when "a pointing device is moved onto an element. +In the case of nested elements, this event type is always targeted at +the most deeply nested element." See the DOM Level 3 specification for +more details. + +=item integer B (Gtk2::MozEmbed, Gtk2::MozEmbed::MouseEvent) + +This signal is emitted when "a pointing device is moved away from an +element. In the case of nested elements, this event type is always +targeted at the most deeply nested element." See the DOM Level 3 +specification for more details. + =back =cut