summaryrefslogtreecommitdiff
path: root/gtk/gtkbindings.c
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>1998-07-10 02:33:06 +0000
committerTim Janik <timj@src.gnome.org>1998-07-10 02:33:06 +0000
commit002d37e6e303aa57bd7c577f4e448e2e38eefa03 (patch)
tree51b865576de0a50fe509da84e86f4f968688bccc /gtk/gtkbindings.c
parent524be636e93972b5932a6efc38841096f30aa729 (diff)
downloadgtk+-002d37e6e303aa57bd7c577f4e448e2e38eefa03.tar.gz
added a new internal type GTK_TYPE_IDENTIFIER which is derived from
Fri Jul 10 04:20:35 1998 Tim Janik <timj@gtk.org> * gtk/gtktypeutils.h: * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER which is derived from GTK_TYPE_STRING. * gtk/gtkbindings.c: reworked the argument type handling.
Diffstat (limited to 'gtk/gtkbindings.c')
-rw-r--r--gtk/gtkbindings.c109
1 files changed, 68 insertions, 41 deletions
diff --git a/gtk/gtkbindings.c b/gtk/gtkbindings.c
index 50222147d3..a7193d8032 100644
--- a/gtk/gtkbindings.c
+++ b/gtk/gtkbindings.c
@@ -30,13 +30,6 @@
/* --- defines --- */
#define BINDING_MOD_MASK() (gtk_accelerator_get_default_mod_mask () | GDK_RELEASE_MASK)
-#define BINDING_TYPE_INT (GTK_TYPE_INT)
-#define BINDING_TYPE_LONG (GTK_TYPE_LONG)
-#define BINDING_TYPE_FLOAT (GTK_TYPE_FLOAT)
-#define BINDING_TYPE_DOUBLE (GTK_TYPE_DOUBLE)
-#define BINDING_TYPE_STRING (GTK_TYPE_STRING)
-#define BINDING_TYPE_IDENTIFIER (42)
-
/* --- variables --- */
static GHashTable *binding_entry_hash_table = NULL;
@@ -68,8 +61,7 @@ binding_signal_free (GtkBindingSignal *sig)
for (i = 0; i < sig->n_args; i++)
{
- if (sig->args[i].arg_type == BINDING_TYPE_STRING ||
- sig->args[i].arg_type == BINDING_TYPE_IDENTIFIER)
+ if (GTK_FUNDAMENTAL_TYPE (sig->args[i].arg_type) == GTK_TYPE_STRING)
g_free (sig->args[i].d.string_data);
}
g_free (sig->args);
@@ -270,47 +262,57 @@ binding_compose_params (GtkBindingArg *args,
valid = TRUE;
for (i = 0; i < query->nparams && valid; i++)
{
+ GtkType param_ftype;
+
params->type = *types;
params->name = NULL;
- switch (args->arg_type)
+ param_ftype = GTK_FUNDAMENTAL_TYPE (params->type);
+ switch (GTK_FUNDAMENTAL_TYPE (args->arg_type))
{
- case BINDING_TYPE_DOUBLE:
- if (params->type == GTK_TYPE_FLOAT)
+ case GTK_TYPE_DOUBLE:
+ if (param_ftype == GTK_TYPE_FLOAT)
GTK_VALUE_FLOAT (*params) = args->d.double_data;
- else if (params->type == GTK_TYPE_DOUBLE)
+ else if (param_ftype == GTK_TYPE_DOUBLE)
GTK_VALUE_DOUBLE (*params) = args->d.double_data;
else
valid = FALSE;
break;
- case BINDING_TYPE_LONG:
- if (params->type == GTK_TYPE_BOOL &&
+ case GTK_TYPE_LONG:
+ if (param_ftype == GTK_TYPE_BOOL &&
(args->d.long_data == 0 ||
args->d.long_data == 1))
GTK_VALUE_BOOL (*params) = args->d.long_data;
- else if (params->type == GTK_TYPE_INT)
+ else if (param_ftype == GTK_TYPE_INT ||
+ param_ftype == GTK_TYPE_ENUM)
GTK_VALUE_INT (*params) = args->d.long_data;
- else if (params->type == GTK_TYPE_UINT &&
+ else if ((param_ftype == GTK_TYPE_UINT ||
+ param_ftype == GTK_TYPE_FLAGS) &&
args->d.long_data >= 0)
GTK_VALUE_UINT (*params) = args->d.long_data;
- else if (params->type == GTK_TYPE_LONG)
+ else if (param_ftype == GTK_TYPE_LONG)
GTK_VALUE_LONG (*params) = args->d.long_data;
- else if (params->type == GTK_TYPE_ULONG &&
+ else if (param_ftype == GTK_TYPE_ULONG &&
args->d.long_data >= 0)
GTK_VALUE_ULONG (*params) = args->d.long_data;
- else if (params->type == GTK_TYPE_FLOAT)
+ else if (param_ftype == GTK_TYPE_FLOAT)
GTK_VALUE_FLOAT (*params) = args->d.long_data;
- else if (params->type == GTK_TYPE_DOUBLE)
+ else if (param_ftype == GTK_TYPE_DOUBLE)
GTK_VALUE_DOUBLE (*params) = args->d.long_data;
else
valid = FALSE;
break;
- case BINDING_TYPE_STRING:
- if (params->type == GTK_TYPE_STRING)
+ case GTK_TYPE_STRING:
+ if (param_ftype == GTK_TYPE_STRING)
GTK_VALUE_STRING (*params) = args->d.string_data;
+ else if (param_ftype == GTK_TYPE_ENUM ||
+ param_ftype == GTK_TYPE_FLAGS)
+ {
+ /* FIXME: we need identifier lookups here */
+ valid = FALSE;
+ }
else
valid = FALSE;
break;
- case BINDING_TYPE_IDENTIFIER:
default:
valid = FALSE;
break;
@@ -566,26 +568,28 @@ gtk_binding_entry_add_signall (GtkBindingSet *binding_set,
binding_signal_free (signal);
return;
}
- arg->arg_type = tmp_arg->arg_type;
- switch (tmp_arg->arg_type)
+ switch (GTK_FUNDAMENTAL_TYPE (tmp_arg->arg_type))
{
- case BINDING_TYPE_INT:
- case BINDING_TYPE_LONG:
+ case GTK_TYPE_LONG:
+ arg->arg_type = GTK_TYPE_LONG;
arg->d.long_data = tmp_arg->d.long_data;
break;
- case BINDING_TYPE_FLOAT:
- case BINDING_TYPE_DOUBLE:
+ case GTK_TYPE_DOUBLE:
+ arg->arg_type = GTK_TYPE_DOUBLE;
arg->d.double_data = tmp_arg->d.double_data;
break;
- case BINDING_TYPE_STRING:
- if (!tmp_arg->d.string_data)
+ case GTK_TYPE_STRING:
+ if (tmp_arg->arg_type != GTK_TYPE_IDENTIFIER)
+ arg->arg_type = GTK_TYPE_STRING;
+ else
+ arg->arg_type = GTK_TYPE_IDENTIFIER;
+ arg->d.string_data = g_strdup (tmp_arg->d.string_data);
+ if (!arg->d.string_data)
{
g_warning ("gtk_binding_entry_add_signall(): value of `string' arg[%u] is `NULL'", n);
- arg->d.string_data = NULL;
binding_signal_free (signal);
return;
}
- arg->d.string_data = g_strdup (tmp_arg->d.string_data);
break;
default:
g_warning ("gtk_binding_entry_add_signall(): unsupported type `%s' for arg[%u]",
@@ -637,28 +641,51 @@ gtk_binding_entry_add_signal (GtkBindingSet *binding_set,
slist = g_slist_prepend (slist, arg);
arg->arg_type = va_arg (args, GtkType);
- switch (arg->arg_type)
+ switch (GTK_FUNDAMENTAL_TYPE (arg->arg_type))
{
- case BINDING_TYPE_INT:
+ case GTK_TYPE_CHAR:
+ arg->arg_type = GTK_TYPE_LONG;
+ arg->d.long_data = va_arg (args, gchar);
+ break;
+ case GTK_TYPE_BOOL:
+ arg->arg_type = GTK_TYPE_LONG;
+ arg->d.long_data = va_arg (args, gboolean) != 0;
+ break;
+ case GTK_TYPE_INT:
+ case GTK_TYPE_UINT:
+ arg->arg_type = GTK_TYPE_LONG;
arg->d.long_data = va_arg (args, gint);
break;
- case BINDING_TYPE_LONG:
+ case GTK_TYPE_LONG:
+ case GTK_TYPE_ULONG:
+ arg->arg_type = GTK_TYPE_LONG;
arg->d.long_data = va_arg (args, glong);
break;
- case BINDING_TYPE_FLOAT:
+ case GTK_TYPE_FLOAT:
+ arg->arg_type = GTK_TYPE_DOUBLE;
arg->d.double_data = va_arg (args, gfloat);
break;
- case BINDING_TYPE_DOUBLE:
+ case GTK_TYPE_DOUBLE:
+ arg->arg_type = GTK_TYPE_DOUBLE;
arg->d.double_data = va_arg (args, gdouble);
break;
- case BINDING_TYPE_STRING:
+ case GTK_TYPE_STRING:
+ if (arg->arg_type != GTK_TYPE_IDENTIFIER)
+ arg->arg_type = GTK_TYPE_STRING;
arg->d.string_data = va_arg (args, gchar*);
if (!arg->d.string_data)
{
- g_warning ("gtk_binding_entry_add_signal(): value of `string' arg[%u] is `NULL'", i);
+ g_warning ("gtk_binding_entry_add_signal(): type `%s' arg[%u] is `NULL'",
+ gtk_type_name (arg->arg_type),
+ i);
i += n_args + 1;
}
break;
+ case GTK_TYPE_ENUM:
+ case GTK_TYPE_FLAGS:
+ arg->arg_type = GTK_TYPE_LONG;
+ arg->d.long_data = va_arg (args, gint);
+ break;
default:
g_warning ("gtk_binding_entry_add_signal(): unsupported type `%s' for arg[%u]",
gtk_type_name (arg->arg_type), i);