I ran into an interesting problem recently with Gtk2::SimpleMenu. For some reason, Gtk2::SimpleMenu and Gtk2::ItemFactory::create_items do not support per-item callback_data, even though it's supported by the Gtk+ API. While you can rather easily emulate callback_data using callback => sub {foo(@_,$bar)}; this seems less than optimal. The following diff fixes Gtk2::SimpleMenu and Gtk2.pm to allow using callback_data. [I'm not quite sure if I like Gtk2::ItemFactory::create_item(s) being in Gtk2, but whatever...] Before applying it, I would suggest reconsidering how the $callback_data is passed, and perhaps not passing a $callback_data from create_items at all, just use it when $callback_data is not defined for the entry, or (pre|app)pend the $callback_data to the entries $callback_data instead of defaulting to the passed $callback_data as this patch does. --- Gtk2.pm.orig 2004-01-30 19:24:48.000000000 -0800 +++ Gtk2.pm 2004-01-30 19:31:25.000000000 -0800 @@ -69,11 +69,12 @@ sub create_item { my ($factory, $entry, $callback_data) = @_; my ($path, $accelerator, $callback, $callback_action, $item_type, - $extra_data, $cleanpath); + $extra_data, $cleanpath, $entry_callback_data); if ('ARRAY' eq ref $entry) { ($path, $accelerator, $callback, $callback_action, - $item_type, $extra_data) = @$entry; + $item_type, $extra_data,$entry_callback_data) = @$entry; + $callback_data ||= $entry_callback_data; } elsif ('HASH' eq ref $entry) { foreach (keys %$entry) { @@ -101,13 +102,18 @@ { $extra_data = $entry->{extra_data}; } + elsif( $_ eq 'callback_data') + { + $callback_data ||= $entry->{callback_data}; + } else { use Carp; carp("Gtk Item Factory Entry; unknown key ($_) " . "ignored, legal keys are: path, " . "accelerator, accel, callback, " - . "callback_action, item_type, extra_data"); + . "callback_action, item_type, extra_data" + . "callback_data"); } } } else { @@ -123,6 +129,7 @@ . " callback_action => \$action,\n" . " item_type => \$type, # optional\n" . " extra_data => \$extra, # optional\n" + . " callback_data => \$callback_data #optional\n" . " }\n" . " "; } --- SimpleMenu.pm.orig 2004-01-30 19:32:32.000000000 -0800 +++ SimpleMenu.pm 2004-01-30 19:32:10.000000000 -0800 @@ -116,7 +116,9 @@ (exists($groups[$grp]) ? $groups[$grp] : $itms->{item_type}), - $itms->{extra_data}, ]; + $itms->{extra_data}, + $itms->{callback_data}, + ]; # create the group identifier (path) # so that next button in this group will @@ -137,7 +139,9 @@ $default_callback ), $itms->{callback_action}, $itms->{item_type}, - $itms->{extra_data}, ]; + $itms->{extra_data}, + $itms->{callback_data}, + ]; } } [My appologies for not making the above patch against CVS... for some reason SF's CVS repository is down right now.] Don Armstrong -- We were at a chinese resturant. He was yelling at the waitress because there was a typo in his fortune cookie. -- hugh macleod http://www.gapingvoid.com/batch31.php http://www.donarmstrong.com http://www.anylevel.com http://rzlab.ucr.edu
Attachment:
signature.asc
Description: Digital signature