Re: GtkImageView
- From: muppet <scott asofyet org>
- To: Jeffrey Ratcliffe <jeffrey ratcliffe gmail com>
- Cc: gtk2-perl List <gtk-perl-list gnome org>
- Subject: Re: GtkImageView
- Date: Fri, 15 Feb 2008 08:36:48 -0500
On Feb 13, 2008, at 3:25 PM, Jeffrey Ratcliffe wrote:
I held off releasing the Perl bindings for gtkimageview 1.5.0 because
the author wanted to add the GTypes and a couple of other things. This
he has done, and I have updated the bindings to match
(http://trac.bjourne.webfactional.com/). There are, however, a couple
of things that I don't understand:
a. there is an enum (not a gobject), GdkPixbufDrawOpts, which is used
in both gtkiimagetool.h and gdkpixbufdrawcache.h. I find I have to
include the newSVGdkPixbufDrawOpts and SvGdkPixbufDrawOpts definitions
in the bindings twice, once for each header file, to avoid errors
missing the SvGdkPixbufDrawOpts symbol. What am I doing wrong?
It's a struct (data structure), not an enum (enumeration of constant
values).
You've marked your newSVGdkPixbufDrawOpts() and SvGdkPixbufDrawOpts()
functions with the C storage class keyword "static", which means that
the function is visible only within that C file. Since you need to
share the functions between two files, remove the static keyword from
those functions in one file, and remove the definitions altogether
from the other file.
b. compiling gives me the message:
GdkPixbufDrawOpts is not registered with the GLib type system.
That's because it's a plain structure without a GType. This message
comes from the Glib module when you try to look up the name to get
information, most likely as part of the documentation generation
process. ... Yes, you have the xsub declaration
void
gtk_iimage_too_paint_image (tool, opts, drawable)
GtkIImageTool * tool
GdkPixbufDrawOpts * opts
GdkDrawable * drawable
xsubpp will see that you want GdkPixbufDrawOpts for the opts argument,
and will look that up in the typemap, where you have it defined as a
T_GPERL_GENERIC_WRAPPER (gtkimageview.typemap). That typemap says to
use newSV$typename and Sv$typename to marshal this type.
Then, the documentation generator scans through the code and sees this
xsub wants a GdkPixbufDrawOpts argument, and asks the Glib type system
to describe that type. Glib says, "GLib doesn't know anything about
that name", which is true. This should be a non-fatal error.
You can either ignore it, or change the xsub to look like this:
void
gtk_iimage_tool_paint_image (tool, opts, drawable)
GtkIImageTool * tool
SV * opts
GdkDrawable * drawable
C_ARGS:
tool, SvGdkPixbufDrawOpts (opts), drawable
which says, "here's an xsub which is a wrapper for a C function, but
when you go call it, pass this string as the argument list", and we
call the marshaling function by hand.
Still another option, more correct but more work, is to register a
GBoxed wrapper for the structure. Then everything will Just Wonk.
c. Gtk2::Gdk::Pixbuf::Draw::Cache::get_method segfaults at the moment
if it not fed with the requisite two GdkPixbufDrawOpts. As the Perl
version of GdkPixbufDrawOpts is a hash, what is the best way of
checking that the hash is a Gtk2::Gdk::Pixbuf::Draw::Opts? isa doesn't
work, because it is a hash, not a gobject. Should I be blessing the
hash?
You're not doing anything in SvGdkPixbufDrawOpts() to verify that you
actually have a hash, so you can wind up either crashing or giving
back a structure filled with garbage, and causing a later crash.
Torsten recently added to Glib some useful functions for this purpose,
including gperl_sv_is_hash_ref():
GdkPixbufDrawOpts *
SvGdkPixbufDrawOpts (SV * sv)
{
HV * hv;
SV ** sp;
GdkPixbufDrawOpts * opts;
/* Make sure it is what we think it is before we try to
dereference and parse it */
if (! gperl_sv_is_hash_ref (sv))
croak ("Expected a hash reference for
Gtk2::Gdk::Pixbuf::Draw::Opts");
hv = (HV *) SvRV (sv);
...
Blessing the hash would help you do even more validation, but is not
strictly necessary. If your user is allowed to supply a plain old
hash of his own making, then requiring a blessed hash will be
breakage, but if the user is supposed to use one of your methods to
create one of these things, then blessing the hash is A Very Good Idea.
--
The one difference between Dali and a crazy man is very simple: Dali
is not crazy at all.
-- Salvador Dali
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]