Re: gtk-perl tutorial and help

Andy Ford wrote:

When I run this, I get the following error message...

'window is not of type Gtk::Gdk::Window '

The error message was generated from the code..
....create_from_xpm_d( $window->window,$style,@xpm_data );

in order to use a GdkWindow, the GdkWindow must exist. the GdkWindow corresponds exactly to the actual XWindow, which doesn't exist on the X server until the XWindow has been created or "realized"; you typically realize a GtkWidget's GdkWindow by calling gtk_widget_show -- which calls XMapWindow.

however, while calling show on a child window marks it to be shown with the parent, calling show on a toplevel (as you are doing) causes the whole thing to show up right then ---- since you aren't finished setting it up, this causes unwanted layouts and freaky visual nastiness.

to force the creation of the GdkWindow without putting the window on the screen yet, you must "realize" the widget separately before showing it by calling gtk_widget_realize (normally gtk_widget_show calls gtk_widget_realize for you).[1]

$window = new Gtk::Window( 'toplevel' );
$style = $window->get_style()->bg( 'normal' );


($pixmap, $mask ) = Gtk::Gdk::Pixmap->create_from_xpm_d(
$window->window,$style,@xpm_data );

now $window->window is valid to use.

another alternative is to create the pixmap without a window, using gdk_pixmap_colormap_create_from_xpm_d, a la

($pixmap, $mask) = new Gtk::Gdk::Pixmap::colormap_create_from_xpm_d ( undef, $window->get_colormap, $style, @xpm_data );

note the fact that we're using a colormap rather than a GdkWindow as the reference drawable. this allows you to do complete setup of your window hierarchy *before* the window is realized. (in fact, you don't have to call realize. :-)

[1] for a little more correct explanation of realizing, mapping, and showing, see the GGAD:

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]