added functions from GLE, gtk_arg_reset() to free the value and reset type

Sat Mar 27 23:32:13 1999  Tim Janik  <timj@gtk.org>

        * gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
        the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
        to compare two argument values. added gtk_arg_to_valueloc() to set a
        variable from an arg through its location (pointer).

        * gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
        gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
        as gfloat*, uchars are collected as guchar*, ints are collected as
        gint*, etc...
This commit is contained in:
Tim Janik
1999-03-30 18:28:38 +00:00
committed by Tim Janik
parent d32d93cc3c
commit db496116d9
11 changed files with 364 additions and 9 deletions

View File

@@ -1,3 +1,15 @@
Sat Mar 27 23:32:13 1999 Tim Janik <timj@gtk.org>
* gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
to compare two argument values. added gtk_arg_to_valueloc() to set a
variable from an arg through its location (pointer).
* gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
as gfloat*, uchars are collected as guchar*, ints are collected as
gint*, etc...
Mon Mar 29 17:45:47 1999 Owen Taylor <otaylor@redhat.com>
* gtk/gtkaccelgroup.c gtk/gtkgtkbindings.c:

View File

@@ -1,3 +1,15 @@
Sat Mar 27 23:32:13 1999 Tim Janik <timj@gtk.org>
* gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
to compare two argument values. added gtk_arg_to_valueloc() to set a
variable from an arg through its location (pointer).
* gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
as gfloat*, uchars are collected as guchar*, ints are collected as
gint*, etc...
Mon Mar 29 17:45:47 1999 Owen Taylor <otaylor@redhat.com>
* gtk/gtkaccelgroup.c gtk/gtkgtkbindings.c:

View File

@@ -1,3 +1,15 @@
Sat Mar 27 23:32:13 1999 Tim Janik <timj@gtk.org>
* gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
to compare two argument values. added gtk_arg_to_valueloc() to set a
variable from an arg through its location (pointer).
* gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
as gfloat*, uchars are collected as guchar*, ints are collected as
gint*, etc...
Mon Mar 29 17:45:47 1999 Owen Taylor <otaylor@redhat.com>
* gtk/gtkaccelgroup.c gtk/gtkgtkbindings.c:

View File

@@ -1,3 +1,15 @@
Sat Mar 27 23:32:13 1999 Tim Janik <timj@gtk.org>
* gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
to compare two argument values. added gtk_arg_to_valueloc() to set a
variable from an arg through its location (pointer).
* gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
as gfloat*, uchars are collected as guchar*, ints are collected as
gint*, etc...
Mon Mar 29 17:45:47 1999 Owen Taylor <otaylor@redhat.com>
* gtk/gtkaccelgroup.c gtk/gtkgtkbindings.c:

View File

@@ -1,3 +1,15 @@
Sat Mar 27 23:32:13 1999 Tim Janik <timj@gtk.org>
* gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
to compare two argument values. added gtk_arg_to_valueloc() to set a
variable from an arg through its location (pointer).
* gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
as gfloat*, uchars are collected as guchar*, ints are collected as
gint*, etc...
Mon Mar 29 17:45:47 1999 Owen Taylor <otaylor@redhat.com>
* gtk/gtkaccelgroup.c gtk/gtkgtkbindings.c:

View File

@@ -1,3 +1,15 @@
Sat Mar 27 23:32:13 1999 Tim Janik <timj@gtk.org>
* gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
to compare two argument values. added gtk_arg_to_valueloc() to set a
variable from an arg through its location (pointer).
* gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
as gfloat*, uchars are collected as guchar*, ints are collected as
gint*, etc...
Mon Mar 29 17:45:47 1999 Owen Taylor <otaylor@redhat.com>
* gtk/gtkaccelgroup.c gtk/gtkgtkbindings.c:

View File

@@ -1,3 +1,15 @@
Sat Mar 27 23:32:13 1999 Tim Janik <timj@gtk.org>
* gtk/gtkarg.[hc]: added functions from GLE, gtk_arg_reset() to free
the value and reset type to GTK_TYPE_INVALID, and gtk_arg_values_equal()
to compare two argument values. added gtk_arg_to_valueloc() to set a
variable from an arg through its location (pointer).
* gtk/gtkobject.[hc]: implemented gtk_object_get() in terms of
gtk_object_arg_get() and gtk_arg_to_valueloc(), floats are collected
as gfloat*, uchars are collected as guchar*, ints are collected as
gint*, etc...
Mon Mar 29 17:45:47 1999 Owen Taylor <otaylor@redhat.com>
* gtk/gtkaccelgroup.c gtk/gtkgtkbindings.c:

View File

@@ -422,17 +422,40 @@ gtk_arg_copy (GtkArg *src_arg,
}
void
gtk_arg_free (GtkArg *arg,
gboolean free_contents)
gtk_arg_free (GtkArg *arg,
gboolean free_contents)
{
g_return_if_fail (arg != NULL);
if (free_contents &&
GTK_FUNDAMENTAL_TYPE (arg->type) == GTK_TYPE_STRING)
g_free (GTK_VALUE_STRING (*arg));
if (free_contents)
gtk_arg_reset (arg);
g_free (arg);
}
void
gtk_arg_reset (GtkArg *arg)
{
GtkType fundamental_type;
g_return_if_fail (arg != NULL);
fundamental_type = GTK_FUNDAMENTAL_TYPE (arg->type);
if (fundamental_type > GTK_TYPE_FUNDAMENTAL_LAST)
{
fundamental_type = gtk_type_get_varargs_type (fundamental_type);
if (!fundamental_type)
fundamental_type = GTK_FUNDAMENTAL_TYPE (arg->type);
}
if (fundamental_type == GTK_TYPE_STRING)
{
g_free (GTK_VALUE_STRING (*arg));
arg->type = GTK_TYPE_INVALID;
}
else if (arg->type != GTK_TYPE_INVALID)
arg->type = GTK_TYPE_INVALID;
}
gint
gtk_arg_info_equal (gconstpointer arg_info_1,
gconstpointer arg_info_2)
@@ -466,3 +489,195 @@ gtk_arg_info_hash (gconstpointer arg_info)
return h;
}
gboolean
gtk_arg_values_equal (const GtkArg *arg1,
const GtkArg *arg2)
{
GtkType fundamental_type;
gboolean equal;
g_return_val_if_fail (arg1 != NULL, FALSE);
g_return_val_if_fail (arg2 != NULL, FALSE);
g_return_val_if_fail (GTK_FUNDAMENTAL_TYPE (arg1->type) ==
GTK_FUNDAMENTAL_TYPE (arg2->type), FALSE);
fundamental_type = GTK_FUNDAMENTAL_TYPE (arg1->type);
if (fundamental_type > GTK_TYPE_FUNDAMENTAL_LAST)
{
fundamental_type = gtk_type_get_varargs_type (fundamental_type);
if (!fundamental_type)
fundamental_type = GTK_FUNDAMENTAL_TYPE (arg1->type);
}
switch (fundamental_type)
{
case GTK_TYPE_INVALID:
equal = TRUE;
break;
case GTK_TYPE_CHAR:
equal = GTK_VALUE_CHAR (*arg1) == GTK_VALUE_CHAR (*arg2);
break;
case GTK_TYPE_BOOL:
equal = (GTK_VALUE_BOOL (*arg1) != FALSE) == (GTK_VALUE_BOOL (*arg2) != FALSE);
break;
case GTK_TYPE_INT:
equal = GTK_VALUE_INT (*arg1) == GTK_VALUE_INT (*arg2);
break;
case GTK_TYPE_UINT:
equal = GTK_VALUE_UINT (*arg1) == GTK_VALUE_UINT (*arg2);
break;
case GTK_TYPE_LONG:
equal = GTK_VALUE_LONG (*arg1) == GTK_VALUE_LONG (*arg2);
break;
case GTK_TYPE_ULONG:
equal = GTK_VALUE_ULONG (*arg1) == GTK_VALUE_ULONG (*arg2);
break;
case GTK_TYPE_FLOAT:
equal = GTK_VALUE_FLOAT (*arg1) == GTK_VALUE_FLOAT (*arg2);
break;
case GTK_TYPE_DOUBLE:
equal = GTK_VALUE_DOUBLE (*arg1) == GTK_VALUE_DOUBLE (*arg2);
break;
case GTK_TYPE_STRING:
if (!GTK_VALUE_STRING (*arg1) ||
!GTK_VALUE_STRING (*arg2))
equal = GTK_VALUE_STRING (*arg1) == GTK_VALUE_STRING (*arg2);
else
equal = g_str_equal (GTK_VALUE_STRING (*arg1), GTK_VALUE_STRING (*arg2));
break;
case GTK_TYPE_ENUM:
equal = GTK_VALUE_ENUM (*arg1) == GTK_VALUE_ENUM (*arg2);
break;
case GTK_TYPE_FLAGS:
equal = GTK_VALUE_FLAGS (*arg1) == GTK_VALUE_FLAGS (*arg2);
break;
case GTK_TYPE_BOXED:
equal = GTK_VALUE_BOXED (*arg1) == GTK_VALUE_BOXED (*arg2);
break;
case GTK_TYPE_FOREIGN:
equal = (GTK_VALUE_FOREIGN (*arg1).data == GTK_VALUE_FOREIGN (*arg2).data &&
GTK_VALUE_FOREIGN (*arg1).notify == GTK_VALUE_FOREIGN (*arg2).notify);
break;
case GTK_TYPE_CALLBACK:
equal = (GTK_VALUE_CALLBACK (*arg1).marshal == GTK_VALUE_CALLBACK (*arg2).marshal &&
GTK_VALUE_CALLBACK (*arg1).data == GTK_VALUE_CALLBACK (*arg2).data &&
GTK_VALUE_CALLBACK (*arg1).notify == GTK_VALUE_CALLBACK (*arg2).notify);
break;
case GTK_TYPE_ARGS:
equal = (GTK_VALUE_ARGS (*arg1).n_args == GTK_VALUE_ARGS (*arg2).n_args &&
GTK_VALUE_ARGS (*arg1).args == GTK_VALUE_ARGS (*arg2).args);
break;
case GTK_TYPE_OBJECT:
equal = GTK_VALUE_OBJECT (*arg1) == GTK_VALUE_OBJECT (*arg2);
break;
case GTK_TYPE_POINTER:
equal = GTK_VALUE_POINTER (*arg1) == GTK_VALUE_POINTER (*arg2);
break;
case GTK_TYPE_SIGNAL:
equal = (GTK_VALUE_SIGNAL (*arg1).f == GTK_VALUE_SIGNAL (*arg2).f &&
GTK_VALUE_SIGNAL (*arg1).d == GTK_VALUE_SIGNAL (*arg2).d);
break;
case GTK_TYPE_C_CALLBACK:
equal = (GTK_VALUE_C_CALLBACK (*arg1).func == GTK_VALUE_C_CALLBACK (*arg2).func &&
GTK_VALUE_C_CALLBACK (*arg1).func_data == GTK_VALUE_C_CALLBACK (*arg2).func_data);
break;
default:
g_warning ("gtk_arg_values_equal() used with unknown type `%s'", gtk_type_name (arg1->type));
equal = FALSE;
break;
}
return equal;
}
void
gtk_arg_to_valueloc (GtkArg *arg,
gpointer value_pointer)
{
GtkType fundamental_type;
g_return_if_fail (arg != NULL);
g_return_if_fail (value_pointer != NULL);
fundamental_type = GTK_FUNDAMENTAL_TYPE (arg->type);
if (fundamental_type > GTK_TYPE_FUNDAMENTAL_LAST)
{
fundamental_type = gtk_type_get_varargs_type (fundamental_type);
if (!fundamental_type)
fundamental_type = GTK_FUNDAMENTAL_TYPE (arg->type);
}
switch (fundamental_type)
{
gchar *p_char;
guchar *p_uchar;
gboolean *p_boolean;
gint *p_int;
guint *p_uint;
glong *p_long;
gulong *p_ulong;
gfloat *p_float;
gdouble *p_double;
gpointer *p_pointer;
case GTK_TYPE_CHAR:
p_char = value_pointer;
*p_char = GTK_VALUE_CHAR (*arg);
break;
case GTK_TYPE_UCHAR:
p_uchar = value_pointer;
*p_uchar = GTK_VALUE_UCHAR (*arg);
break;
case GTK_TYPE_BOOL:
p_boolean = value_pointer;
*p_boolean = GTK_VALUE_BOOL (*arg);
break;
case GTK_TYPE_INT:
case GTK_TYPE_ENUM:
p_int = value_pointer;
*p_int = GTK_VALUE_INT (*arg);
break;
case GTK_TYPE_UINT:
case GTK_TYPE_FLAGS:
p_uint = value_pointer;
*p_uint = GTK_VALUE_UINT (*arg);
break;
case GTK_TYPE_LONG:
p_long = value_pointer;
*p_long = GTK_VALUE_LONG (*arg);
break;
case GTK_TYPE_ULONG:
p_ulong = value_pointer;
*p_ulong = GTK_VALUE_ULONG (*arg);
break;
case GTK_TYPE_FLOAT:
p_float = value_pointer;
*p_float = GTK_VALUE_FLOAT (*arg);
break;
case GTK_TYPE_DOUBLE:
p_double = value_pointer;
*p_double = GTK_VALUE_DOUBLE (*arg);
break;
case GTK_TYPE_STRING:
case GTK_TYPE_POINTER:
case GTK_TYPE_BOXED:
case GTK_TYPE_OBJECT:
p_pointer = value_pointer;
*p_pointer = GTK_VALUE_POINTER (*arg);
break;
case GTK_TYPE_SIGNAL:
case GTK_TYPE_ARGS:
case GTK_TYPE_FOREIGN:
case GTK_TYPE_CALLBACK:
case GTK_TYPE_C_CALLBACK:
case GTK_TYPE_NONE:
case GTK_TYPE_INVALID:
/* it doesn't make much sense to retrive these values,
* they either are always read-only args, or require
* multiple pointers.
*/
g_warning ("gtk_arg_fill_retloc(): unsupported argument type `%s'",
gtk_type_name (arg->type));
break;
}
}

View File

@@ -63,6 +63,9 @@ GtkArg* gtk_arg_copy (GtkArg *src_arg,
GtkArg *dest_arg);
void gtk_arg_free (GtkArg *arg,
gboolean free_contents);
void gtk_arg_reset (GtkArg *arg);
gboolean gtk_arg_values_equal (const GtkArg *arg1,
const GtkArg *arg2);
gchar* gtk_args_collect (GtkType object_type,
GHashTable *arg_info_hash_table,
GSList **arg_list_p,
@@ -87,10 +90,12 @@ GtkArg* gtk_args_query (GtkType class_type,
guint32 **arg_flags,
guint *n_args_p);
gchar* gtk_arg_name_strip_type (const gchar *arg_name);
gint gtk_arg_info_equal (gconstpointer arg_info_1,
gconstpointer arg_info_2);
guint gtk_arg_info_hash (gconstpointer arg_info);
gint gtk_arg_info_equal (gconstpointer arg_info_1,
gconstpointer arg_info_2);
guint gtk_arg_info_hash (gconstpointer arg_info);
void gtk_arg_to_valueloc (GtkArg *arg,
gpointer value_pointer);

View File

@@ -670,6 +670,49 @@ gtk_object_getv (GtkObject *object,
gtk_object_arg_get (object, args, NULL);
}
void
gtk_object_get (GtkObject *object,
const gchar *first_arg_name,
...)
{
va_list var_args;
gchar *name;
g_return_if_fail (GTK_IS_OBJECT (object));
va_start (var_args, first_arg_name);
name = (gchar*) first_arg_name;
while (name)
{
gpointer value_pointer = va_arg (var_args, gpointer);
if (value_pointer)
{
GtkArgInfo *info;
gchar *error;
GtkArg arg;
error = gtk_arg_get_info (GTK_OBJECT_TYPE (object),
object_arg_info_ht,
name,
&info);
if (error)
{
g_warning ("gtk_object_get(): %s", error);
g_free (error);
return;
}
arg.name = name;
gtk_object_arg_get (object, &arg, info);
gtk_arg_to_valueloc (&arg, value_pointer);
}
name = va_arg (var_args, gchar*);
}
}
void
gtk_object_set (GtkObject *object,
const gchar *first_arg_name,

View File

@@ -243,6 +243,14 @@ void gtk_object_destroy (GtkObject *object);
void gtk_object_getv (GtkObject *object,
guint n_args,
GtkArg *args);
/* gtk_object_get() sets the variable values pointed to by the adresses
* passed after the argument names according to the arguments value.
* if GTK_FUNDAMENTAL_TYPE (arg->type) == GTK_TYPE_STRING, it's
* the callers response to do a g_free (retrived_value);
*/
void gtk_object_get (GtkObject *object,
const gchar *first_arg_name,
...);
/* gtk_object_set() takes a variable argument list of the form:
* (..., gchar *arg_name, ARG_VALUES, [repeatedly name/value pairs,] NULL)