/*
* Copyright (c) 2003 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
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307 USA.
*
* $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/GtkAccelGroup.xs,v 1.20.2.1 2004/03/21 01:26:58 muppetman Exp $
*/
#include "gtk2perl.h"
typedef struct {
GClosure * closure;
const char * sv_str;
} FindClosureData;
static gboolean
find_closure (GtkAccelKey * key,
GClosure * closure,
gpointer data)
{
GPerlClosure * gpc = (GPerlClosure*) closure;
FindClosureData * cd = (FindClosureData*) data;
PERL_UNUSED_VAR (key);
if (strEQ (cd->sv_str, SvPV_nolen (gpc->callback))) {
cd->closure = closure;
return TRUE;
} else
return FALSE;
}
MODULE = Gtk2::AccelGroup PACKAGE = Gtk2::AccelGroup PREFIX = gtk_accel_group_
=for position SYNOPSIS
=head1 SYNOPSIS
my $win = Gtk2::Window->new;
my $accel = Gtk2::AccelGroup->new;
$accel->connect (42, ['control-mask'], ['visible'],
sub { # do something });
$win->add_accel_group ($accel);
=cut
## GtkAccelGroup* gtk_accel_group_new (void)
GtkAccelGroup_noinc *
gtk_accel_group_new (class)
C_ARGS:
/*void*/
## void gtk_accel_group_lock (GtkAccelGroup *accel_group)
void
gtk_accel_group_lock (accel_group)
GtkAccelGroup * accel_group
## void gtk_accel_group_unlock (GtkAccelGroup *accel_group)
void
gtk_accel_group_unlock (accel_group)
GtkAccelGroup * accel_group
## void gtk_accel_group_connect (GtkAccelGroup *accel_group, guint accel_key, GdkModifierType accel_mods, GtkAccelFlags accel_flags, GClosure *closure)
void
gtk_accel_group_connect (accel_group, accel_key, accel_mods, accel_flags, func)
GtkAccelGroup * accel_group
guint accel_key
GdkModifierType accel_mods
GtkAccelFlags accel_flags
SV * func
PREINIT:
GClosure * closure;
CODE:
closure = gperl_closure_new (func, NULL, FALSE);
gtk_accel_group_connect (accel_group, accel_key, accel_mods,
accel_flags, closure);
/* i would swear until i was blue in the face that this unref
* is the right thing to do, but with it in there i get a critical
* assertion failure from glib when i try to disconnect the closure,
* saying that the refcount was zero somehow. */
/* g_closure_unref (closure); FIXME */
## void gtk_accel_group_connect_by_path (GtkAccelGroup *accel_group, const gchar *accel_path, GClosure *closure)
void
gtk_accel_group_connect_by_path (accel_group, accel_path, func)
GtkAccelGroup * accel_group
const gchar * accel_path
SV * func
PREINIT:
GClosure * closure;
CODE:
closure = gperl_closure_new (func, NULL, FALSE);
gtk_accel_group_connect_by_path (accel_group, accel_path, closure);
/* i wonder if we get the same problem here as above? */
/* g_closure_unref (closure); FIXME */
# this will not work quite as advertised --- a GClosure can be
# attached to only one GtkAccelGroup, but we'll be creating a new
# closure on each call to connect, so we can have many closures
# on the same perl func. we'll just disconnect the first one,
# and you can call this in a loop until it stops returning true.
## gboolean gtk_accel_group_disconnect (GtkAccelGroup *accel_group, GClosure *closure)
gboolean
gtk_accel_group_disconnect (accel_group, func)
GtkAccelGroup * accel_group
SV * func
PREINIT:
FindClosureData data;
CODE:
data.closure = NULL;
data.sv_str = SvPV_nolen (func);
if (gtk_accel_group_find (accel_group, find_closure, &data)) {
RETVAL = gtk_accel_group_disconnect (accel_group,
data.closure);
} else
RETVAL = 0;
OUTPUT:
RETVAL
## gboolean gtk_accel_group_disconnect_key (GtkAccelGroup *accel_group, guint accel_key, GdkModifierType accel_mods)
gboolean
gtk_accel_group_disconnect_key (accel_group, accel_key, accel_mods)
GtkAccelGroup * accel_group
guint accel_key
GdkModifierType accel_mods
# no typemap for GtkAccelKey, no boxed support, either
## GtkAccelKey* gtk_accel_group_find (GtkAccelGroup *accel_group, gboolean (*find_func) (GtkAccelKey *key, GClosure *closure, gpointer data), gpointer data)
#GtkAccelKey *
#gtk_accel_group_find (accel_group, key, closure, *, data)
# GtkAccelGroup * accel_group
# gboolean (*find_func) (GtkAccelKey *key, GClosure *closure, gpointer data)
# gpointer data
# this will not work as advertised; implementation details of the C version
# guarantee that a single closure can be connected to only one accel group,
# but we will create a new closure for each function we connect ---
# potentially many closures for one perl function. thus, there is not a
# one to one mapping that would return a certain accel group for a given
# closure. ... which means this function would be rather pointless at
# the perl level.
## GtkAccelGroup* gtk_accel_group_from_accel_closure (GClosure *closure)
MODULE = Gtk2::AccelGroup PACKAGE = Gtk2::Accelerator PREFIX = gtk_accelerator_
## void gtk_accelerator_parse (const gchar *accelerator, guint *accelerator_key, GdkModifierType *accelerator_mods)
=for apidoc
=for signature (accelerator_key, accelerator_mods) = Gtk2::Accelerator->parse ($accelerator)
Returns accelerator_key, an unsigned interger and accelerator_mods, a
Gtk2::Gdk::ModifierType.
=cut
void
gtk_accelerator_parse (class, accelerator)
const gchar * accelerator
PREINIT:
guint accelerator_key;
GdkModifierType accelerator_mods;
PPCODE:
gtk_accelerator_parse (accelerator, &accelerator_key,
&accelerator_mods);
XPUSHs (sv_2mortal (newSVuv (accelerator_key)));
XPUSHs (sv_2mortal (newSVGdkModifierType (accelerator_mods)));
## gchar* gtk_accelerator_name (guint accelerator_key, GdkModifierType accelerator_mods)
gchar_own *
gtk_accelerator_name (class, accelerator_key, accelerator_mods)
guint accelerator_key
GdkModifierType accelerator_mods
C_ARGS:
accelerator_key, accelerator_mods
## void gtk_accelerator_set_default_mod_mask (GdkModifierType default_mod_mask)
## call as Gtk2::Accelerator->set_default_mod_mask
void
gtk_accelerator_set_default_mod_mask (class, default_mod_mask)
GdkModifierType default_mod_mask
C_ARGS:
default_mod_mask
## guint gtk_accelerator_get_default_mod_mask (void)
## call as Gtk2::Accelerator->get_default_mod_mask
GdkModifierType
gtk_accelerator_get_default_mod_mask (class)
C_ARGS:
/* void */
# no private functions
## void _gtk_accel_group_attach (GtkAccelGroup *accel_group, GObject *object)
## void _gtk_accel_group_detach (GtkAccelGroup *accel_group, GObject *object)
## void _gtk_accel_group_reconnect (GtkAccelGroup *accel_group, GQuark accel_path_quark)
# no get_type functions
##GType gtk_accel_group_get_type (void)
##gboolean gtk_accelerator_valid (guint keyval, GdkModifierType modifiers) G_GNUC_CONST
gboolean
gtk_accelerator_valid (class, keyval, modifiers)
guint keyval
GdkModifierType modifiers
C_ARGS:
keyval, modifiers
# internal
##GtkAccelGroupEntry* gtk_accel_group_query (GtkAccelGroup *accel_group, guint accel_key, GdkModifierType accel_mods, guint *n_entries)
#void
#gtk_accel_group_query (accel_group, accel_key, accel_mods)
# GtkAccelGroup * accel_group
# guint accel_key
# GdkModifierType accel_mods
# PREINIT:
# gint i;
# gint n_entries;
# GtkAccelGroupEntry * entries;
# PPCODE:
# entries = gtk_accel_group_query(accel_group, accel_key,
# accel_mods, &n_entries);
## if( !entries )
# XSRETURN_EMPTY;
# EXTEND(SP,n_entries);
# for( i = 0; i < n_entries; i++ )
# PUSHs(sv_2mortal(newSVGtkAccelGroupEntry(entries[i])));
MODULE = Gtk2::AccelGroup PACKAGE = Gtk2::AccelGroups PREFIX = gtk_accel_groups_
=for object Gtk2::AccelGroup
=cut
## gboolean gtk_accel_groups_activate (GObject *object, guint accel_key, GdkModifierType accel_mods)
gboolean
gtk_accel_groups_activate (class, object, accel_key, accel_mods)
GObject * object
guint accel_key
GdkModifierType accel_mods
C_ARGS:
object, accel_key, accel_mods
## GSList* gtk_accel_groups_from_object (GObject *object)
=for apidoc
Returns a list of Gtk2::AccelGroup's.
=cut
void
gtk_accel_groups_from_object (class, object)
GObject * object
PREINIT:
GSList * groups, * i;
PPCODE:
groups = gtk_accel_groups_from_object (object);
for (i = groups ; i != NULL ; i = i->next)
XPUSHs (sv_2mortal (newSVGtkAccelGroup (i->data)));
/* according to the source, we should not free the list */