The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# binding set replaced by an rc parse_string in program,
#
# lookup through widget bindings won't take Pointer_Button1 etc



# Copyright 2009, 2010, 2011 Kevin Ryde

# This file is part of Chart.
#
# Chart 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.
#
# Chart 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 Chart.  If not, see <http://www.gnu.org/licenses/>.

package App::Chart::Gtk2::Ex::BindingBits;
use 5.008;
use strict;
use warnings;
use Carp;
use Gtk2;
use Scalar::Util;

# uncomment this to run the ### lines
#use Smart::Comments;


# Think it's better to croak for an unknown bindingset name than to return 0
# for not activated, on the basis it picks up typos or bad names.
#
sub activate_button_event {
  my ($bindings, $event, $object) = @_;

  unless (Scalar::Util::blessed($bindings)
          && $bindings->isa('Gtk2::BindingSet')) {
    $bindings = Gtk2::BindingSet->find ($bindings)
      || croak 'No BindingSet called ',$bindings;
  }
  my $keyval = Gtk2::Gdk->keyval_from_name('Pointer_Button' . $event->button)
    || do {
      ### activate_button_event() unknown: 'Pointer_Button' . $event->button
      return 0;
    };

  my $modifiers = $event->get_state;
  if ($event->type eq 'button-release') { $modifiers |= 'release-mask'; }
  ###   type     : $event->type
  ###   modifiers: "$modifiers"

  my $found = $bindings->activate ($keyval, $modifiers, $object);
  ### activate_button() found: $found
  return $found;
}

1;
__END__

=for stopwords Ryde Chart

=head1 NAME

App::Chart::Gtk2::Ex::BindingBits -- helpers for Gtk2::BindingSet etc

=head1 SYNOPSIS

 use App::Chart::Gtk2::Ex::BindingBits;

=head1 FUNCTIONS

=over 4

=item C<< $bool = App::Chart::Gtk2::Ex::BindingBits::activate_button_event ($bindings, $event, $object) >>

Activate bindings for a button press C<$event>.  The return is true if a
binding was found and activated or false if not.

C<$event> should be a C<Gtk2::Gdk::Event::Button>.  The button number is
turned into keyval C<Pointer_Button1> etc, modifiers get C<release-mask>
added if it's a C<button-release> event, then simply

    $bindings->activate ($keyval, $modifiers, $object)

C<$bindings> can be either a C<Gtk2::BindingSet> object or a string name of
a binding set for C<< Gtk2::BindingSet->find >>.  As of Gtk 2.18 there's
keyvals for buttons 1 through 5.  If C<< $event->button >> is somehow
another value then C<activate_button_event> returns 0 as there cannot be any
bindings for it.

See F<examples/binding-button-event.pl> in the sources for a sample program.

=back

=head1 OTHER NOTES

For reference, as of Gtk 2.18 the C<Gtk2::Object> method
C<< $object->bindings_activate >> is no good for C<Pointer_Button1> etc as
that C<bindings_activate> trys to go from keyval to hardware keycode then
back to keyvals, but there's normally no keycode for the pointer buttons, so
it doesn't lookup anything in the BindingSet.

=head1 SEE ALSO

L<Gtk2::BindingSet>, L<Gtk2::Ex::WidgetBits>, L<Gtk2::Gdk::Event::Button>

=head1 HOME PAGE

L<http://user42.tuxfamily.org/chart/index.html>

=head1 LICENSE

Copyright 2009, 2010 Kevin Ryde

Chart 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.

Chart 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
Chart.  If not, see L<http://www.gnu.org/licenses/>.

=cut

# junk, probably
#
# sub activate_event {
#   my ($bindings, $event, $object) = @_;
#   unless (Scalar::Util::blessed($bindings)
#           && $bindings->isa('Gtk2::BindingSet')) {
#     $bindings = Gtk2::BindingSet->find ($bindings)
#       || croak "No BindingSet called '$bindings'";
#   }
# 
#   my $keyval;
#   if ($event->can('keyval')) {
#     $keyval = $event->keyval;
#   } elsif ($event->can('button')) {
#     my $button = $event->button;
#     $keyval = Gtk2::Gdk->keyval_from_name("Pointer_Button$button")
#       || do { warn "BindingBits ignoring unrecognised button number $button";
#               return 0; };
#   } else {
#     croak "Unrecognised event type $event";
#   }
# 
#   my $found = $bindings->activate ($keyval, $event->get_state, $object);
#   ### activate_event_keyval() found: $found
#   return $found;
# }