The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Test::Weaken::Gtk2 -- Gtk2 helpers for Test::Weaken

SYNOPSIS

 use Test::Weaken::Gtk2;

DESCRIPTION

This is a few functions to help Test::Weaken leak checking on Gtk2 widgets etc. The functions can be used individually, or combined into larger application-specific contents etc handlers.

This module doesn't load Gtk2. If Gtk2 is not loaded then the functions simply return empty, false, or do nothing, as appropriate. This module also doesn't load Test::Weaken, that's left to a test script.

FUNCTIONS

Contents Functions

@widgets = Test::Weaken::Gtk2::contents_container ($ref)

If $ref is a Gtk2::Container or subclass then return its widget children per $container->get_children. If $ref is not a container, or Gtk2 is not loaded, then return an empty list.

The children of a C code container are held in C structures and not otherwise reached by the traversal Test::Weaken does.

@widgets = Test::Weaken::Gtk2::contents_submenu ($ref)

If $ref is a Gtk2::MenuItem then return its submenu per $item->get_submenu, or if it's a Gtk2::MenuToolButton then per $item->get_menu. If there's no menu, or $ref is not such a widget, then return an empty list.

The submenu in both cases is held in the item's C structure and is not otherwise reached by the traversal Test::Weaken does.

Only the MenuItem and MenuToolButton classes are acted on currently, just in case a get_submenu / get_menu on some other Gtk class isn't a simple property fetch but perhaps some kind of constructor. Other classes which are a simple fetch might be added in the future.

@widgets = Test::Weaken::Gtk2::contents_cell_renderers ($ref)

If $ref is a widget with the Gtk2::CellLayout interface then return its Gtk2::CellRenderer objects from get_cells. Or if $ref is a Gtk2::TreeViewColumn or Gtk2::CellView then use get_cell_renderers. For anything else the return is an empty list.

get_cells is new in Gtk 2.12. get_cell_renderers is the previous style. The renderers in a C code viewer widget are held in C structures and are not otherwise reached by the traversal Test::Weaken does.

Gtk2::CellView as of Gtk 2.20.1 has a bug or severe misfeature where it gives a g_assert failure on attempting get cells when there's no display row set, including when no model. The returned cells are correct, there's just an assert logged. contents_cell_renderers suppresses that warning so as to help leak checking of CellViews not yet displaying anything.

When a C-code widget has sub-widgets or renderers as part of its implementation, those children will end up extracted and leak checked by the functions above. This is usually desirable in as much as it notices leaks, even though they may not relate to Perl level code.

Destructor Functions

Test::Weaken::Gtk2::destructor_destroy ($top)

Call $top->destroy, or if $top is an arrayref then call destroy on its first element. This can be used when a constructed widget or object requires an explicit destroy. For example,

    my $leaks = leaks({
      constructor => sub { Gtk2::Window->new('toplevel') },
      destructor => \&Test::Weaken::Gtk2::destructor_destroy,
    });

The arrayref case is designed for multiple widgets etc returned from a constructor, the first of which is a toplevel window or similar needing a destroy,

    my $leaks = leaks({
      constructor => sub {
        my $toplevel = Gtk2::Window->new('toplevel');
        my $label = Gtk2::Label->new('Hello World');
        $toplevel->add($label);
        return [ $toplevel, $label ];
      },
      destructor => \&Test::Weaken::Gtk2::destructor_destroy,
    });

All Gtk2::Objects support destroy but most don't need it for garbage collection. Gtk2::Window is the most common which does. Another is a MenuItem which has an AccelLabel and is not in a menu (see notes in Gtk2::MenuItem).

Test::Weaken::Gtk2::destructor_destroy_and_iterate ($top)

The same as destructor_destroy above, but in addition run Gtk2->main_iteration_do for queued main loop actions. There's a limit on the number of iterations done, so as to protect against a runaway main loop.

This is good if some finalizations are only done in an idle handler, or perhaps under a timer which has now expired. Currently queued events from the X server are run, but there's no read or wait for further events.

Ignore Functions

$bool = Test::Weaken::Gtk2::ignore_default_display ($ref)

Return true if $ref is the default display Gtk2::Gdk::Display->get_default_display.

If there's no default display object then this function returns false. This happens if Gtk2 is not loaded yet, or Gtk2->init has not been called yet, or if running under Gtk 2.0.x where there's no Gtk2::Gdk::Display class at all.

    my $leaks = leaks({
      constructor => sub { make_something },
      ignore => \&Test::Weaken::Gtk2::ignore_default_display,
    });

The default display is generally a permanent object, existing across a test, and on that basis should not be tracked for leaking. Usually the display object is not seen by leaks anyway, since it's only in the C structures of a widget or window. This function can be used if it might appear elsewhere, such as a Perl code sub-object.

EXPORTS

Nothing is exported by default, but the functions can be requested in usual Exporter style.

    use Test::Weaken::Gtk2 'contents_container';

There's no :all tag since new functions are likely to be added in the future and an import of all would run the risk of name clashes with application functions etc.

SEE ALSO

Test::Weaken, Gtk2::Container, Gtk2::MenuItem, Gtk2::Object, Gtk2::Window, Gtk2::Gdk::Display

HOME PAGE

http://user42.tuxfamily.org/gtk2-ex-widgetbits/index.html

LICENSE

Copyright 2008, 2009, 2010 Kevin Ryde

Gtk2-Ex-WidgetBits is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

Gtk2-Ex-WidgetBits is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Gtk2-Ex-WidgetBits. If not, see http://www.gnu.org/licenses/.