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

Re: GtkBindingSet etc



I wrote:
>
> gtk_bindings_activate() and gtk_bindings_activate_event()

Indeed those two go fine, per below.

But it seems they refuse to operate on plain GtkObjects, only widgets,
because of wanting to spin keys through the per-display keymap thingie.
So I might want gtk_bindings_set_activate() too, which would mean
wrapping GtkBindingSet, however opaquely.


Index: GtkObject.xs
===================================================================
--- GtkObject.xs	(revision 2104)
+++ GtkObject.xs	(working copy)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2005 by the gtk2-perl team (see the file AUTHORS)
+ * Copyright (c) 2003-2005, 2009 by the gtk2-perl team (see the file AUTHORS)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -171,3 +171,31 @@
 
     OUTPUT:
 	RETVAL
+
+MODULE = Gtk2::Object	PACKAGE = Gtk2::Object	PREFIX = gtk_
+
+=for apidoc
+Although C<activate> and C<activate_event> are C<Gtk2::Object>
+methods, as of Gtk 2.12 they will only actually invoke signals on a
+C<Gtk2::Widget>.  On a C<Gtk2::Object> the return is always false (no
+binding activated).
+=cut
+gboolean
+gtk_bindings_activate (object, keyval, modifiers)
+	GtkObject *object
+	guint keyval
+	GdkModifierType modifiers
+
+gboolean
+gtk_bindings_activate_event (object, event)
+	GtkObject *object
+	GdkEvent *event
+PREINIT:
+	GdkEventType type;
+CODE:
+	type = event->type;
+	if (type != GDK_KEY_PRESS && type != GDK_KEY_RELEASE)
+		croak ("Event must be key-press or key-release");
+	RETVAL = gtk_bindings_activate_event (object, (GdkEventKey*) event);
+OUTPUT:
+	RETVAL
use strict;
use warnings;
use Gtk2 '-init';

Gtk2::Rc->parse_string (<<HERE);
binding "my_keys" {
  bind "<ctrl>x" { "move-cursor" (logical-positions, -1, 0) }
}
class "GtkEntry" binding "my_keys"
HERE


my $toplevel = Gtk2::Window->new('toplevel');
$toplevel->signal_connect (destroy => sub { Gtk2->main_quit; });

my $vbox = Gtk2::VBox->new;
$toplevel->add ($vbox);

my $entry = Gtk2::Entry->new;
# $entry->signal_connect
#   (key_press_event => sub {
#      my ($entry, $event) = @_;
#      print $event->hardware_keycode, " ", $event->group, "\n";
#      return 0;
#    });
$vbox->pack_start ($entry, 0,0,0);

my $keyval_left = Gtk2::Gdk->keyval_from_name('Left');

{
  my $button = Gtk2::Button->new_with_label ("keyval left");
  $button->signal_connect
    (clicked => sub {
       Glib::Timeout->add
           (3000, sub {
              print __FILE__,": keyval left\n";
              $entry->bindings_activate ($keyval_left, []);
              return 0;
            });
     });
  $vbox->pack_start ($button, 0,0,0);
}
{
  my $button = Gtk2::Button->new_with_label ("event left");
  $button->signal_connect
    (clicked => sub {
       my $event = Gtk2::Gdk::Event->new ('key-press');
       $event->window ($entry->window);
       $event->hardware_keycode (100); # left
       $event->group (0);
       $event->keyval ($keyval_left);
       $event->set_state ([]);
       Glib::Timeout->add
           (3000, sub {
              print __FILE__,": event left\n";
              $entry->bindings_activate_event ($event);
              return 0;
            });
     });
  $vbox->pack_start ($button, 0,0,0);
}

$toplevel->show_all;
Gtk2->main;
exit 0;


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