mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 03:16:17 +01:00
changed prototype of g_boxed_type_register_static() to contain an optional
Wed Mar 7 09:36:33 2001 Tim Janik <timj@gtk.org> * gboxed.[hc]: changed prototype of g_boxed_type_register_static() to contain an optional init function and a hint at whether the boxed structure uses ref counting internally. added g_value_set_boxed_take_ownership(). made G_TYPE_BOXED an abstract value type. * genums.[hc]: made G_TYPE_ENUM and G_TYPE_FLAGS abstract value types. * glib-genmarshal.c: argument type changes, preparation for third-party arg specification. * gobject.[hc]: cleaned up get/set property code. added g_strdup_value_contents() to improve warnings. * gparam.[hc]: added g_param_value_convert(), taking over responsibility of the old g_value_convert(). added G_PARAM_LAX_VALIDATION flag so validation alterations may be valid a part of the property setting process. * gparamspecs.[hc]: made value comparisons stable (for sort applications). added GParamSpecValueArray, a param spec for value arrays and GParamSpecClosure. nuked the value exchange functions and GParamSpecCCallback. * gtype.[hc]: catch unintialized usages of the type system with g_return_val_if_uninitialized(). introduced G_TYPE_FLAG_VALUE_ABSTRACT to flag types that introduce a value table, but can't be used for g_value_init(). cleaned up reserved type ids. * gvalue.[hc]: code cleanups and saner checking. nuked the value exchange API. implemented value transformations, we can't really "convert" values, rather transforms are an anylogy to C casts, real conversions need a param spec for validation, which is why g_param_value_convert() does real conversions now. * gvaluearray.[hc]: new files that implement a GValueArray, a struct that can hold inhomogeneous arrays of value (to that extend that it also allowes undefined values, i.e. G_VALUE_TYPE(value)==0). this is exposed to the type system as a boxed type. * gvaluetransform.c: new file implementing most of the former value exchange functions as single-sided transformations. * gvaluetypes.[hc]: nuked G_TYPE_CCALLBACK, added g_value_set_string_take_ownership(). * *.h: s/G_IS_VALUE_/G_VALUE_HOLDS_/. * *.[hc]: many fixes and cleanups. * many warning improvements. Tue Feb 27 18:35:15 2001 Tim Janik <timj@gtk.org> * gobject.c (g_object_get_valist): urg, pass G_VALUE_NOCOPY_CONTENTS into G_VALUE_LCOPY(), this needs proper documenting. * gparam.c: fixed G_PARAM_USER_MASK. * gtype.c (type_data_make_W): (type_data_last_unref_Wm): fixed invalid memory freeing. * gobject.c (g_object_last_unref): destroy signal handlers associated with object, right before finalization. * gsignal.c (g_signal_parse_name): catch destroyed nodes or signals that don't actually support details. * gobject.[hc]: got rid of property trailers. nuked GObject properties "data" and the "signal" variants. (g_object_connect): new convenience function to do multiple signal connections at once. (g_object_disconnect): likewise, for disconnections. * gparam.[hc] (g_param_spec_pool_lookup): took out trailer support. * gvalue.[hc]: marked g_value_fits_pointer() and g_value_peek_pointer() as private (the latter got renamed from g_value_get_as_pointer()). Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org> * glib-object.h: add gvaluearray.h. * gstring.[hc]: fixup naming of g_string_sprint*. * gtypes.h: fixed GCompareDataFunc naming. Wed Mar 7 09:33:27 2001 Tim Janik <timj@gtk.org> * gobject/Makefile.am: shuffled rules to avoid excessive rebuilds. * gobject/gobject-sections.txt: updates. * gobject/tmpl/*: bunch of updates, added another patch from Eric Lemings <eric.b.lemings@lmco.com>.
This commit is contained in:
parent
66107ac7e1
commit
37e4b8c87e
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,11 @@
|
||||
Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* glib-object.h: add gvaluearray.h.
|
||||
|
||||
* gstring.[hc]: fixup naming of g_string_sprint*.
|
||||
|
||||
* gtypes.h: fixed GCompareDataFunc naming.
|
||||
|
||||
2001-03-07 Christian Meyer <chrisime@gnome.org>
|
||||
|
||||
* configure.in: Added de (German) to ALL_LINGUAS.
|
||||
|
@ -1,3 +1,13 @@
|
||||
Wed Mar 7 09:33:27 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* gobject/Makefile.am: shuffled rules to avoid excessive
|
||||
rebuilds.
|
||||
|
||||
* gobject/gobject-sections.txt: updates.
|
||||
|
||||
* gobject/tmpl/*: bunch of updates, added another patch
|
||||
from Eric Lemings <eric.b.lemings@lmco.com>.
|
||||
|
||||
2001-03-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib/glib-sections.txt, glib/tmpl/messages.sgml: Removed
|
||||
|
@ -1,3 +1,13 @@
|
||||
<!-- ##### USER_FUNCTION GCompareFuncData ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@a:
|
||||
@b:
|
||||
@user_data:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### USER_FUNCTION GCompletionStrcmpFunc ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -278,17 +278,6 @@ and has no return value. It is not currently used in GLib or GTK+.
|
||||
@data:
|
||||
|
||||
|
||||
<!-- ##### USER_FUNCTION GCompareFuncData ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@a:
|
||||
@b:
|
||||
@user_data:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_qsort_with_data ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -78,7 +78,7 @@ you do not have to worry about having enough space to copy the string.
|
||||
@Returns: the destination #GString.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_string_sprintf ##### -->
|
||||
<!-- ##### MACRO g_string_sprintf ##### -->
|
||||
<para>
|
||||
Writes a formatted string into a #GString.
|
||||
This is similar to the standard <function>sprintf()</function> function,
|
||||
@ -86,19 +86,21 @@ except that the GString buffer automatically expands to contain the results.
|
||||
The previous contents of the GString are destroyed.
|
||||
</para>
|
||||
|
||||
<!-- # Unused Parameters # -->
|
||||
@string: a #GString.
|
||||
@format: the string format. See the <function>sprintf()</function>
|
||||
documentation.
|
||||
@Varargs: the parameters to insert into the format string.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_string_sprintfa ##### -->
|
||||
<!-- ##### MACRO g_string_sprintfa ##### -->
|
||||
<para>
|
||||
Appends a formatted string onto the end of a #GString.
|
||||
This function is is similar to g_string_sprintf() except that
|
||||
the text is appended to the GString.
|
||||
</para>
|
||||
|
||||
<!-- # Unused Parameters # -->
|
||||
@string: a #GString.
|
||||
@format: the string format. See the <function>sprintf()</function>
|
||||
documentation.
|
||||
|
@ -2,47 +2,36 @@
|
||||
|
||||
# The name of the module.
|
||||
DOC_MODULE=gobject
|
||||
|
||||
# The top-level SGML file.
|
||||
DOC_MAIN_SGML_FILE=gobject-docs.sgml
|
||||
|
||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE)
|
||||
EXTRA_DIST +=
|
||||
# The directory containing the source code. Relative to $(srcdir)
|
||||
DOC_SOURCE_DIR=../../../gobject
|
||||
|
||||
# Extra options to supply to gtkdoc-scan
|
||||
SCAN_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-mkdb
|
||||
MKDB_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-fixref
|
||||
FIXXREF_OPTIONS=--extra-dir=$(srcdir)/../glib/html
|
||||
# Images to copy into HTML directory
|
||||
HTML_IMAGES =
|
||||
|
||||
# Used for dependencies
|
||||
HFILE_GLOB=$(top_srcdir)/gobject/*.h
|
||||
CFILE_GLOB=$(top_srcdir)/gobject/*.c
|
||||
|
||||
# Headers to ignore
|
||||
IGNORE_HFILES= \
|
||||
.saved \
|
||||
glib-genmarshal.c \
|
||||
gbsearcharray.h
|
||||
|
||||
# Extra files to add when scanning
|
||||
EXTRA_HFILES=
|
||||
|
||||
# Images to copy into HTML directory
|
||||
HTML_IMAGES =
|
||||
|
||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE)
|
||||
content_files =
|
||||
|
||||
# Other files to distribute
|
||||
extra_files =
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling scan program. Only needed
|
||||
# if $(DOC_MODULE).types is non-empty.
|
||||
GTKDOC_CFLAGS =
|
||||
GTKDOC_LIBS =
|
||||
|
||||
# Commands for compiling and linking
|
||||
GTKDOC_CC=$(LIBTOOL) --mode=compile $(CC)
|
||||
GTKDOC_LD=$(LIBTOOL) --mode=link $(CC)
|
||||
@ -54,29 +43,29 @@ GTKDOC_LD=$(LIBTOOL) --mode=link $(CC)
|
||||
|
||||
TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(content_files) \
|
||||
$(extra_files) \
|
||||
$(HTML_IMAGES) \
|
||||
$(DOC_MAIN_SGML_FILE) \
|
||||
$(DOC_MODULE).types \
|
||||
$(DOC_MODULE)-sections.txt \
|
||||
$(DOC_MODULE)-overrides.txt
|
||||
DOC_STAMPS = $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \
|
||||
build-scan.stamp build-tmpl.stamp build-sgml.stamp build-html.stamp
|
||||
# gtkdoc-mktmpl: creates, and on changes touches: tmpl.stamp
|
||||
# gtkdoc-mkdb: creates, and on changes touches: sgml.stamp
|
||||
# gtkdoc-mkhtml: creates, and on changes touches: html.stamp
|
||||
|
||||
DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp
|
||||
|
||||
.PHONY: gtkdoc-build-all
|
||||
|
||||
if ENABLE_GTK_DOC
|
||||
all-local: html-build.stamp
|
||||
|
||||
SCANOBJ_FILES = \
|
||||
$(DOC_MODULE).args \
|
||||
$(DOC_MODULE).hierarchy \
|
||||
$(DOC_MODULE).signal
|
||||
|
||||
scan-build.stamp: $(HFILE_GLOB)
|
||||
all-local: gtkdoc-build-all
|
||||
|
||||
gtkdoc-build-all: build-sgml.stamp build-html.stamp
|
||||
@true
|
||||
build-scan.stamp: $(HFILE_GLOB)
|
||||
@echo '*** Scanning header files ***'
|
||||
cd $(srcdir) && ( \
|
||||
if grep -l '^.+$$' $(DOC_MODULE).types > /dev/null ; then \
|
||||
if grep -l '^.+$$' $(DOC_MODULE).types > /dev/null 2>/dev/null ; then \
|
||||
CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" gtkdoc-scangobj --module=$(DOC_MODULE) ; \
|
||||
else \
|
||||
for i in $(SCANOBJ_FILES) ; do \
|
||||
@ -85,46 +74,32 @@ scan-build.stamp: $(HFILE_GLOB)
|
||||
fi )
|
||||
cd $(srcdir) && \
|
||||
gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES)
|
||||
touch scan-build.stamp
|
||||
|
||||
check_scan:
|
||||
$(MAKE) scan-build.stamp
|
||||
|
||||
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES): check_scan
|
||||
|
||||
tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
|
||||
touch build-scan.stamp
|
||||
build-tmpl.stamp: build-scan.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(srcdir)/tmpl/*.sgml
|
||||
@echo '*** Rebuilding template files ***'
|
||||
cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE)
|
||||
touch tmpl-build.stamp
|
||||
|
||||
check_templates:
|
||||
$(MAKE) tmpl-build.stamp
|
||||
|
||||
tmpl.stamp: check_templates
|
||||
|
||||
sgml-build.stamp: tmpl.stamp $(CFILE_GLOB)
|
||||
touch build-tmpl.stamp
|
||||
tmpl.stamp: build-tmpl.stamp
|
||||
@true
|
||||
build-sgml.stamp: tmpl.stamp $(CFILE_GLOB)
|
||||
@echo '*** Building SGML ***'
|
||||
cd $(srcdir) && \
|
||||
gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) $(MKDB_OPTIONS)
|
||||
touch sgml-build.stamp
|
||||
|
||||
check_sgml:
|
||||
$(MAKE) sgml-build.stamp
|
||||
|
||||
sgml.stamp: check_sgml
|
||||
|
||||
html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE)
|
||||
touch build-sgml.stamp
|
||||
sgml.stamp: build-sgml.stamp
|
||||
@true
|
||||
build-html.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE)
|
||||
@echo '*** Building HTML ***'
|
||||
test -d $(srcdir)/html || mkdir $(srcdir)/html
|
||||
cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
|
||||
test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html )
|
||||
@echo '-- Fixing Crossreferences'
|
||||
cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
|
||||
touch html-build.stamp
|
||||
touch build-html.stamp
|
||||
endif
|
||||
|
||||
clean-local:
|
||||
rm -f *~ *.bak $(SCANOBJ_FILES) *-unused.txt $(DOC_STAMPS) $(srcdir)/sgml.stamp
|
||||
rm -f *~ *.bak $(SCANOBJ_FILES) *-unused.txt $(DOC_STAMPS)
|
||||
|
||||
maintainer-clean-local: clean
|
||||
cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
|
||||
@ -167,4 +142,12 @@ dist-hook: dist-check-gtkdoc dist-hook-local
|
||||
cp $(srcdir)/$$i $(distdir)/html ; \
|
||||
done
|
||||
|
||||
.PHONY : check_sgml check_templates check_scan dist-hook-local
|
||||
.PHONY: dist-hook-local
|
||||
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(HTML_IMAGES) \
|
||||
$(DOC_MAIN_SGML_FILE) \
|
||||
$(DOC_MODULE).types \
|
||||
$(DOC_MODULE)-sections.txt \
|
||||
$(DOC_MODULE)-overrides.txt
|
||||
|
@ -24,7 +24,6 @@ GTypeInstance
|
||||
GTypeInfo
|
||||
GTypeFundamentalInfo
|
||||
GInterfaceInfo
|
||||
GTypeValueTable
|
||||
|
||||
<TITLE>GType</TITLE>
|
||||
G_TYPE_FROM_INSTANCE
|
||||
@ -141,45 +140,47 @@ GObjectClass
|
||||
GObjectConstructParam
|
||||
GObjectGetPropertyFunc
|
||||
GObjectSetPropertyFunc
|
||||
GObjectFinalizeFunc
|
||||
G_TYPE_IS_OBJECT
|
||||
G_OBJECT
|
||||
G_IS_OBJECT
|
||||
G_OBJECT_CLASS
|
||||
G_IS_OBJECT_CLASS
|
||||
G_OBJECT_GET_CLASS
|
||||
G_OBJECT_TYPE
|
||||
G_OBJECT_TYPE_NAME
|
||||
G_OBJECT_CLASS_TYPE
|
||||
G_OBJECT_CLASS_NAME
|
||||
G_IS_VALUE_OBJECT
|
||||
G_TYPE_IS_OBJECT
|
||||
G_IS_OBJECT
|
||||
G_OBJECT_CLASS
|
||||
G_IS_OBJECT_CLASS
|
||||
GObjectFinalizeFunc
|
||||
G_VALUE_HOLDS_OBJECT
|
||||
g_object_class_install_property
|
||||
g_object_class_find_property
|
||||
g_object_new
|
||||
g_object_new_valist
|
||||
g_object_set
|
||||
g_object_get
|
||||
g_object_set_valist
|
||||
g_object_get_valist
|
||||
g_object_set_property
|
||||
g_object_get_property
|
||||
g_object_freeze_notify
|
||||
g_object_notify
|
||||
g_object_thaw_notify
|
||||
g_object_ref
|
||||
g_object_unref
|
||||
g_object_get_qdata
|
||||
g_object_set_qdata
|
||||
g_object_set_qdata_full
|
||||
g_object_steal_qdata
|
||||
g_object_connect
|
||||
g_object_disconnect
|
||||
g_object_set
|
||||
g_object_get
|
||||
g_object_notify
|
||||
g_object_freeze_notify
|
||||
g_object_thaw_notify
|
||||
g_object_get_data
|
||||
g_object_set_data
|
||||
g_object_set_data_full
|
||||
g_object_steal_data
|
||||
g_object_get_qdata
|
||||
g_object_set_qdata
|
||||
g_object_set_qdata_full
|
||||
g_object_steal_qdata
|
||||
g_object_set_property
|
||||
g_object_get_property
|
||||
g_object_new_valist
|
||||
g_object_set_valist
|
||||
g_object_get_valist
|
||||
g_object_watch_closure
|
||||
g_value_set_object
|
||||
g_value_get_object
|
||||
g_value_dup_object
|
||||
g_object_watch_closure
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID
|
||||
</SECTION>
|
||||
|
||||
@ -198,8 +199,8 @@ G_FLAGS_CLASS
|
||||
G_IS_FLAGS_CLASS
|
||||
G_FLAGS_CLASS_TYPE
|
||||
G_FLAGS_CLASS_TYPE_NAME
|
||||
G_IS_VALUE_ENUM
|
||||
G_IS_VALUE_FLAGS
|
||||
G_VALUE_HOLDS_ENUM
|
||||
G_VALUE_HOLDS_FLAGS
|
||||
GEnumValue
|
||||
GFlagsValue
|
||||
g_enum_get_value
|
||||
@ -228,11 +229,12 @@ g_boxed_copy
|
||||
g_boxed_free
|
||||
g_value_set_boxed
|
||||
g_value_set_static_boxed
|
||||
g_value_set_boxed_take_ownership
|
||||
g_value_get_boxed
|
||||
g_value_dup_boxed
|
||||
g_boxed_type_register_static
|
||||
<SUBSECTION Standard>
|
||||
G_IS_VALUE_BOXED
|
||||
G_VALUE_HOLDS_BOXED
|
||||
G_TYPE_IS_BOXED
|
||||
</SECTION>
|
||||
|
||||
@ -248,31 +250,48 @@ GValueExchange
|
||||
GValue
|
||||
g_value_init
|
||||
g_value_copy
|
||||
g_value_convert
|
||||
g_value_reset
|
||||
g_value_unset
|
||||
g_value_fits_pointer
|
||||
g_value_peek_pointer
|
||||
g_value_convert
|
||||
g_values_exchange
|
||||
g_value_types_exchangable
|
||||
g_value_register_exchange_func
|
||||
GTypeValueTable
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<TITLE>Value arrays</TITLE>
|
||||
<FILE>value_types</FILE>
|
||||
GValueArray
|
||||
g_value_array_new
|
||||
g_value_array_copy
|
||||
g_value_array_free
|
||||
g_value_array_index
|
||||
g_value_array_append
|
||||
g_value_array_prepend
|
||||
g_value_array_insert
|
||||
g_value_array_remove
|
||||
g_value_array_sort
|
||||
g_value_array_sort_with_data
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<TITLE>Standard value types</TITLE>
|
||||
<FILE>value_types</FILE>
|
||||
G_IS_VALUE_CHAR
|
||||
G_IS_VALUE_UCHAR
|
||||
G_IS_VALUE_BOOLEAN
|
||||
G_IS_VALUE_INT
|
||||
G_IS_VALUE_UINT
|
||||
G_IS_VALUE_LONG
|
||||
G_IS_VALUE_ULONG
|
||||
G_IS_VALUE_FLOAT
|
||||
G_IS_VALUE_DOUBLE
|
||||
G_IS_VALUE_STRING
|
||||
G_IS_VALUE_POINTER
|
||||
G_IS_VALUE_CCALLBACK
|
||||
G_IS_VALUE_PARAM
|
||||
G_VALUE_HOLDS_CHAR
|
||||
G_VALUE_HOLDS_UCHAR
|
||||
G_VALUE_HOLDS_BOOLEAN
|
||||
G_VALUE_HOLDS_INT
|
||||
G_VALUE_HOLDS_UINT
|
||||
G_VALUE_HOLDS_LONG
|
||||
G_VALUE_HOLDS_ULONG
|
||||
G_VALUE_HOLDS_FLOAT
|
||||
G_VALUE_HOLDS_DOUBLE
|
||||
G_VALUE_HOLDS_STRING
|
||||
G_VALUE_HOLDS_POINTER
|
||||
G_VALUE_HOLDS_PARAM
|
||||
g_value_set_char
|
||||
g_value_get_char
|
||||
g_value_set_uchar
|
||||
@ -293,16 +312,14 @@ g_value_set_double
|
||||
g_value_get_double
|
||||
g_value_set_string
|
||||
g_value_set_static_string
|
||||
g_value_set_string_take_ownership
|
||||
g_value_get_string
|
||||
g_value_dup_string
|
||||
g_value_set_param
|
||||
g_value_get_param
|
||||
g_value_dup_param
|
||||
g_value_get_ccallback
|
||||
g_value_get_pointer
|
||||
g_value_set_pointer
|
||||
g_value_get_as_pointer
|
||||
g_value_set_ccallback
|
||||
g_value_set_instance
|
||||
</SECTION>
|
||||
|
||||
@ -374,8 +391,6 @@ G_IS_PARAM_SPEC_POINTER
|
||||
G_PARAM_SPEC_POINTER
|
||||
G_IS_PARAM_SPEC_BOXED
|
||||
G_PARAM_SPEC_BOXED
|
||||
G_IS_PARAM_SPEC_CCALLBACK
|
||||
G_PARAM_SPEC_CCALLBACK
|
||||
G_IS_PARAM_SPEC_PARAM
|
||||
G_PARAM_SPEC_PARAM
|
||||
G_IS_PARAM_SPEC_OBJECT
|
||||
@ -393,7 +408,6 @@ GParamSpecFloat
|
||||
GParamSpecDouble
|
||||
GParamSpecString
|
||||
GParamSpecBoxed
|
||||
GParamSpecCCallback
|
||||
GParamSpecParam
|
||||
GParamSpecPointer
|
||||
GParamSpecObject
|
||||
@ -411,7 +425,6 @@ g_param_spec_double
|
||||
g_param_spec_string
|
||||
g_param_spec_string_c
|
||||
g_param_spec_boxed
|
||||
g_param_spec_ccallback
|
||||
g_param_spec_param
|
||||
g_param_spec_pointer
|
||||
g_param_spec_object
|
||||
@ -435,6 +448,9 @@ GSignalEmissionHook
|
||||
GSignalFlags
|
||||
GSignalMatchType
|
||||
GSignalQuery
|
||||
G_SIGNAL_TYPE_STATIC_SCOPE
|
||||
G_SIGNAL_MATCH_MASK
|
||||
G_SIGNAL_FLAGS_MASK
|
||||
g_signal_newc
|
||||
g_signal_newv
|
||||
g_signal_new_valist
|
||||
|
@ -106,7 +106,7 @@ Enumeration and Flag Types
|
||||
@class:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_ENUM ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_ENUM ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -114,7 +114,7 @@ Enumeration and Flag Types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_FLAGS ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_FLAGS ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
@ -74,6 +74,15 @@ gboxed
|
||||
@boxed:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_set_boxed_take_ownership ##### -->
|
||||
<para>
|
||||
This is an internal function introduced mainly for C marshallers.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@boxed:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_get_boxed ##### -->
|
||||
<para>
|
||||
|
||||
@ -98,8 +107,10 @@ gboxed
|
||||
</para>
|
||||
|
||||
@name:
|
||||
@boxed_init:
|
||||
@boxed_copy:
|
||||
@boxed_free:
|
||||
@is_refcounted:
|
||||
@Returns:
|
||||
|
||||
|
||||
|
@ -1,58 +1,75 @@
|
||||
<!-- ##### SECTION Title ##### -->
|
||||
Generic values
|
||||
Generic Values
|
||||
|
||||
<!-- ##### SECTION Short_Description ##### -->
|
||||
|
||||
A polymorphic type that can hold values of any other type.
|
||||
|
||||
<!-- ##### SECTION Long_Description ##### -->
|
||||
<para>
|
||||
|
||||
The #GValue structure is basically a variable container that consists
|
||||
of a type identifier and a specific value of that type.
|
||||
The type identifier within a #GValue structure always determines the
|
||||
type of the associated value.
|
||||
To create a undefined #GValue structure, simply create a zero-filled
|
||||
#GValue structure. To intialize the #GValue, use the g_value_init()
|
||||
function. A #GValue cannot be used until it is initialized.
|
||||
The basic type operations (such as freeing and copying) are determined
|
||||
by the #GTypeValueTable associated with the type ID stored in the #GValue.
|
||||
Other #GValue operations (such as converting values between types) are
|
||||
provided by this interface.
|
||||
</para>
|
||||
|
||||
<!-- ##### SECTION See_Also ##### -->
|
||||
<para>
|
||||
|
||||
The fundamental types which all support #GValue operations and thus
|
||||
can be used as a type initializer for g_value_init() are defined by
|
||||
a separate interface. See the Standard Values API for details.
|
||||
</para>
|
||||
|
||||
<!-- ##### MACRO G_VALUE_HOLDS ##### -->
|
||||
<para>
|
||||
|
||||
Returns #TRUE if @value holds (or contains) a value of @type.
|
||||
This macro will also check for @value != #NULL and issue a
|
||||
warning if the check fails.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@g_type:
|
||||
@type:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_VALUE_TYPE ##### -->
|
||||
<para>
|
||||
|
||||
Returns the type identifier of @value.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@value: A #GValue structure.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_VALUE_TYPE_NAME ##### -->
|
||||
<para>
|
||||
|
||||
Returns the type name of @value.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@value: A #GValue structure.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_VALUE ##### -->
|
||||
<para>
|
||||
|
||||
Return whether the passed in type ID can be used for g_value_init().
|
||||
That is, this macro checks whether this type provides an implementation
|
||||
of the #GTypeValueTable functions required for a type to create a #GValue of.
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
@Returns: Whether @type is suitable as a #GValue type.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE ##### -->
|
||||
<para>
|
||||
|
||||
Returns #TRUE if @value is a valid and initialized #GValue structure.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@value: A #GValue structure.
|
||||
|
||||
|
||||
<!-- ##### USER_FUNCTION GValueExchange ##### -->
|
||||
@ -66,26 +83,72 @@ Generic values
|
||||
|
||||
<!-- ##### STRUCT GValue ##### -->
|
||||
<para>
|
||||
|
||||
A mostly opaque structure used to hold a #GValue object. Mostly because
|
||||
the data within the structure has protected scope: it is accessible only
|
||||
to functions within a #GTypeValueTable structure, or implementations of
|
||||
the g_value_*() API.
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_init ##### -->
|
||||
<para>
|
||||
|
||||
Initializes @value with the default value of @type.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@g_type:
|
||||
@value: A zero-filled (uninitialized) #GValue structure.
|
||||
@g_type: Type the #GValue should hold values of.
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_copy ##### -->
|
||||
<para>
|
||||
|
||||
Copies the value of @src_value into @dest_value.
|
||||
</para>
|
||||
|
||||
@src_value:
|
||||
@dest_value:
|
||||
@src_value: An initialized #GValue structure.
|
||||
@dest_value: An initialized #GValue structure of the same type as @src_value.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_reset ##### -->
|
||||
<para>
|
||||
Clears the current value in @value and resets it to the default value
|
||||
(as if the value had just been initialized).
|
||||
</para>
|
||||
|
||||
@value: An initialized #GValue structure.
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_unset ##### -->
|
||||
<para>
|
||||
Clears the current value in @value and "unsets" the type,
|
||||
this releases all resources associated with this GValue.
|
||||
An unset value is the same as an uninitialized (zero-filled)
|
||||
#GValue structure.
|
||||
</para>
|
||||
|
||||
@value: An initialized #GValue structure.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_fits_pointer ##### -->
|
||||
<para>
|
||||
Determines if @value will fit inside the size of a pointer value.
|
||||
This is an internal function introduced mainly for C marshallers.
|
||||
</para>
|
||||
|
||||
@value: An initialized #GValue structure.
|
||||
@Returns: #TRUE if @value will fit inside a pointer value.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_peek_pointer ##### -->
|
||||
<para>
|
||||
Return the value contents as pointer. This function asserts that
|
||||
g_value_fits_pointer() returned #TRUE for the passed in value.
|
||||
This is an internal function introduced mainly for C marshallers.
|
||||
</para>
|
||||
|
||||
@value: An initialized #GValue structure.
|
||||
@Returns: #TRUE if @value will fit inside a pointer value.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_convert ##### -->
|
||||
@ -98,58 +161,191 @@ Generic values
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_reset ##### -->
|
||||
<!-- ##### STRUCT GTypeValueTable ##### -->
|
||||
<para>
|
||||
|
||||
The #GTypeValueTable provides the functions required by the #GValue implementation,
|
||||
to serve as a container for values of a type.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@value_init: Default initialize @values contents by poking values
|
||||
directly into the value->data array. The data array of
|
||||
the #GValue passed into this function was zero-filled
|
||||
with memset, so no care has to be taken to free any
|
||||
old contents. E.g. for the implementation of a string
|
||||
value that may never be NULL, the implementation might
|
||||
look like:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
value->data[0].v_pointer = g_strdup ("");
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
@value_free: Free any old contents that might be left in the
|
||||
data array of the passed in @value. No resources may
|
||||
remain allocated through the #GValue contents after
|
||||
this function returns. E.g. for our above string type:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
/* only free strings without a specific flag for static storage */
|
||||
if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
||||
g_free (value->data[0].v_pointer);
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
@value_copy: @dest_value is a #GValue with zero-filled data section
|
||||
and @src_value is a properly setup #GValue of same or
|
||||
derived type.
|
||||
The purpose of this function is to copy the contents of
|
||||
@src_value into @dest_value in a way, that even after
|
||||
@src_value has been freed, the contents of @dest_value
|
||||
remain valid. String type example:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
@value_peek_pointer: If the value contents fit into a pointer, such as objects
|
||||
or strings, return this pointer, so the caller can peek at
|
||||
the current contents. To extend on our above string example:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
return value->data[0].v_pointer;
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
@collect_format: A string format describing how to collect the contents of
|
||||
this value, bit-by-bit. Each character in the format represents
|
||||
an argument to be collected, the characters themselves indicate
|
||||
the type of the argument. Currently supported arguments are:
|
||||
<msgtext><variablelist>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
'i' - Integers. passed as collect_values[].v_int.
|
||||
</para></listitem></varlistentry>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
'l' - Longs. passed as collect_values[].v_long.
|
||||
</para></listitem></varlistentry>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
'd' - Doubles. passed as collect_values[].v_double.
|
||||
</para></listitem></varlistentry>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
'p' - Pointers. passed as collect_values[].v_pointer.
|
||||
</para></listitem></varlistentry>
|
||||
</variablelist></msgtext>
|
||||
It should be noted, that for variable argument list construction,
|
||||
ANSI C promotes every type smaller than an integer to an int, and
|
||||
floats to doubles. So for collection of short int or char, 'i'
|
||||
needs to be used, and for collection of floats 'd'.
|
||||
@collect_value: The collect_value() function is responsible for converting the
|
||||
values collected from a variable argument list into contents
|
||||
suitable for storage in a GValue. This function should setup
|
||||
@value similar to value_init(), e.g. for a string value that
|
||||
does not allow NULL pointers, it needs to either spew an error,
|
||||
or do an implicit conversion by storing an empty string.
|
||||
The @value passed in to this function has a zero-filled data
|
||||
array, so just like for @value_init it is guarranteed to not
|
||||
contain any old contents that might need freeing.
|
||||
@n_collect_values is exactly the string length of @collect_format,
|
||||
and @collect_values is an array of unions #GTypeCValue with
|
||||
length @n_collect_values, containing the collected values
|
||||
according to @collect_format.
|
||||
@collect_flags is an argument provided as a hint by the caller,
|
||||
which may contain the flag #G_VALUE_NOCOPY_CONTENTS indicating,
|
||||
that the collected value contents may be considered "static"
|
||||
for the duration of the #@value lifetime.
|
||||
Thus an extra copy of the contents stored in @collect_values is
|
||||
not required for assignment to @value.
|
||||
For our above string example, we continue with:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
if (!collect_values[0].v_pointer)
|
||||
value->data[0].v_pointer = g_strdup ("");
|
||||
else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
|
||||
{
|
||||
value->data[0].v_pointer = collect_values[0].v_pointer;
|
||||
/* keep a flag for the value_free() implementation to not free this string */
|
||||
value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
|
||||
}
|
||||
else
|
||||
value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
It should be noted, that it is generally a bad idea to follow the
|
||||
#G_VALUE_NOCOPY_CONTENTS hint for reference counted types. Due to
|
||||
reentrancy requirements and reference count assertions performed
|
||||
by the GSignal code, reference counts should always be incremented
|
||||
for reference counted contents stored in the value->data array.
|
||||
To deviate from our string example for a moment, and taking a look
|
||||
at an exemplary implementation for collect_value() of #GObject:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
if (collect_values[0].v_pointer)
|
||||
{
|
||||
GObject *object = G_OBJECT (collect_values[0].v_pointer);
|
||||
|
||||
<!-- ##### FUNCTION g_value_unset ##### -->
|
||||
<para>
|
||||
/* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */
|
||||
value->data[0].v_pointer = g_object_ref (object);
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
return g_strdup_printf ("Object passed as invalid NULL pointer");
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
The reference count for valid objects is always incremented,
|
||||
regardless of @collect_flags. For invalid objects, the example
|
||||
returns a newly allocated string without altering @value.
|
||||
Upon success, collect_value() needs to return NULL, if however
|
||||
a malicious condition occoured, collect_value() may spew an
|
||||
error by returning a newly allocated non-NULL string, giving
|
||||
a suitable description of the error condition.
|
||||
The calling code makes no assumptions about the @value
|
||||
contents being valid upon error returns, @value
|
||||
is simply thrown away without further freeing. As such, it is
|
||||
a good idea to not allocate #GValue contents, prior to returning
|
||||
an error, however, collect_values() is not obliged to return
|
||||
a correctly setup @value for error returns, simply because
|
||||
any non-NULL return is considered a fatal condition so further
|
||||
program behaviour is undefined.
|
||||
@lcopy_format: Format description of the arguments to collect for @lcopy_value,
|
||||
analogous to @collect_format. Usually, @lcopy_format string consist
|
||||
only of 'p's to provide lcopy_value() with pointers to storage locations.
|
||||
@lcopy_value: This function is responsible for storing the @value contents into
|
||||
arguments passed through a variable argument list which got
|
||||
collected into @collect_values according to @lcopy_format.
|
||||
@n_collect_values equals the string length of @lcopy_format,
|
||||
and @collect_flags may contain #G_VALUE_NOCOPY_CONTENTS.
|
||||
In contrast to collect_value(), lcopy_value() is obliged to
|
||||
always properly support #G_VALUE_NOCOPY_CONTENTS.
|
||||
Similar to collect_value() the function may prematurely abort
|
||||
by returning a newly allocated string describing an error condition.
|
||||
To complete the string example:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
gchar **string_p = collect_values[0].v_pointer;
|
||||
|
||||
</para>
|
||||
if (!string_p)
|
||||
return g_strdup_printf ("string location passed as NULL");
|
||||
|
||||
@value:
|
||||
if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
|
||||
*string_p = value->data[0].v_pointer;
|
||||
else
|
||||
*string_p = g_strdup (value->data[0].v_pointer);
|
||||
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
And an exemplary version of lcopy_value() for
|
||||
reference-counted types:
|
||||
<msgtext><programlisting>
|
||||
{
|
||||
GObject **object_p = collect_values[0].v_pointer;
|
||||
|
||||
<!-- ##### FUNCTION g_value_fits_pointer ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_values_exchange ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value1:
|
||||
@value2:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_types_exchangable ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value_type1:
|
||||
@value_type2:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_register_exchange_func ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value_type1:
|
||||
@value_type2:
|
||||
@func:
|
||||
|
||||
if (!object_p)
|
||||
return g_strdup_printf ("object location passed as NULL");
|
||||
if (!value->data[0].v_pointer)
|
||||
*object_p = NULL;
|
||||
else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) /* always honour */
|
||||
*object_p = value->data[0].v_pointer;
|
||||
else
|
||||
*object_p = g_object_ref (value->data[0].v_pointer);
|
||||
return NULL;
|
||||
}
|
||||
</programlisting></msgtext>
|
||||
|
||||
|
@ -1,350 +1,36 @@
|
||||
<!-- ##### SECTION ./tmpl/closures.sgml:Long_Description ##### -->
|
||||
<!-- ##### FUNCTION g_type_value_is_a ##### -->
|
||||
<para>
|
||||
Determines if @value is a #GValue whose type conforms to @type.
|
||||
</para>
|
||||
|
||||
@value: A valid #GValue structure.
|
||||
@type: A #GType value.
|
||||
@Returns: #TRUE if @value is a #GValue of @type or #FALSE if not.
|
||||
|
||||
<!-- ##### FUNCTION g_value_register_exchange_func ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value_type1:
|
||||
@value_type2:
|
||||
@func:
|
||||
|
||||
<!-- ##### SECTION ./tmpl/closures.sgml:See_Also ##### -->
|
||||
<!-- ##### FUNCTION g_value_types_exchangable ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/closures.sgml:Short_Description ##### -->
|
||||
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/closures.sgml:Title ##### -->
|
||||
Closures
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:Long_Description ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:See_Also ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:Short_Description ##### -->
|
||||
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:Title ##### -->
|
||||
gtypemodule.sgml
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/signals.sgml:Long_Description ##### -->
|
||||
<para>
|
||||
The basic concept of the signal system is that of the <emphasis>emission</emphasis>
|
||||
of a signal.
|
||||
Signals are introduced per-type and are identified through strings.
|
||||
Signals introduced for a parent type are availale in derived types as well,
|
||||
so basically they are a per-type facility that is inherited.
|
||||
A signal emission mainly involves invocation of a certain set of callbacks in
|
||||
precisely defined manner. There are two main categories of such callbacks,
|
||||
per-object
|
||||
<footnote><para> Although signals can deal with any kind of type, i'm
|
||||
referring to those types as "object types" in the following, simply
|
||||
because that is the context most users will encounter signals in.
|
||||
</para></footnote>
|
||||
ones and user provided ones.
|
||||
The per-object callbacks are most often referred to as "object method
|
||||
handler" or "default (signal) handler", while user provided callbacks are
|
||||
usually just called "signal handler".
|
||||
The object method handler is provided at signal creation time (this most
|
||||
frequently happens at the end of an object class' creation), while user
|
||||
provided handlers are frequently connected and disconnected to/from a certain
|
||||
signal on certain object instances.
|
||||
</para>
|
||||
<para>
|
||||
A signal emission consists of five stages, unless prematurely stopped:
|
||||
<variablelist>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
1 - Invocation of the object method handler for %G_SIGNAL_RUN_FIRST signals
|
||||
</para></listitem></varlistentry>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
2 - Invocation of normal user-provided signal handlers (<emphasis>after</emphasis> flag %FALSE)
|
||||
</para></listitem></varlistentry>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
3 - Invocation of the object method handler for %G_SIGNAL_RUN_LAST signals
|
||||
</para></listitem></varlistentry>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
4 - Invocation of user provided signal handlers, connected with an <emphasis>after</emphasis> flag of %TRUE
|
||||
</para></listitem></varlistentry>
|
||||
<varlistentry><term></term><listitem><para>
|
||||
5 - Invocation of the object method handler for %G_SIGNAL_RUN_CLEANUP signals
|
||||
</para></listitem></varlistentry>
|
||||
</variablelist>
|
||||
The user provided signal handlers are called in the order they were
|
||||
connected in.
|
||||
All handlers may prematurely stop a signal emission, and any number of
|
||||
handlers may be connected, disconnected, blocked or unblocked during
|
||||
a signal emission.
|
||||
There are certain criteria for skipping user handlers in stages 2 and 4
|
||||
of a signal emission.
|
||||
First, user handlers may be <emphasis>blocked</emphasis>, blocked handlers are omitted
|
||||
during callback invocation, to return from the "blocked" state, a
|
||||
handler has to get unblocked exactly the same amount of times
|
||||
it has been blocked before.
|
||||
Second, upon emission of a %G_SIGNAL_DETAILED signal, an additional
|
||||
"detail" argument passed in to g_signal_emit() has to match the detail
|
||||
argument of the signal handler currently subject to invocation.
|
||||
Specification of no detail argument for signal handlers (omission of the
|
||||
detail part of the signal specification upon connection) serves as a
|
||||
wildcard and matches any detail argument passed in to emission.
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/signals.sgml:See_Also ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/signals.sgml:Short_Description ##### -->
|
||||
Signals provide a means for customization of object behaviour and are used
|
||||
as general purpose notification mechanism.
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/signals.sgml:Title ##### -->
|
||||
Signals
|
||||
|
||||
|
||||
<!-- ##### USER_FUNCTION GObjectGetParamFunc ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@param_id:
|
||||
@value:
|
||||
@pspec:
|
||||
@trailer:
|
||||
|
||||
<!-- ##### USER_FUNCTION GObjectSetParamFunc ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@param_id:
|
||||
@value:
|
||||
@pspec:
|
||||
@trailer:
|
||||
|
||||
<!-- ##### ENUM GSignalType ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@G_SIGNAL_RUN_FIRST:
|
||||
@G_SIGNAL_RUN_LAST:
|
||||
@G_SIGNAL_RUN_CLEANUP:
|
||||
@G_SIGNAL_NO_RECURSE:
|
||||
@G_SIGNAL_ACTION:
|
||||
@G_SIGNAL_NO_HOOKS:
|
||||
|
||||
<!-- ##### USER_FUNCTION GTypePluginFillInterfaceInfo ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@plugin:
|
||||
@interface_type:
|
||||
@instance_type:
|
||||
@info:
|
||||
|
||||
<!-- ##### USER_FUNCTION GTypePluginFillTypeInfo ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@plugin:
|
||||
@g_type:
|
||||
@info:
|
||||
@value_table:
|
||||
|
||||
<!-- ##### USER_FUNCTION GTypePluginRef ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@plugin:
|
||||
|
||||
<!-- ##### USER_FUNCTION GTypePluginUnRef ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@plugin:
|
||||
|
||||
<!-- ##### STRUCT GTypePluginVTable ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@plugin_ref:
|
||||
@plugin_unref:
|
||||
@complete_type_info:
|
||||
@complete_interface_info:
|
||||
|
||||
<!-- ##### MACRO G_IS_PARAM_VALUE ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@pspec:
|
||||
@value:
|
||||
|
||||
<!-- ##### MACRO G_NOTIFY_PRIORITY ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### MACRO G_WARN_INVALID_PARAM_ID ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@param_id:
|
||||
@pspec:
|
||||
|
||||
<!-- ##### FUNCTION g_object_class_find_param_spec ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@oclass:
|
||||
@param_name:
|
||||
@value_type1:
|
||||
@value_type2:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION g_object_class_install_param ##### -->
|
||||
<!-- ##### FUNCTION g_values_exchange ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@oclass:
|
||||
@param_id:
|
||||
@pspec:
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_param ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@param_name:
|
||||
@value:
|
||||
|
||||
<!-- ##### FUNCTION g_object_queue_param_changed ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@param_name:
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_param ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@param_name:
|
||||
@value:
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_hash_table_insert ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@hash_table:
|
||||
@pspec:
|
||||
@owner_type:
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_hash_table_lookup ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@hash_table:
|
||||
@param_name:
|
||||
@owner_type:
|
||||
@try_ancestors:
|
||||
@trailer:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_hash_table_new ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_hash_table_remove ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@hash_table:
|
||||
@pspec:
|
||||
|
||||
<!-- ##### FUNCTION g_signal_type_closure_new ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@itype:
|
||||
@struct_offset:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION g_signals_destroy ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@itype:
|
||||
|
||||
<!-- ##### FUNCTION g_type_conforms_to ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@iface_type:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION g_type_instance_conforms_to ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@instance:
|
||||
@iface_type:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION g_type_is_dynamic ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@flags:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION g_type_value_conforms_to ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@type:
|
||||
@value1:
|
||||
@value2:
|
||||
@Returns:
|
||||
|
||||
|
@ -34,7 +34,6 @@ The Base Object Type
|
||||
|
||||
@pspec:
|
||||
@value:
|
||||
@trailer:
|
||||
|
||||
<!-- ##### USER_FUNCTION GObjectGetPropertyFunc ##### -->
|
||||
<para>
|
||||
@ -45,6 +44,7 @@ The Base Object Type
|
||||
@property_id:
|
||||
@value:
|
||||
@pspec:
|
||||
<!-- # Unused Parameters # -->
|
||||
@trailer:
|
||||
|
||||
|
||||
@ -57,9 +57,26 @@ The Base Object Type
|
||||
@property_id:
|
||||
@value:
|
||||
@pspec:
|
||||
<!-- # Unused Parameters # -->
|
||||
@trailer:
|
||||
|
||||
|
||||
<!-- ##### USER_FUNCTION GObjectFinalizeFunc ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_OBJECT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_OBJECT ##### -->
|
||||
<para>
|
||||
|
||||
@ -68,6 +85,30 @@ The Base Object Type
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_OBJECT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_OBJECT_CLASS ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@class:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_OBJECT_CLASS ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@class:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_OBJECT_GET_CLASS ##### -->
|
||||
<para>
|
||||
|
||||
@ -108,7 +149,7 @@ The Base Object Type
|
||||
@class:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_OBJECT ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_OBJECT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -116,46 +157,6 @@ The Base Object Type
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_OBJECT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_OBJECT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_OBJECT_CLASS ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@class:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_OBJECT_CLASS ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@class:
|
||||
|
||||
|
||||
<!-- ##### USER_FUNCTION GObjectFinalizeFunc ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_class_install_property ##### -->
|
||||
<para>
|
||||
|
||||
@ -189,112 +190,6 @@ The Base Object Type
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_new_valist ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object_type:
|
||||
@first_property_name:
|
||||
@var_args:
|
||||
@Returns:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@Varargs:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@Varargs:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_valist ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@var_args:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_valist ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@var_args:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_property ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@property_name:
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_property ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@property_name:
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_freeze_notify ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_notify ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@property_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_thaw_notify ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_ref ##### -->
|
||||
<para>
|
||||
|
||||
@ -312,47 +207,78 @@ The Base Object Type
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_qdata ##### -->
|
||||
<!-- ##### FUNCTION g_object_connect ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@signal_spec:
|
||||
@Varargs:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_qdata ##### -->
|
||||
<!-- ##### FUNCTION g_object_disconnect ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@data:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_qdata_full ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@data:
|
||||
@destroy:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_steal_qdata ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@signal_spec:
|
||||
@Varargs:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@Varargs:
|
||||
@Returns:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@Varargs:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_notify ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@property_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_freeze_notify ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_thaw_notify ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_data ##### -->
|
||||
<para>
|
||||
|
||||
@ -394,6 +320,113 @@ The Base Object Type
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_qdata ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_qdata ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@data:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_qdata_full ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@data:
|
||||
@destroy:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_steal_qdata ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@quark:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_property ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@property_name:
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_property ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@property_name:
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_new_valist ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object_type:
|
||||
@first_property_name:
|
||||
@var_args:
|
||||
@Returns:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_set_valist ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@var_args:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_get_valist ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@first_property_name:
|
||||
@var_args:
|
||||
<!-- # Unused Parameters # -->
|
||||
@first_param_name:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_watch_closure ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@closure:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_set_object ##### -->
|
||||
<para>
|
||||
|
||||
@ -421,15 +454,6 @@ The Base Object Type
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_object_watch_closure ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@object:
|
||||
@closure:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_OBJECT_WARN_INVALID_PROPERTY_ID ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -118,6 +118,7 @@ Parameter Specifications
|
||||
@G_PARAM_WRITABLE:
|
||||
@G_PARAM_CONSTRUCT:
|
||||
@G_PARAM_CONSTRUCT_ONLY:
|
||||
@G_PARAM_LAX_VALIDATION:
|
||||
@G_PARAM_PRIVATE:
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_ref ##### -->
|
||||
@ -293,8 +294,9 @@ Parameter Specifications
|
||||
@param_name:
|
||||
@owner_type:
|
||||
@walk_ancestors:
|
||||
@trailer_p:
|
||||
@Returns:
|
||||
<!-- # Unused Parameters # -->
|
||||
@trailer_p:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_internal ##### -->
|
||||
|
@ -15,8 +15,8 @@ so basically they are a per-type facility that is inherited.
|
||||
A signal emission mainly involves invocation of a certain set of callbacks in
|
||||
precisely defined manner. There are two main categories of such callbacks,
|
||||
per-object
|
||||
<footnote><para> Although signals can deal with any kind of type, i'm
|
||||
referring to those types as "object types" in the following, simply
|
||||
<footnote><para> Although signals can deal with any kind of instantiatable type,
|
||||
i'm referring to those types as "object types" in the following, simply
|
||||
because that is the context most users will encounter signals in.
|
||||
</para></footnote>
|
||||
ones and user provided ones.
|
||||
@ -182,6 +182,27 @@ filled in by the g_signal_query() function.
|
||||
#gpointer data2);
|
||||
</programlisting></msgtext>
|
||||
|
||||
<!-- ##### MACRO G_SIGNAL_TYPE_STATIC_SCOPE ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_SIGNAL_MATCH_MASK ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_SIGNAL_FLAGS_MASK ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_signal_newc ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -238,22 +238,6 @@ Standard Parameter Types
|
||||
@pspec:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_PARAM_SPEC_CCALLBACK ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@pspec:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PARAM_SPEC_CCALLBACK ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@pspec:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_PARAM_SPEC_PARAM ##### -->
|
||||
<para>
|
||||
|
||||
@ -414,13 +398,6 @@ Standard Parameter Types
|
||||
|
||||
@parent_instance:
|
||||
|
||||
<!-- ##### STRUCT GParamSpecCCallback ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@parent_instance:
|
||||
|
||||
<!-- ##### STRUCT GParamSpecParam ##### -->
|
||||
<para>
|
||||
|
||||
@ -642,18 +619,6 @@ Standard Parameter Types
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_ccallback ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@name:
|
||||
@nick:
|
||||
@blurb:
|
||||
@flags:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_param ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -178,50 +178,48 @@ interfaces and C++ classes containing only pure virtual functions.
|
||||
The predefined identifiers of the reserved fundamental types.
|
||||
</para>
|
||||
|
||||
@G_TYPE_INVALID: Usually a return value indicating an error.
|
||||
@G_TYPE_NONE: A synonym for the "void" type in C.
|
||||
@G_TYPE_INTERFACE: Root type of all interface types.
|
||||
@G_TYPE_CHAR: Identifier for the built-in type "gchar".
|
||||
@G_TYPE_UCHAR: Identifier for the built-in type "guchar".
|
||||
@G_TYPE_BOOLEAN: Identifier for the built-in type "gboolean".
|
||||
@G_TYPE_INT: Identifier for the built-in type "gint".
|
||||
@G_TYPE_UINT: Identifier for the built-in type "guint".
|
||||
@G_TYPE_LONG: Identifier for the built-in type "glong".
|
||||
@G_TYPE_ULONG: Identifier for the built-in type "gulong".
|
||||
@G_TYPE_ENUM: Identifier for the "#GEnum" type.
|
||||
@G_TYPE_FLAGS: Identifier for the "#GFlags" type.
|
||||
@G_TYPE_FLOAT: Identifier for the built-in type "gfloat".
|
||||
@G_TYPE_INVALID: Usually a return value indicating an error.
|
||||
@G_TYPE_NONE: A synonym for the "void" type in C.
|
||||
@G_TYPE_INTERFACE: Root type of all interface types.
|
||||
@G_TYPE_CHAR: Identifier for the built-in type "gchar".
|
||||
@G_TYPE_UCHAR: Identifier for the built-in type "guchar".
|
||||
@G_TYPE_BOOLEAN: Identifier for the built-in type "gboolean".
|
||||
@G_TYPE_INT: Identifier for the built-in type "gint".
|
||||
@G_TYPE_UINT: Identifier for the built-in type "guint".
|
||||
@G_TYPE_LONG: Identifier for the built-in type "glong".
|
||||
@G_TYPE_ULONG: Identifier for the built-in type "gulong".
|
||||
@G_TYPE_ENUM: Identifier for the "#GEnum" type.
|
||||
@G_TYPE_FLAGS: Identifier for the "#GFlags" type.
|
||||
@G_TYPE_FLOAT: Identifier for the built-in type "gfloat".
|
||||
@G_TYPE_DOUBLE: Identifier for the built-in type "gdouble".
|
||||
@G_TYPE_STRING: Identifier for a pointer to a null-terminated string "gchar*".
|
||||
@G_TYPE_PARAM: Identifier for the "#GParam" type.
|
||||
@G_TYPE_BOXED: Identifier for the "#GBoxed" type.
|
||||
@G_TYPE_POINTER: Identifier for anonymous pointers "void*".
|
||||
@G_TYPE_CCALLBACK: Identifier for a pointer to a C function.
|
||||
@G_TYPE_POINTER: Identifier for anonymous pointers "void*".
|
||||
@G_TYPE_BOXED: Identifier for the "#GBoxed" type.
|
||||
@G_TYPE_PARAM: Identifier for the "#GParam" type.
|
||||
@G_TYPE_OBJECT: Identifier for the "#GObject" type.
|
||||
@G_TYPE_GTK_SIGNAL: Reserved for use by the Gtk+ software package.
|
||||
@G_TYPE_BSE_PROCEDURE: Reserved for use by the BSE software package.
|
||||
@G_TYPE_BSE_TIME: Reserved for use by the BSE software package.
|
||||
@G_TYPE_BSE_NOTE: Reserved for use by the BSE software package.
|
||||
@G_TYPE_BSE_DOTS: Reserved for use by the BSE software package.
|
||||
@G_TYPE_GLE_GOBJECT: Reserved for use by the GLE software package.
|
||||
@G_TYPE_LAST_RESERVED_FUNDAMENTAL: New third-party fundamental types have to use IDs higher than this.
|
||||
@G_TYPE_PARAM_CHAR: Identifier for the "#GParamSpecChar" type.
|
||||
@G_TYPE_PARAM_UCHAR: Identifier for the "#GParamSpecUChar" type.
|
||||
@G_TYPE_PARAM_BOOLEAN: Identifier for the "#GParamSpecBoolean" type.
|
||||
@G_TYPE_PARAM_INT: Identifier for the "#GParamSpecInt" type.
|
||||
@G_TYPE_PARAM_UINT: Identifier for the "#GParamSpecUInt" type.
|
||||
@G_TYPE_PARAM_LONG: Identifier for the "#GParamSpecLong" type.
|
||||
@G_TYPE_PARAM_ULONG: Identifier for the "#GParamSpecULong" type.
|
||||
@G_TYPE_PARAM_ENUM: Identifier for the "#GParamSpecEnum" type.
|
||||
@G_TYPE_PARAM_FLAGS: Identifier for the "#GParamSpecFlags" type.
|
||||
@G_TYPE_PARAM_FLOAT: Identifier for the "#GParamSpecFloat" type.
|
||||
@G_TYPE_PARAM_DOUBLE: Identifier for the "#GParamSpecDouble" type.
|
||||
@G_TYPE_PARAM_STRING: Identifier for the "#GParamSpecString" type.
|
||||
@G_TYPE_PARAM_PARAM: Identifier for the "#GParamSpecParam" type.
|
||||
@G_TYPE_PARAM_POINTER: Identifier for the "#GParamSpecPointer" type.
|
||||
@G_TYPE_PARAM_CCALLBACK: Identifier for the "#GParamSpecCCallback" type.
|
||||
@G_TYPE_PARAM_BOXED: Identifier for the "#GParamSpecBoxed" type.
|
||||
@G_TYPE_PARAM_OBJECT: Identifier for the "#GParamSpecObject" type.
|
||||
@G_TYPE_RESERVED_BSE_FIRST: First fundamental type ID reserved for BSE.
|
||||
@G_TYPE_RESERVED_BSE_LAST: Last fundamental type ID reserved for BSE.
|
||||
@G_TYPE_RESERVED_LAST_FUNDAMENTAL: Last reserved fundamental type ID.
|
||||
@G_TYPE_CLOSURE:
|
||||
@G_TYPE_VALUE_ARRAY:
|
||||
@G_TYPE_PARAM_CHAR: Identifier for the "#GParamSpecChar" type.
|
||||
@G_TYPE_PARAM_UCHAR: Identifier for the "#GParamSpecUChar" type.
|
||||
@G_TYPE_PARAM_BOOLEAN: Identifier for the "#GParamSpecBoolean" type.
|
||||
@G_TYPE_PARAM_INT: Identifier for the "#GParamSpecInt" type.
|
||||
@G_TYPE_PARAM_UINT: Identifier for the "#GParamSpecUInt" type.
|
||||
@G_TYPE_PARAM_LONG: Identifier for the "#GParamSpecLong" type.
|
||||
@G_TYPE_PARAM_ULONG: Identifier for the "#GParamSpecULong" type.
|
||||
@G_TYPE_PARAM_ENUM: Identifier for the "#GParamSpecEnum" type.
|
||||
@G_TYPE_PARAM_FLAGS: Identifier for the "#GParamSpecFlags" type.
|
||||
@G_TYPE_PARAM_FLOAT: Identifier for the "#GParamSpecFloat" type.
|
||||
@G_TYPE_PARAM_DOUBLE: Identifier for the "#GParamSpecDouble" type.
|
||||
@G_TYPE_PARAM_STRING: Identifier for the "#GParamSpecString" type.
|
||||
@G_TYPE_PARAM_PARAM: Identifier for the "#GParamSpecParam" type.
|
||||
@G_TYPE_PARAM_BOXED: Identifier for the "#GParamSpecBoxed" type.
|
||||
@G_TYPE_PARAM_POINTER: Identifier for the "#GParamSpecPointer" type.
|
||||
@G_TYPE_PARAM_VALUE_ARRAY: Identifier for the "#GParamSpecValueArray" type.
|
||||
@G_TYPE_PARAM_CLOSURE: Identifier for the "#GParamClosure" type.
|
||||
@G_TYPE_PARAM_OBJECT: Identifier for the "#GParamSpecObject" type.
|
||||
|
||||
<!-- ##### STRUCT GTypeInterface ##### -->
|
||||
<para>
|
||||
@ -256,8 +254,8 @@ across invocation of g_type_register_static().
|
||||
@instance_size: Size of the instance (object) structure (required for instantiatable types only).
|
||||
@n_preallocs: Number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching).
|
||||
@instance_init: Location of the instance initialization function (optional, for instantiatable types only).
|
||||
@value_table: Function table for generic handling of GValues of this type (usualy only usefull for
|
||||
fundamental types).
|
||||
@value_table: A #GTypeValueTable function table for generic handling of GValues of this type (usualy only
|
||||
usefull for fundamental types).
|
||||
|
||||
<!-- ##### STRUCT GTypeFundamentalInfo ##### -->
|
||||
<para>
|
||||
@ -278,20 +276,6 @@ used specifically for managing interface types.
|
||||
@interface_data: Location of user data passed to the @interface_init and
|
||||
@interface_finalize functions (optional).
|
||||
|
||||
<!-- ##### STRUCT GTypeValueTable ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value_init:
|
||||
@value_free:
|
||||
@value_copy:
|
||||
@value_peek_pointer:
|
||||
@collect_format:
|
||||
@collect_value:
|
||||
@lcopy_format:
|
||||
@lcopy_value:
|
||||
|
||||
<!-- ##### MACRO G_TYPE_FROM_INSTANCE ##### -->
|
||||
<para>
|
||||
Returns the type identifier from a given @instance structure.
|
||||
@ -423,8 +407,8 @@ Return the unique name that is assigned to a type ID (this is the preferred meth
|
||||
to find out whether a specific type has been registered for the passed in ID yet).
|
||||
</para>
|
||||
|
||||
@type: Type to return name for.
|
||||
@Returns: Static type name or NULL.
|
||||
@type: Type to return name for.
|
||||
@Returns: Static type name or NULL.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_type_qname ##### -->
|
||||
@ -458,17 +442,17 @@ If the passed in type has no parent, i.e. is a fundamental type, 0 is returned.
|
||||
|
||||
<!-- ##### FUNCTION g_type_next_base ##### -->
|
||||
<para>
|
||||
Given a @type and a @base_type which is contained in its anchestry, return
|
||||
the type that @base_type is the direct parent type for.
|
||||
In other words, for a given type branch, e.g. Root-Derived1-Derived2-Leaf, specified
|
||||
through @type=Leaf, return the nextmost child of @base_type. In this example, for
|
||||
@base_type=Derived1, the returned value would be Derived2, for @base_type=Root, the
|
||||
returned value would be Derived1.
|
||||
Given a @leaf_type and a @root_type which is contained in its anchestry, return
|
||||
the type that @root_type is the immediate parent of.
|
||||
In other words, this function determines the type that is derived directly from
|
||||
@root_type which is also a base class of @leaf_type. Given a root type and a
|
||||
leaf type, this function can be used to determine the types and order in which
|
||||
the leaf type is descended from the root type.
|
||||
</para>
|
||||
|
||||
@type: Descendant of @base_type and the type to be returned.
|
||||
@base_type: Direct parent of the returned type.
|
||||
@Returns: Immediate child of @base_type and anchestor of @type.
|
||||
@leaf_type: Descendant of @root_type and the type to be returned.
|
||||
@root_type: Immediate parent of the returned type.
|
||||
@Returns: Immediate child of @root_type and anchestor of @leaf_type.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_type_is_a ##### -->
|
||||
@ -799,6 +783,7 @@ Bit masks used to check or determine characteristics of a type.
|
||||
|
||||
@G_TYPE_FLAG_ABSTRACT: Indicates an abstract type. No instances can be
|
||||
created for an abstract type.
|
||||
@G_TYPE_FLAG_VALUE_ABSTRACT:
|
||||
|
||||
<!-- ##### ENUM GTypeFundamentalFlags ##### -->
|
||||
<para>
|
||||
@ -1034,16 +1019,6 @@ the anchestry of @instance.
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_type_value_is_a ##### -->
|
||||
<para>
|
||||
Determines if @value is a #GValue whose type conforms to @type.
|
||||
</para>
|
||||
|
||||
@value: A valid #GValue structure.
|
||||
@type: A #GType value.
|
||||
@Returns: #TRUE if @value is a #GValue of @type or #FALSE if not.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_type_value_table_peek ##### -->
|
||||
<para>
|
||||
Returns the location of the #GTypeValueTable associated with @type.
|
||||
|
@ -9,12 +9,14 @@ Standard value types
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### SECTION See_Also ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_CHAR ##### -->
|
||||
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_CHAR ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -22,7 +24,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_UCHAR ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_UCHAR ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -30,7 +32,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_BOOLEAN ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_BOOLEAN ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -38,7 +40,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_INT ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_INT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -46,7 +48,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_UINT ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_UINT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -54,7 +56,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_LONG ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_LONG ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -62,7 +64,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_ULONG ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_ULONG ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -70,7 +72,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_FLOAT ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_FLOAT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -78,7 +80,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_DOUBLE ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_DOUBLE ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -86,7 +88,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_STRING ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_STRING ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -94,7 +96,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_POINTER ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_POINTER ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -102,15 +104,7 @@ Standard value types
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_CCALLBACK ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_IS_VALUE_PARAM ##### -->
|
||||
<!-- ##### MACRO G_VALUE_HOLDS_PARAM ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
@ -298,6 +292,15 @@ Standard value types
|
||||
@v_string:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_set_string_take_ownership ##### -->
|
||||
<para>
|
||||
This is an internal function introduced mainly for C marshallers.
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@v_string:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_get_string ##### -->
|
||||
<para>
|
||||
|
||||
@ -343,16 +346,6 @@ Standard value types
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_get_ccallback ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@callback_func:
|
||||
@callback_data:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_get_pointer ##### -->
|
||||
<para>
|
||||
|
||||
@ -371,25 +364,6 @@ Standard value types
|
||||
@v_pointer:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_get_as_pointer ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_set_ccallback ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@callback_func:
|
||||
@callback_data:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_set_instance ##### -->
|
||||
<para>
|
||||
|
||||
|
6
garray.c
6
garray.c
@ -286,7 +286,7 @@ g_array_sort (GArray *farray,
|
||||
|
||||
void
|
||||
g_array_sort_with_data (GArray *farray,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealArray *array = (GRealArray*) farray;
|
||||
@ -580,7 +580,7 @@ g_ptr_array_sort (GPtrArray *array,
|
||||
|
||||
void
|
||||
g_ptr_array_sort_with_data (GPtrArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_return_if_fail (array != NULL);
|
||||
@ -663,7 +663,7 @@ g_byte_array_sort (GByteArray *array,
|
||||
|
||||
void
|
||||
g_byte_array_sort_with_data (GByteArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_array_sort_with_data ((GArray *) array, compare_func, user_data);
|
||||
|
6
garray.h
6
garray.h
@ -91,7 +91,7 @@ GArray* g_array_remove_index_fast (GArray *array,
|
||||
void g_array_sort (GArray *array,
|
||||
GCompareFunc compare_func);
|
||||
void g_array_sort_with_data (GArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
/* Resizable pointer array. This interface is much less complicated
|
||||
@ -119,7 +119,7 @@ void g_ptr_array_add (GPtrArray *array,
|
||||
void g_ptr_array_sort (GPtrArray *array,
|
||||
GCompareFunc compare_func);
|
||||
void g_ptr_array_sort_with_data (GPtrArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
|
||||
@ -146,7 +146,7 @@ GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
|
||||
void g_byte_array_sort (GByteArray *array,
|
||||
GCompareFunc compare_func);
|
||||
void g_byte_array_sort_with_data (GByteArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <gobject/gtypemodule.h>
|
||||
#include <gobject/gtypeplugin.h>
|
||||
#include <gobject/gvalue.h>
|
||||
#include <gobject/gvaluearray.h>
|
||||
#include <gobject/gvaluetypes.h>
|
||||
|
||||
|
||||
|
@ -286,7 +286,7 @@ g_array_sort (GArray *farray,
|
||||
|
||||
void
|
||||
g_array_sort_with_data (GArray *farray,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealArray *array = (GRealArray*) farray;
|
||||
@ -580,7 +580,7 @@ g_ptr_array_sort (GPtrArray *array,
|
||||
|
||||
void
|
||||
g_ptr_array_sort_with_data (GPtrArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_return_if_fail (array != NULL);
|
||||
@ -663,7 +663,7 @@ g_byte_array_sort (GByteArray *array,
|
||||
|
||||
void
|
||||
g_byte_array_sort_with_data (GByteArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_array_sort_with_data ((GArray *) array, compare_func, user_data);
|
||||
|
@ -91,7 +91,7 @@ GArray* g_array_remove_index_fast (GArray *array,
|
||||
void g_array_sort (GArray *array,
|
||||
GCompareFunc compare_func);
|
||||
void g_array_sort_with_data (GArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
/* Resizable pointer array. This interface is much less complicated
|
||||
@ -119,7 +119,7 @@ void g_ptr_array_add (GPtrArray *array,
|
||||
void g_ptr_array_sort (GPtrArray *array,
|
||||
GCompareFunc compare_func);
|
||||
void g_ptr_array_sort_with_data (GPtrArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
|
||||
@ -146,7 +146,7 @@ GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
|
||||
void g_byte_array_sort (GByteArray *array,
|
||||
GCompareFunc compare_func);
|
||||
void g_byte_array_sort_with_data (GByteArray *array,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Tim Janik
|
||||
* Copyright (C) 2000-2001 Tim Janik
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -94,7 +94,7 @@ bsearch_array_insert (GBSearchArray *barray,
|
||||
}
|
||||
else
|
||||
barray->nodes = g_realloc (barray->nodes, barray->n_nodes * sizeof_node);
|
||||
check = (char *) barray->nodes + i * sizeof_node;
|
||||
check = ((guint8*) barray->nodes) + i * sizeof_node;
|
||||
g_memmove (check + sizeof_node, check, (n_nodes - i) * sizeof_node);
|
||||
replace = TRUE;
|
||||
SKIP_GROW:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Tim Janik
|
||||
* Copyright (C) 2000-2001 Tim Janik
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -69,6 +69,9 @@ gpointer g_bsearch_array_lookup (GBSearchArray *barray,
|
||||
G_INLINE_FUNC
|
||||
gpointer g_bsearch_array_get_nth (GBSearchArray *barray,
|
||||
guint n);
|
||||
G_INLINE_FUNC
|
||||
guint g_bsearch_array_get_index (GBSearchArray *barray,
|
||||
gpointer node_in_array);
|
||||
|
||||
|
||||
/* --- implementation details --- */
|
||||
@ -115,14 +118,25 @@ g_bsearch_array_get_nth (GBSearchArray *barray,
|
||||
{
|
||||
if (n < barray->n_nodes)
|
||||
{
|
||||
guint8 *nodes = (guint8 *) barray->nodes;
|
||||
guint8 *nodes = (guint8*) barray->nodes;
|
||||
|
||||
return nodes + n * barray->sizeof_node;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
#endif /* G_CAN_INLINE && __G_BSEARCHARRAY_C__ */
|
||||
G_INLINE_FUNC
|
||||
guint
|
||||
g_bsearch_array_get_index (GBSearchArray *barray,
|
||||
gpointer node_in_array)
|
||||
{
|
||||
guint distance = ((guint8*) node_in_array) - ((guint8*) barray->nodes);
|
||||
|
||||
distance /= barray->sizeof_node;
|
||||
|
||||
return MIN (distance, barray->n_nodes);
|
||||
}
|
||||
#endif /* G_CAN_INLINE || __G_BSEARCHARRAY_C__ */
|
||||
|
||||
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <gobject/gtypemodule.h>
|
||||
#include <gobject/gtypeplugin.h>
|
||||
#include <gobject/gvalue.h>
|
||||
#include <gobject/gvaluearray.h>
|
||||
#include <gobject/gvaluetypes.h>
|
||||
|
||||
|
||||
|
@ -651,7 +651,7 @@ g_list_sort_merge (GList *l1,
|
||||
while (l1 && l2)
|
||||
{
|
||||
if (use_data)
|
||||
cmp = ((GCompareFuncData) compare_func) (l1->data, l2->data, user_data);
|
||||
cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
|
||||
else
|
||||
cmp = ((GCompareFunc) compare_func) (l1->data, l2->data);
|
||||
|
||||
@ -720,7 +720,7 @@ g_list_sort (GList *list,
|
||||
|
||||
GList *
|
||||
g_list_sort_with_data (GList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
return g_list_sort_real (list, (GFunc) compare_func, TRUE, user_data);
|
||||
|
@ -87,7 +87,7 @@ void g_list_foreach (GList *list,
|
||||
GList* g_list_sort (GList *list,
|
||||
GCompareFunc compare_func);
|
||||
GList* g_list_sort_with_data (GList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
gpointer g_list_nth_data (GList *list,
|
||||
guint n);
|
||||
|
@ -96,7 +96,7 @@ void
|
||||
g_qsort_with_data (gconstpointer pbase,
|
||||
gint total_elems,
|
||||
size_t size,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
register char *base_ptr = (char *) pbase;
|
||||
|
@ -35,7 +35,7 @@ G_BEGIN_DECLS
|
||||
void g_qsort_with_data (gconstpointer pbase,
|
||||
gint total_elems,
|
||||
size_t size,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
G_END_DECLS
|
||||
|
@ -634,7 +634,7 @@ g_slist_sort_merge (GSList *l1,
|
||||
while (l1 && l2)
|
||||
{
|
||||
if (use_data)
|
||||
cmp = ((GCompareFuncData) compare_func) (l1->data, l2->data, user_data);
|
||||
cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
|
||||
else
|
||||
cmp = ((GCompareFunc) compare_func) (l1->data, l2->data);
|
||||
|
||||
@ -695,7 +695,7 @@ g_slist_sort (GSList *list,
|
||||
|
||||
GSList *
|
||||
g_slist_sort_with_data (GSList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
return g_slist_sort_real (list, (GFunc) compare_func, TRUE, user_data);
|
||||
|
@ -88,7 +88,7 @@ void g_slist_foreach (GSList *list,
|
||||
GSList* g_slist_sort (GSList *list,
|
||||
GCompareFunc compare_func);
|
||||
GSList* g_slist_sort_with_data (GSList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
gpointer g_slist_nth_data (GSList *list,
|
||||
guint n);
|
||||
|
@ -565,9 +565,9 @@ g_string_up (GString *fstring)
|
||||
}
|
||||
|
||||
static void
|
||||
g_string_sprintfa_int (GString *string,
|
||||
const gchar *fmt,
|
||||
va_list args)
|
||||
g_string_printfa_internal (GString *string,
|
||||
const gchar *fmt,
|
||||
va_list args)
|
||||
{
|
||||
gchar *buffer;
|
||||
|
||||
@ -577,27 +577,27 @@ g_string_sprintfa_int (GString *string,
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintf (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
g_string_printf (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
g_string_truncate (string, 0);
|
||||
|
||||
va_start (args, fmt);
|
||||
g_string_sprintfa_int (string, fmt, args);
|
||||
g_string_printfa_internal (string, fmt, args);
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintfa (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
g_string_printfa (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start (args, fmt);
|
||||
g_string_sprintfa_int (string, fmt, args);
|
||||
g_string_printfa_internal (string, fmt, args);
|
||||
va_end (args);
|
||||
}
|
||||
|
@ -94,12 +94,15 @@ GString* g_string_erase (GString *string,
|
||||
gint len);
|
||||
GString* g_string_down (GString *string);
|
||||
GString* g_string_up (GString *string);
|
||||
void g_string_sprintf (GString *string,
|
||||
void g_string_printf (GString *string,
|
||||
const gchar *format,
|
||||
...) G_GNUC_PRINTF (2, 3);
|
||||
void g_string_sprintfa (GString *string,
|
||||
void g_string_printfa (GString *string,
|
||||
const gchar *format,
|
||||
...) G_GNUC_PRINTF (2, 3);
|
||||
/* compatibility */
|
||||
#define g_string_sprintf g_string_printf
|
||||
#define g_string_sprintfa g_string_printfa
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
18
glib/gtree.c
18
glib/gtree.c
@ -41,7 +41,7 @@ typedef struct _GTreeNode GTreeNode;
|
||||
struct _GRealTree
|
||||
{
|
||||
GTreeNode *root;
|
||||
GCompareFuncData key_compare;
|
||||
GCompareDataFunc key_compare;
|
||||
gpointer key_compare_data;
|
||||
};
|
||||
|
||||
@ -59,13 +59,13 @@ static GTreeNode* g_tree_node_new (gpointer key,
|
||||
gpointer value);
|
||||
static void g_tree_node_destroy (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer comp_data,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
gint *inserted);
|
||||
static GTreeNode* g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer comp_data,
|
||||
gconstpointer key);
|
||||
static GTreeNode* g_tree_node_balance (GTreeNode *node);
|
||||
@ -76,7 +76,7 @@ static GTreeNode* g_tree_node_restore_left_balance (GTreeNode *node,
|
||||
static GTreeNode* g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
gint old_balance);
|
||||
static gpointer g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer comp_data,
|
||||
gconstpointer key);
|
||||
static gint g_tree_node_count (GTreeNode *node);
|
||||
@ -157,7 +157,7 @@ g_tree_node_destroy (GTreeNode *node)
|
||||
}
|
||||
}
|
||||
|
||||
GTree* g_tree_new_udata(GCompareFuncData key_compare_func,
|
||||
GTree* g_tree_new_udata(GCompareDataFunc key_compare_func,
|
||||
gpointer key_compare_data)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
@ -175,7 +175,7 @@ GTree* g_tree_new_udata(GCompareFuncData key_compare_func,
|
||||
GTree*
|
||||
g_tree_new (GCompareFunc key_compare_func)
|
||||
{
|
||||
return g_tree_new_udata ((GCompareFuncData) key_compare_func, NULL);
|
||||
return g_tree_new_udata ((GCompareDataFunc) key_compare_func, NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -322,7 +322,7 @@ g_tree_nnodes (GTree *tree)
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer compare_data,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
@ -393,7 +393,7 @@ g_tree_node_insert (GTreeNode *node,
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer compare_data,
|
||||
gconstpointer key)
|
||||
{
|
||||
@ -526,7 +526,7 @@ g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
|
||||
static gpointer
|
||||
g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer compare_data,
|
||||
gconstpointer key)
|
||||
{
|
||||
|
@ -40,7 +40,7 @@ typedef gint (*GTraverseFunc) (gpointer key,
|
||||
/* Balanced binary trees
|
||||
*/
|
||||
GTree* g_tree_new (GCompareFunc key_compare_func);
|
||||
GTree* g_tree_new_with_data (GCompareFuncData key_compare_func,
|
||||
GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func,
|
||||
gpointer user_data);
|
||||
void g_tree_destroy (GTree *tree);
|
||||
void g_tree_insert (GTree *tree,
|
||||
|
@ -69,7 +69,7 @@ typedef const void *gconstpointer;
|
||||
|
||||
typedef gint (*GCompareFunc) (gconstpointer a,
|
||||
gconstpointer b);
|
||||
typedef gint (*GCompareFuncData) (gconstpointer a,
|
||||
typedef gint (*GCompareDataFunc) (gconstpointer a,
|
||||
gconstpointer b,
|
||||
gpointer user_data);
|
||||
typedef gboolean (*GEqualFunc) (gconstpointer a,
|
||||
|
4
glist.c
4
glist.c
@ -651,7 +651,7 @@ g_list_sort_merge (GList *l1,
|
||||
while (l1 && l2)
|
||||
{
|
||||
if (use_data)
|
||||
cmp = ((GCompareFuncData) compare_func) (l1->data, l2->data, user_data);
|
||||
cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
|
||||
else
|
||||
cmp = ((GCompareFunc) compare_func) (l1->data, l2->data);
|
||||
|
||||
@ -720,7 +720,7 @@ g_list_sort (GList *list,
|
||||
|
||||
GList *
|
||||
g_list_sort_with_data (GList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
return g_list_sort_real (list, (GFunc) compare_func, TRUE, user_data);
|
||||
|
2
glist.h
2
glist.h
@ -87,7 +87,7 @@ void g_list_foreach (GList *list,
|
||||
GList* g_list_sort (GList *list,
|
||||
GCompareFunc compare_func);
|
||||
GList* g_list_sort_with_data (GList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
gpointer g_list_nth_data (GList *list,
|
||||
guint n);
|
||||
|
@ -2,10 +2,87 @@
|
||||
|
||||
* Makefile.am: Avoid rebuilding everything everytime.
|
||||
|
||||
Mon Mar 5 15:26:30 2001 Jonathan Blandford <jrb@redhat.com>
|
||||
Wed Mar 7 09:36:33 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* gparamspecs.c (g_param_spec_interface): add a new param spec to
|
||||
handle interfaces.
|
||||
* gboxed.[hc]: changed prototype of g_boxed_type_register_static()
|
||||
to contain an optional init function and a hint at whether the
|
||||
boxed structure uses ref counting internally.
|
||||
added g_value_set_boxed_take_ownership().
|
||||
made G_TYPE_BOXED an abstract value type.
|
||||
|
||||
* genums.[hc]: made G_TYPE_ENUM and G_TYPE_FLAGS abstract value
|
||||
types.
|
||||
|
||||
* glib-genmarshal.c: argument type changes, preparation for third-party
|
||||
arg specification.
|
||||
|
||||
* gobject.[hc]: cleaned up get/set property code.
|
||||
added g_strdup_value_contents() to improve warnings.
|
||||
|
||||
* gparam.[hc]: added g_param_value_convert(), taking over responsibility
|
||||
of the old g_value_convert(). added G_PARAM_LAX_VALIDATION flag so
|
||||
validation alterations may be valid a part of the property setting
|
||||
process.
|
||||
|
||||
* gparamspecs.[hc]: made value comparisons stable (for sort applications).
|
||||
added GParamSpecValueArray, a param spec for value arrays and
|
||||
GParamSpecClosure. nuked the value exchange functions and
|
||||
GParamSpecCCallback.
|
||||
|
||||
* gtype.[hc]: catch unintialized usages of the type system with
|
||||
g_return_val_if_uninitialized(). introduced G_TYPE_FLAG_VALUE_ABSTRACT
|
||||
to flag types that introduce a value table, but can't be used for
|
||||
g_value_init(). cleaned up reserved type ids.
|
||||
|
||||
* gvalue.[hc]: code cleanups and saner checking.
|
||||
nuked the value exchange API. implemented value transformations, we
|
||||
can't really "convert" values, rather transforms are an anylogy to
|
||||
C casts, real conversions need a param spec for validation, which is
|
||||
why g_param_value_convert() does real conversions now.
|
||||
|
||||
* gvaluearray.[hc]: new files that implement a GValueArray, a struct
|
||||
that can hold inhomogeneous arrays of value (to that extend that it
|
||||
also allowes undefined values, i.e. G_VALUE_TYPE(value)==0).
|
||||
this is exposed to the type system as a boxed type.
|
||||
|
||||
* gvaluetransform.c: new file implementing most of the former value
|
||||
exchange functions as single-sided transformations.
|
||||
|
||||
* gvaluetypes.[hc]: nuked G_TYPE_CCALLBACK, added
|
||||
g_value_set_string_take_ownership().
|
||||
|
||||
* *.h: s/G_IS_VALUE_/G_VALUE_HOLDS_/.
|
||||
|
||||
* *.[hc]: many fixes and cleanups.
|
||||
|
||||
* many warning improvements.
|
||||
|
||||
Tue Feb 27 18:35:15 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* gobject.c (g_object_get_valist): urg, pass G_VALUE_NOCOPY_CONTENTS
|
||||
into G_VALUE_LCOPY(), this needs proper documenting.
|
||||
|
||||
* gparam.c: fixed G_PARAM_USER_MASK.
|
||||
|
||||
* gtype.c (type_data_make_W):
|
||||
(type_data_last_unref_Wm): fixed invalid memory freeing.
|
||||
|
||||
* gobject.c (g_object_last_unref): destroy signal handlers associated
|
||||
with object, right before finalization.
|
||||
|
||||
* gsignal.c (g_signal_parse_name): catch destroyed nodes or signals
|
||||
that don't actually support details.
|
||||
|
||||
* gobject.[hc]: got rid of property trailers. nuked GObject
|
||||
properties "data" and the "signal" variants.
|
||||
(g_object_connect): new convenience function to do multiple
|
||||
signal connections at once.
|
||||
(g_object_disconnect): likewise, for disconnections.
|
||||
|
||||
* gparam.[hc] (g_param_spec_pool_lookup): took out trailer support.
|
||||
|
||||
* gvalue.[hc]: marked g_value_fits_pointer() and g_value_peek_pointer()
|
||||
as private (the latter got renamed from g_value_get_as_pointer()).
|
||||
|
||||
Wed Feb 21 18:31:46 2001 Jonathan Blandford <jrb@redhat.com>
|
||||
|
||||
|
@ -8,6 +8,7 @@ INCLUDES = @STRIP_BEGIN@ \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
@GLIB_DEBUG_FLAGS@ \
|
||||
-DG_DISABLE_CONST_RETURNS \
|
||||
@STRIP_END@
|
||||
|
||||
# libraries to compile and install
|
||||
@ -38,6 +39,7 @@ gruntime_public_h_sources = @STRIP_BEGIN@ \
|
||||
gtypemodule.h \
|
||||
gtypeplugin.h \
|
||||
gvalue.h \
|
||||
gvaluearray.h \
|
||||
gvaluecollector.h \
|
||||
gvaluetypes.h \
|
||||
@STRIP_END@
|
||||
@ -57,6 +59,8 @@ gruntime_c_sources = @STRIP_BEGIN@ \
|
||||
gtypemodule.c \
|
||||
gtypeplugin.c \
|
||||
gvalue.c \
|
||||
gvaluearray.c \
|
||||
gvaluetransform.c \
|
||||
gvaluetypes.c \
|
||||
@STRIP_END@
|
||||
|
||||
|
217
gobject/gboxed.c
217
gobject/gboxed.c
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* Copyright (C) 2000-2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -20,6 +20,8 @@
|
||||
|
||||
#include "gbsearcharray.h"
|
||||
#include "gvalue.h"
|
||||
#include "gvaluearray.h"
|
||||
#include "gclosure.h"
|
||||
#include "gvaluecollector.h"
|
||||
|
||||
#include <string.h>
|
||||
@ -28,8 +30,10 @@
|
||||
typedef struct
|
||||
{
|
||||
GType type;
|
||||
GBoxedInitFunc init;
|
||||
GBoxedCopyFunc copy;
|
||||
GBoxedFreeFunc free;
|
||||
gboolean is_refcounted;
|
||||
} BoxedNode;
|
||||
|
||||
|
||||
@ -52,6 +56,20 @@ boxed_nodes_cmp (gconstpointer p1,
|
||||
return G_BSEARCH_ARRAY_CMP (node1->type, node2->type);
|
||||
}
|
||||
|
||||
static inline void /* keep this function in sync with gvalue.c */
|
||||
value_meminit (GValue *value,
|
||||
GType value_type)
|
||||
{
|
||||
value->g_type = value_type;
|
||||
memset (value->data, 0, sizeof (value->data));
|
||||
}
|
||||
|
||||
static gpointer
|
||||
value_array_init (void)
|
||||
{
|
||||
return g_value_array_new (0);
|
||||
}
|
||||
|
||||
void
|
||||
g_boxed_type_init (void) /* sync with gtype.c */
|
||||
{
|
||||
@ -72,14 +90,37 @@ g_boxed_type_init (void) /* sync with gtype.c */
|
||||
|
||||
/* G_TYPE_BOXED
|
||||
*/
|
||||
type = g_type_register_fundamental (G_TYPE_BOXED, "GBoxed", &info, &finfo, G_TYPE_FLAG_ABSTRACT);
|
||||
type = g_type_register_fundamental (G_TYPE_BOXED, "GBoxed", &info, &finfo,
|
||||
G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT);
|
||||
g_assert (type == G_TYPE_BOXED);
|
||||
|
||||
/* boxed: G_TYPE_CLOSURE
|
||||
*/
|
||||
type = g_boxed_type_register_static ("GClosure",
|
||||
(GBoxedInitFunc) NULL,
|
||||
(GBoxedCopyFunc) g_closure_ref,
|
||||
(GBoxedFreeFunc) g_closure_unref,
|
||||
TRUE);
|
||||
g_assert (type == G_TYPE_CLOSURE);
|
||||
|
||||
/* boxed: G_TYPE_VALUE_ARRAY
|
||||
*/
|
||||
type = g_boxed_type_register_static ("GValueArray",
|
||||
value_array_init, /* don't allow NULL values */
|
||||
(GBoxedCopyFunc) g_value_array_copy,
|
||||
(GBoxedFreeFunc) g_value_array_free,
|
||||
FALSE);
|
||||
g_assert (type == G_TYPE_VALUE_ARRAY);
|
||||
}
|
||||
|
||||
static void
|
||||
boxed_proxy_value_init (GValue *value)
|
||||
{
|
||||
value->data[0].v_pointer = 0;
|
||||
BoxedNode key, *node;
|
||||
|
||||
key.type = G_VALUE_TYPE (value);
|
||||
node = g_bsearch_array_lookup (&boxed_bsa, &key);
|
||||
value->data[0].v_pointer = node->init ? node->init () : NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -89,7 +130,7 @@ boxed_proxy_value_free (GValue *value)
|
||||
{
|
||||
BoxedNode key, *node;
|
||||
|
||||
key.type = value->g_type;
|
||||
key.type = G_VALUE_TYPE (value);
|
||||
node = g_bsearch_array_lookup (&boxed_bsa, &key);
|
||||
node->free (value->data[0].v_pointer);
|
||||
}
|
||||
@ -103,7 +144,7 @@ boxed_proxy_value_copy (const GValue *src_value,
|
||||
{
|
||||
BoxedNode key, *node;
|
||||
|
||||
key.type = src_value->g_type;
|
||||
key.type = G_VALUE_TYPE (src_value);
|
||||
node = g_bsearch_array_lookup (&boxed_bsa, &key);
|
||||
dest_value->data[0].v_pointer = node->copy (src_value->data[0].v_pointer);
|
||||
}
|
||||
@ -123,20 +164,24 @@ boxed_proxy_collect_value (GValue *value,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
BoxedNode key, *node;
|
||||
|
||||
key.type = G_VALUE_TYPE (value);
|
||||
node = g_bsearch_array_lookup (&boxed_bsa, &key);
|
||||
|
||||
/* for NULL values, we have to call GBoxedInitFunc */
|
||||
if (!collect_values[0].v_pointer)
|
||||
value->data[0].v_pointer = NULL;
|
||||
else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
|
||||
{
|
||||
value->data[0].v_pointer = collect_values[0].v_pointer;
|
||||
value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
|
||||
}
|
||||
value->data[0].v_pointer = node->init ? node->init () : NULL;
|
||||
else
|
||||
{
|
||||
BoxedNode key, *node;
|
||||
|
||||
key.type = value->g_type;
|
||||
node = g_bsearch_array_lookup (&boxed_bsa, &key);
|
||||
value->data[0].v_pointer = node->copy (collect_values[0].v_pointer);
|
||||
/* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */
|
||||
if (!node->is_refcounted && (collect_flags & G_VALUE_NOCOPY_CONTENTS))
|
||||
{
|
||||
value->data[0].v_pointer = collect_values[0].v_pointer;
|
||||
value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
|
||||
}
|
||||
else
|
||||
value->data[0].v_pointer = node->copy (collect_values[0].v_pointer);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -161,7 +206,7 @@ boxed_proxy_lcopy_value (const GValue *value,
|
||||
{
|
||||
BoxedNode key, *node;
|
||||
|
||||
key.type = value->g_type;
|
||||
key.type = G_VALUE_TYPE (value);
|
||||
node = g_bsearch_array_lookup (&boxed_bsa, &key);
|
||||
*boxed_p = node->copy (value->data[0].v_pointer);
|
||||
}
|
||||
@ -171,8 +216,10 @@ boxed_proxy_lcopy_value (const GValue *value,
|
||||
|
||||
GType
|
||||
g_boxed_type_register_static (const gchar *name,
|
||||
GBoxedInitFunc boxed_init,
|
||||
GBoxedCopyFunc boxed_copy,
|
||||
GBoxedFreeFunc boxed_free)
|
||||
GBoxedFreeFunc boxed_free,
|
||||
gboolean is_refcounted)
|
||||
{
|
||||
static const GTypeValueTable vtable = {
|
||||
boxed_proxy_value_init,
|
||||
@ -211,8 +258,10 @@ g_boxed_type_register_static (const gchar *name,
|
||||
BoxedNode key;
|
||||
|
||||
key.type = type;
|
||||
key.init = boxed_init;
|
||||
key.copy = boxed_copy;
|
||||
key.free = boxed_free;
|
||||
key.is_refcounted = is_refcounted != FALSE;
|
||||
g_bsearch_array_insert (&boxed_bsa, &key, TRUE);
|
||||
}
|
||||
|
||||
@ -247,14 +296,26 @@ g_boxed_copy (GType boxed_type,
|
||||
{
|
||||
GValue src_value, dest_value;
|
||||
|
||||
/* we heavil rely on the gvalue.c implementation here */
|
||||
|
||||
memset (&src_value.data, 0, sizeof (src_value.data));
|
||||
memset (&dest_value.data, 0, sizeof (dest_value.data));
|
||||
dest_value.g_type = boxed_type;
|
||||
src_value.g_type = boxed_type;
|
||||
/* we heavil rely on third-party boxed type value vtable
|
||||
* implementations to follow normal boxed value storage
|
||||
* (data[0].v_pointer is the boxed struct, and
|
||||
* data[1].v_uint holds the G_VALUE_NOCOPY_CONTENTS flag,
|
||||
* rest zero).
|
||||
* but then, we can expect that since we layed out the
|
||||
* g_boxed_*() API.
|
||||
* data[1].v_uint&G_VALUE_NOCOPY_CONTENTS shouldn't be set
|
||||
* after a copy.
|
||||
*/
|
||||
/* equiv. to g_value_set_static_boxed() */
|
||||
value_meminit (&src_value, boxed_type);
|
||||
src_value.data[0].v_pointer = (gpointer) src_boxed;
|
||||
src_value.data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
|
||||
|
||||
/* call third-party code copy fucntion, fingers-crossed */
|
||||
value_meminit (&dest_value, boxed_type);
|
||||
value_table->value_copy (&src_value, &dest_value);
|
||||
|
||||
/* double check and grouse if things went wrong */
|
||||
if (dest_value.data[1].v_ulong ||
|
||||
dest_value.data[2].v_ulong ||
|
||||
dest_value.data[3].v_ulong)
|
||||
@ -294,44 +355,17 @@ g_boxed_free (GType boxed_type,
|
||||
{
|
||||
GValue value;
|
||||
|
||||
/* we heavil rely on the gvalue.c implementation here */
|
||||
memset (&value.data, 0, sizeof (value.data));
|
||||
value.g_type = boxed_type;
|
||||
/* see g_boxed_copy() on why we think we can do this */
|
||||
value_meminit (&value, boxed_type);
|
||||
value.data[0].v_pointer = boxed;
|
||||
value_table->value_free (&value);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_boxed (GValue *value,
|
||||
gconstpointer boxed)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_BOXED (value));
|
||||
g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
|
||||
|
||||
if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
||||
g_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer);
|
||||
value->data[0].v_pointer = boxed ? g_boxed_copy (G_VALUE_TYPE (value), boxed) : NULL;
|
||||
value->data[1].v_uint = 0;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_static_boxed (GValue *value,
|
||||
gconstpointer boxed)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_BOXED (value));
|
||||
g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
|
||||
|
||||
if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
||||
g_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer);
|
||||
value->data[0].v_pointer = (gpointer) boxed;
|
||||
value->data[1].v_uint = boxed ? G_VALUE_NOCOPY_CONTENTS : 0;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_value_get_boxed (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_BOXED (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL);
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL);
|
||||
|
||||
return value->data[0].v_pointer;
|
||||
@ -340,8 +374,81 @@ g_value_get_boxed (const GValue *value)
|
||||
gpointer
|
||||
g_value_dup_boxed (GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_BOXED (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL);
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL);
|
||||
|
||||
return value->data[0].v_pointer ? g_boxed_copy (G_VALUE_TYPE (value), value->data[0].v_pointer) : NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
value_set_boxed_internal (GValue *value,
|
||||
gconstpointer const_boxed,
|
||||
gboolean need_copy,
|
||||
gboolean need_free)
|
||||
{
|
||||
BoxedNode key, *node;
|
||||
gpointer boxed = (gpointer) const_boxed;
|
||||
|
||||
if (!boxed)
|
||||
{
|
||||
/* just resetting to NULL might not be desired, need to
|
||||
* have value reinitialized also (for values defaulting
|
||||
* to other default value states than a NULL data pointer),
|
||||
* g_value_reset() will handle this
|
||||
*/
|
||||
g_value_reset (value);
|
||||
return;
|
||||
}
|
||||
|
||||
key.type = G_VALUE_TYPE (value);
|
||||
node = g_bsearch_array_lookup (&boxed_bsa, &key);
|
||||
|
||||
if (node)
|
||||
{
|
||||
/* we proxy this type, free contents and copy right away */
|
||||
if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
||||
node->free (value->data[0].v_pointer);
|
||||
value->data[1].v_uint = need_free ? 0 : G_VALUE_NOCOPY_CONTENTS;
|
||||
value->data[0].v_pointer = need_copy ? node->copy (boxed) : boxed;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* we don't handle this type, free contents and let g_boxed_copy()
|
||||
* figure what's required
|
||||
*/
|
||||
if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
||||
g_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer);
|
||||
value->data[1].v_uint = need_free ? 0 : G_VALUE_NOCOPY_CONTENTS;
|
||||
value->data[0].v_pointer = need_copy ? g_boxed_copy (G_VALUE_TYPE (value), boxed) : boxed;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_boxed (GValue *value,
|
||||
gconstpointer boxed)
|
||||
{
|
||||
g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
|
||||
g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
|
||||
|
||||
value_set_boxed_internal (value, boxed, TRUE, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_static_boxed (GValue *value,
|
||||
gconstpointer boxed)
|
||||
{
|
||||
g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
|
||||
g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
|
||||
|
||||
value_set_boxed_internal (value, boxed, FALSE, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_boxed_take_ownership (GValue *value,
|
||||
gconstpointer boxed)
|
||||
{
|
||||
g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
|
||||
g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
|
||||
|
||||
value_set_boxed_internal (value, boxed, FALSE, TRUE);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* Copyright (C) 2000-2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -28,12 +28,13 @@ extern "C" {
|
||||
|
||||
|
||||
/* --- type macros --- */
|
||||
#define G_TYPE_IS_BOXED(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_BOXED)
|
||||
#define G_IS_VALUE_BOXED(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED))
|
||||
#define G_TYPE_IS_BOXED(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_BOXED)
|
||||
#define G_VALUE_HOLDS_BOXED(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED))
|
||||
|
||||
|
||||
/* --- typedefs --- */
|
||||
typedef struct _GBoxed GBoxed;
|
||||
typedef gpointer (*GBoxedInitFunc) (void);
|
||||
typedef gpointer (*GBoxedCopyFunc) (gpointer boxed);
|
||||
typedef void (*GBoxedFreeFunc) (gpointer boxed);
|
||||
|
||||
@ -43,20 +44,26 @@ GBoxed* g_boxed_copy (GType boxed_type,
|
||||
gconstpointer src_boxed);
|
||||
void g_boxed_free (GType boxed_type,
|
||||
gpointer boxed);
|
||||
void g_value_set_boxed (GValue *value,
|
||||
gconstpointer boxed);
|
||||
void g_value_set_static_boxed (GValue *value,
|
||||
gconstpointer boxed);
|
||||
gpointer g_value_get_boxed (const GValue *value);
|
||||
gpointer g_value_dup_boxed (GValue *value);
|
||||
void g_value_set_boxed (GValue *value,
|
||||
gconstpointer boxed);
|
||||
void g_value_set_static_boxed (GValue *value,
|
||||
gconstpointer boxed);
|
||||
gpointer g_value_get_boxed (const GValue *value);
|
||||
gpointer g_value_dup_boxed (GValue *value);
|
||||
|
||||
|
||||
/* --- convenience --- */
|
||||
GType g_boxed_type_register_static (const gchar *name,
|
||||
GBoxedCopyFunc boxed_copy,
|
||||
GBoxedFreeFunc boxed_free);
|
||||
GType g_boxed_type_register_static (const gchar *name,
|
||||
GBoxedInitFunc boxed_init,
|
||||
GBoxedCopyFunc boxed_copy,
|
||||
GBoxedFreeFunc boxed_free,
|
||||
gboolean is_refcounted);
|
||||
|
||||
|
||||
/* --- marshaller specific --- */
|
||||
void g_value_set_boxed_take_ownership (GValue *value,
|
||||
gconstpointer boxed);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Tim Janik
|
||||
* Copyright (C) 2000-2001 Tim Janik
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -94,7 +94,7 @@ bsearch_array_insert (GBSearchArray *barray,
|
||||
}
|
||||
else
|
||||
barray->nodes = g_realloc (barray->nodes, barray->n_nodes * sizeof_node);
|
||||
check = (char *) barray->nodes + i * sizeof_node;
|
||||
check = ((guint8*) barray->nodes) + i * sizeof_node;
|
||||
g_memmove (check + sizeof_node, check, (n_nodes - i) * sizeof_node);
|
||||
replace = TRUE;
|
||||
SKIP_GROW:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Tim Janik
|
||||
* Copyright (C) 2000-2001 Tim Janik
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -69,6 +69,9 @@ gpointer g_bsearch_array_lookup (GBSearchArray *barray,
|
||||
G_INLINE_FUNC
|
||||
gpointer g_bsearch_array_get_nth (GBSearchArray *barray,
|
||||
guint n);
|
||||
G_INLINE_FUNC
|
||||
guint g_bsearch_array_get_index (GBSearchArray *barray,
|
||||
gpointer node_in_array);
|
||||
|
||||
|
||||
/* --- implementation details --- */
|
||||
@ -115,14 +118,25 @@ g_bsearch_array_get_nth (GBSearchArray *barray,
|
||||
{
|
||||
if (n < barray->n_nodes)
|
||||
{
|
||||
guint8 *nodes = (guint8 *) barray->nodes;
|
||||
guint8 *nodes = (guint8*) barray->nodes;
|
||||
|
||||
return nodes + n * barray->sizeof_node;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
#endif /* G_CAN_INLINE && __G_BSEARCHARRAY_C__ */
|
||||
G_INLINE_FUNC
|
||||
guint
|
||||
g_bsearch_array_get_index (GBSearchArray *barray,
|
||||
gpointer node_in_array)
|
||||
{
|
||||
guint distance = ((guint8*) node_in_array) - ((guint8*) barray->nodes);
|
||||
|
||||
distance /= barray->sizeof_node;
|
||||
|
||||
return MIN (distance, barray->n_nodes);
|
||||
}
|
||||
#endif /* G_CAN_INLINE || __G_BSEARCHARRAY_C__ */
|
||||
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* Copyright (C) 2000-2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -158,7 +158,7 @@ g_closure_set_meta_marshal (GClosure *closure,
|
||||
g_return_if_fail (meta_marshal != NULL);
|
||||
g_return_if_fail (closure->is_invalid == FALSE);
|
||||
g_return_if_fail (closure->in_marshal == FALSE);
|
||||
g_return_if_fail (closure->meta_marshal == FALSE);
|
||||
g_return_if_fail (closure->meta_marshal == 0);
|
||||
|
||||
n = CLOSURE_N_NOTIFIERS (closure);
|
||||
notifiers = closure->notifiers;
|
||||
@ -506,7 +506,7 @@ g_type_class_meta_marshal (GClosure *closure,
|
||||
/* GType itype = GPOINTER_TO_UINT (closure->data); */
|
||||
guint offset = GPOINTER_TO_UINT (marshal_data);
|
||||
|
||||
class = G_TYPE_INSTANCE_GET_CLASS (g_value_get_as_pointer (param_values + 0), itype, GTypeClass);
|
||||
class = G_TYPE_INSTANCE_GET_CLASS (g_value_peek_pointer (param_values + 0), itype, GTypeClass);
|
||||
callback = G_STRUCT_MEMBER (gpointer, class, offset);
|
||||
if (callback)
|
||||
closure->marshal (closure,
|
||||
@ -529,7 +529,7 @@ g_type_iface_meta_marshal (GClosure *closure,
|
||||
GType itype = GPOINTER_TO_UINT (closure->data);
|
||||
guint offset = GPOINTER_TO_UINT (marshal_data);
|
||||
|
||||
class = G_TYPE_INSTANCE_GET_INTERFACE (g_value_get_as_pointer (param_values + 0), itype, GTypeClass);
|
||||
class = G_TYPE_INSTANCE_GET_INTERFACE (g_value_peek_pointer (param_values + 0), itype, GTypeClass);
|
||||
callback = G_STRUCT_MEMBER (gpointer, class, offset);
|
||||
if (callback)
|
||||
closure->marshal (closure,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* Copyright (C) 2000-2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -38,7 +38,7 @@ extern "C" {
|
||||
/* -- typedefs --- */
|
||||
typedef struct _GClosure GClosure;
|
||||
typedef struct _GClosureNotifyData GClosureNotifyData;
|
||||
typedef gpointer GCallback;
|
||||
typedef gpointer GCallback;
|
||||
typedef void (*GClosureNotify) (gpointer data,
|
||||
GClosure *closure);
|
||||
typedef void (*GClosureMarshal) (GClosure *closure,
|
||||
@ -85,7 +85,7 @@ struct _GClosure
|
||||
* - order of inotifiers is random
|
||||
* inotifiers may _not_ free/invalidate parameter values (e.g. ->data)
|
||||
* - order of fnotifiers is random
|
||||
* - notifiers may only be removed before or during their invocation
|
||||
* - each notifier may only be removed before or during its invocation
|
||||
* - reference counting may only happen prior to fnotify invocation
|
||||
* (in that sense, fnotifiers are really finalization handlers)
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -85,13 +85,15 @@ g_enum_types_init (void) /* sync with gtype.c */
|
||||
/* G_TYPE_ENUM
|
||||
*/
|
||||
info.class_size = sizeof (GEnumClass);
|
||||
type = g_type_register_fundamental (G_TYPE_ENUM, "GEnum", &info, &finfo, G_TYPE_FLAG_ABSTRACT);
|
||||
type = g_type_register_fundamental (G_TYPE_ENUM, "GEnum", &info, &finfo,
|
||||
G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT);
|
||||
g_assert (type == G_TYPE_ENUM);
|
||||
|
||||
/* G_TYPE_FLAGS
|
||||
*/
|
||||
info.class_size = sizeof (GFlagsClass);
|
||||
type = g_type_register_fundamental (G_TYPE_FLAGS, "GFlags", &info, &finfo, G_TYPE_FLAG_ABSTRACT);
|
||||
type = g_type_register_fundamental (G_TYPE_FLAGS, "GFlags", &info, &finfo,
|
||||
G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT);
|
||||
g_assert (type == G_TYPE_FLAGS);
|
||||
}
|
||||
|
||||
@ -378,7 +380,7 @@ g_flags_get_first_value (GFlagsClass *flags_class,
|
||||
GFlagsValue *flags_value;
|
||||
|
||||
for (flags_value = flags_class->values; flags_value->value_name; flags_value++)
|
||||
if ((flags_value->value & value) > 0)
|
||||
if ((flags_value->value & value) == flags_value->value)
|
||||
return flags_value;
|
||||
}
|
||||
|
||||
@ -389,7 +391,7 @@ void
|
||||
g_value_set_enum (GValue *value,
|
||||
gint v_enum)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_ENUM (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_ENUM (value));
|
||||
|
||||
value->data[0].v_long = v_enum;
|
||||
}
|
||||
@ -397,7 +399,7 @@ g_value_set_enum (GValue *value,
|
||||
gint
|
||||
g_value_get_enum (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_ENUM (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_ENUM (value), 0);
|
||||
|
||||
return value->data[0].v_long;
|
||||
}
|
||||
@ -406,7 +408,7 @@ void
|
||||
g_value_set_flags (GValue *value,
|
||||
guint v_flags)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_FLAGS (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_FLAGS (value));
|
||||
|
||||
value->data[0].v_ulong = v_flags;
|
||||
}
|
||||
@ -414,7 +416,7 @@ g_value_set_flags (GValue *value,
|
||||
guint
|
||||
g_value_get_flags (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_FLAGS (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_FLAGS (value), 0);
|
||||
|
||||
return value->data[0].v_ulong;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -38,8 +38,8 @@ extern "C" {
|
||||
#define G_IS_FLAGS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_FLAGS))
|
||||
#define G_FLAGS_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
|
||||
#define G_FLAGS_CLASS_TYPE_NAME(class) (g_type_name (G_FLAGS_TYPE (class)))
|
||||
#define G_IS_VALUE_ENUM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ENUM))
|
||||
#define G_IS_VALUE_FLAGS(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLAGS))
|
||||
#define G_VALUE_HOLDS_ENUM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ENUM))
|
||||
#define G_VALUE_HOLDS_FLAGS(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLAGS))
|
||||
|
||||
|
||||
/* --- enum/flag values & classes --- */
|
||||
|
@ -124,6 +124,7 @@ for boxed (anonymous but reference counted) types (GBoxed*)
|
||||
.TP 12
|
||||
\fIPARAM
|
||||
for GParamSpec or derived types (GParamSpec*)
|
||||
.TP 12
|
||||
\fIPOINTER
|
||||
for anonymous pointer types (gpointer)
|
||||
.TP 12
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GLIB-GenMarshal - Marshaller generator for GObject library
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* Copyright (C) 2000-2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -48,21 +48,27 @@ char *g_log_domain_gruntime = "GLib-Genmarshal";
|
||||
|
||||
|
||||
/* --- typedefs & structures --- */
|
||||
typedef struct _Argument Argument;
|
||||
typedef struct _Signature Signature;
|
||||
struct _Argument
|
||||
typedef struct
|
||||
{
|
||||
gchar *pname; /* parsed name */
|
||||
const gchar *sname; /* signature name */
|
||||
const gchar *func; /* functional extension */
|
||||
const gchar *cname; /* C name */
|
||||
};
|
||||
struct _Signature
|
||||
gchar *keyword; /* marhaller list keyword [MY_STRING] */
|
||||
const gchar *sig_name; /* signature name [STRING] */
|
||||
const gchar *ctype; /* C type name [gchar*] */
|
||||
const gchar *getter; /* value getter function [g_value_get_string] */
|
||||
} InArgument;
|
||||
typedef struct
|
||||
{
|
||||
gchar *ploc;
|
||||
Argument *rarg;
|
||||
GList *args; /* of type Argument* */
|
||||
};
|
||||
gchar *keyword; /* marhaller list keyword [MY_STRING] */
|
||||
const gchar *sig_name; /* signature name [STRING] */
|
||||
const gchar *ctype; /* C type name [gchar*] */
|
||||
const gchar *setter; /* value setter function [g_value_set_string] */
|
||||
const gchar *release; /* value release function [g_free] */
|
||||
} OutArgument;
|
||||
typedef struct
|
||||
{
|
||||
gchar *ploc;
|
||||
OutArgument *rarg;
|
||||
GList *args; /* of type InArgument* */
|
||||
} Signature;
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
@ -125,72 +131,89 @@ static gboolean std_includes = TRUE;
|
||||
|
||||
/* --- functions --- */
|
||||
static gboolean
|
||||
complete_arg (Argument *arg,
|
||||
gboolean is_return)
|
||||
complete_in_arg (InArgument *iarg)
|
||||
{
|
||||
static const Argument inout_arguments[] = {
|
||||
/* pname, sname, func, cname */
|
||||
{ "VOID", "VOID", NULL, "void", },
|
||||
{ "BOOLEAN", "BOOLEAN", "boolean", "gboolean", },
|
||||
{ "CHAR", "CHAR", "char", "gchar", },
|
||||
{ "UCHAR", "UCHAR", "uchar", "guchar", },
|
||||
{ "INT", "INT", "int", "gint", },
|
||||
{ "UINT", "UINT", "uint", "guint", },
|
||||
{ "LONG", "LONG", "long", "glong", },
|
||||
{ "ULONG", "ULONG", "ulong", "gulong", },
|
||||
{ "ENUM", "ENUM", "enum", "gint", },
|
||||
{ "FLAGS", "FLAGS", "flags", "guint", },
|
||||
{ "FLOAT", "FLOAT", "float", "gfloat", },
|
||||
{ "DOUBLE", "DOUBLE", "double", "gdouble", },
|
||||
static const InArgument args[] = {
|
||||
/* keyword sig_name ctype getter */
|
||||
{ "VOID", "VOID", "void", NULL, },
|
||||
{ "BOOLEAN", "BOOLEAN", "gboolean", "g_value_get_boolean", },
|
||||
{ "CHAR", "CHAR", "gchar", "g_value_get_char", },
|
||||
{ "UCHAR", "UCHAR", "guchar", "g_value_get_uchar", },
|
||||
{ "INT", "INT", "gint", "g_value_get_int", },
|
||||
{ "UINT", "UINT", "guint", "g_value_get_uint", },
|
||||
{ "LONG", "LONG", "glong", "g_value_get_long", },
|
||||
{ "ULONG", "ULONG", "gulong", "g_value_get_ulong", },
|
||||
{ "ENUM", "ENUM", "gint", "g_value_get_enum", },
|
||||
{ "FLAGS", "FLAGS", "guint", "g_value_get_flags", },
|
||||
{ "FLOAT", "FLOAT", "gfloat", "g_value_get_float", },
|
||||
{ "DOUBLE", "DOUBLE", "gdouble", "g_value_get_double", },
|
||||
{ "STRING", "STRING", "gpointer", "(char*) g_value_get_string", },
|
||||
{ "PARAM", "PARAM", "gpointer", "g_value_get_param", },
|
||||
{ "BOXED", "BOXED", "gpointer", "g_value_get_boxed", },
|
||||
{ "POINTER", "POINTER", "gpointer", "g_value_get_pointer", },
|
||||
{ "OBJECT", "OBJECT", "gpointer", "g_value_get_object", },
|
||||
/* deprecated: */
|
||||
{ "NONE", "VOID", NULL, "void", },
|
||||
{ "BOOL", "BOOLEAN", "boolean", "gboolean", },
|
||||
{ "NONE", "VOID", "void", NULL, },
|
||||
{ "BOOL", "BOOLEAN", "gboolean", "g_value_get_boolean", },
|
||||
};
|
||||
static const Argument in_arguments[] = {
|
||||
{ "STRING", "POINTER", "as_pointer", "gpointer", },
|
||||
{ "BOXED", "POINTER", "as_pointer", "gpointer", },
|
||||
{ "POINTER", "POINTER", "as_pointer", "gpointer", },
|
||||
{ "PARAM", "POINTER", "as_pointer", "gpointer", },
|
||||
{ "OBJECT", "POINTER", "as_pointer", "gpointer", },
|
||||
};
|
||||
static const Argument out_arguments[] = {
|
||||
{ "STRING", "STRING", "string", "gchar*", },
|
||||
{ "BOXED", "BOXED", "boxed", "gpointer", },
|
||||
{ "POINTER", "POINTER", "pointer", "gpointer", },
|
||||
{ "PARAM", "PARAM", "param", "GParamSpec*", },
|
||||
{ "OBJECT", "OBJECT", "object", "GObject*", },
|
||||
};
|
||||
const guint n_inout_arguments = sizeof (inout_arguments) / sizeof (inout_arguments[0]);
|
||||
const guint n_out_arguments = sizeof (out_arguments) / sizeof (out_arguments[0]);
|
||||
const guint n_in_arguments = sizeof (in_arguments) / sizeof (in_arguments[0]);
|
||||
const Argument *arguments;
|
||||
guint i, n_arguments;
|
||||
const guint n_args = sizeof (args) / sizeof (args[0]);
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail (arg != NULL, FALSE);
|
||||
g_return_val_if_fail (iarg != NULL, FALSE);
|
||||
|
||||
arguments = inout_arguments;
|
||||
n_arguments = n_inout_arguments;
|
||||
for (i = 0; i < n_arguments; i++)
|
||||
if (strcmp (arguments[i].pname, arg->pname) == 0)
|
||||
for (i = 0; i < n_args; i++)
|
||||
if (strcmp (args[i].keyword, iarg->keyword) == 0)
|
||||
{
|
||||
arg->sname = arguments[i].sname;
|
||||
arg->func = arguments[i].func;
|
||||
arg->cname = arguments[i].cname;
|
||||
iarg->sig_name = args[i].sig_name;
|
||||
iarg->ctype = args[i].ctype;
|
||||
iarg->getter = args[i].getter;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
arguments = is_return ? out_arguments : in_arguments;
|
||||
n_arguments = is_return ? n_out_arguments : n_in_arguments;
|
||||
for (i = 0; i < n_arguments; i++)
|
||||
if (strcmp (arguments[i].pname, arg->pname) == 0)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
complete_out_arg (OutArgument *oarg)
|
||||
{
|
||||
static const OutArgument args[] = {
|
||||
/* keyword sig_name ctype setter release */
|
||||
{ "VOID", "VOID", "void", NULL, NULL, },
|
||||
{ "BOOLEAN", "BOOLEAN", "gboolean", "g_value_set_boolean", NULL, },
|
||||
{ "CHAR", "CHAR", "gchar", "g_value_set_char", NULL, },
|
||||
{ "UCHAR", "UCHAR", "guchar", "g_value_set_uchar", NULL, },
|
||||
{ "INT", "INT", "gint", "g_value_set_int", NULL, },
|
||||
{ "UINT", "UINT", "guint", "g_value_set_uint", NULL, },
|
||||
{ "LONG", "LONG", "glong", "g_value_set_long", NULL, },
|
||||
{ "ULONG", "ULONG", "gulong", "g_value_set_ulong", NULL, },
|
||||
{ "ENUM", "ENUM", "gint", "g_value_set_enum", NULL, },
|
||||
{ "FLAGS", "FLAGS", "guint", "g_value_set_flags", NULL, },
|
||||
{ "FLOAT", "FLOAT", "gfloat", "g_value_set_float", NULL, },
|
||||
{ "DOUBLE", "DOUBLE", "gdouble", "g_value_set_double", NULL, },
|
||||
{ "STRING", "STRING", "gchar*", "g_value_set_string_take_ownership", NULL, },
|
||||
{ "PARAM", "PARAM", "GParamSpec*", "g_value_set_param", "g_param_spec_unref", },
|
||||
{ "BOXED", "BOXED", "gpointer", "g_value_set_boxed_take_ownership", NULL, },
|
||||
{ "POINTER", "POINTER", "gpointer", "g_value_set_pointer", NULL, },
|
||||
{ "OBJECT", "OBJECT", "GObject*", "g_value_set_object", "g_object_unref", },
|
||||
/* deprecated: */
|
||||
{ "NONE", "VOID", "void", NULL, NULL, },
|
||||
{ "BOOL", "BOOLEAN", "gboolean", "g_value_set_boolean", NULL, },
|
||||
};
|
||||
const guint n_args = sizeof (args) / sizeof (args[0]);
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail (oarg != NULL, FALSE);
|
||||
|
||||
for (i = 0; i < n_args; i++)
|
||||
if (strcmp (args[i].keyword, oarg->keyword) == 0)
|
||||
{
|
||||
arg->sname = arguments[i].sname;
|
||||
arg->func = arguments[i].func;
|
||||
arg->cname = arguments[i].cname;
|
||||
oarg->sig_name = args[i].sig_name;
|
||||
oarg->ctype = args[i].ctype;
|
||||
oarg->setter = args[i].setter;
|
||||
oarg->release = args[i].release;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -230,7 +253,7 @@ pad (const gchar *string)
|
||||
static const gchar*
|
||||
indent (guint n_spaces)
|
||||
{
|
||||
static gchar *buffer;
|
||||
static gchar *buffer = NULL;
|
||||
static guint blength = 0;
|
||||
|
||||
if (blength <= n_spaces)
|
||||
@ -307,38 +330,38 @@ generate_marshal (const gchar *signame,
|
||||
fprintf (fout, "%sgpointer marshal_data)\n", indent (ind));
|
||||
fprintf (fout, "{\n");
|
||||
|
||||
/* cfile GSignalFunc typedef */
|
||||
ind = fprintf (fout, " typedef %s (*GSignalFunc_%s) (", sig->rarg->cname, signame);
|
||||
/* cfile GMarshalFunc typedef */
|
||||
ind = fprintf (fout, " typedef %s (*GMarshalFunc_%s) (", sig->rarg->ctype, signame);
|
||||
fprintf (fout, "%s data1,\n", pad ("gpointer"));
|
||||
for (a = 1, node = sig->args; node; node = node->next)
|
||||
{
|
||||
Argument *arg = node->data;
|
||||
InArgument *iarg = node->data;
|
||||
|
||||
if (arg->func)
|
||||
fprintf (fout, "%s%s arg_%d,\n", indent (ind), pad (arg->cname), a++);
|
||||
if (iarg->getter)
|
||||
fprintf (fout, "%s%s arg_%d,\n", indent (ind), pad (iarg->ctype), a++);
|
||||
}
|
||||
fprintf (fout, "%s%s data2);\n", indent (ind), pad ("gpointer"));
|
||||
|
||||
/* cfile marshal variables */
|
||||
fprintf (fout, " register GSignalFunc_%s callback;\n", signame);
|
||||
fprintf (fout, " register GMarshalFunc_%s callback;\n", signame);
|
||||
fprintf (fout, " register GCClosure *cc = (GCClosure*) closure;\n");
|
||||
fprintf (fout, " register gpointer data1, data2;\n");
|
||||
if (sig->rarg->func)
|
||||
fprintf (fout, " %s v_return;\n", sig->rarg->cname);
|
||||
if (sig->rarg->setter)
|
||||
fprintf (fout, " %s v_return;\n", sig->rarg->ctype);
|
||||
|
||||
if (sig->args || sig->rarg->func)
|
||||
if (sig->args || sig->rarg->setter)
|
||||
{
|
||||
fprintf (fout, "\n");
|
||||
|
||||
if (sig->rarg->func)
|
||||
if (sig->rarg->setter)
|
||||
fprintf (fout, " g_return_if_fail (return_value != NULL);\n");
|
||||
if (sig->args)
|
||||
{
|
||||
for (a = 0, node = sig->args; node; node = node->next)
|
||||
{
|
||||
Argument *arg = node->data;
|
||||
InArgument *iarg = node->data;
|
||||
|
||||
if (arg->func)
|
||||
if (iarg->getter)
|
||||
a++;
|
||||
}
|
||||
fprintf (fout, " g_return_if_fail (n_param_values >= %u);\n", 1 + a);
|
||||
@ -349,31 +372,33 @@ generate_marshal (const gchar *signame,
|
||||
fprintf (fout, "\n");
|
||||
fprintf (fout, " if (G_CCLOSURE_SWAP_DATA (closure))\n {\n");
|
||||
fprintf (fout, " data1 = closure->data;\n");
|
||||
fprintf (fout, " data2 = g_value_get_as_pointer (param_values + 0);\n");
|
||||
fprintf (fout, " data2 = g_value_peek_pointer (param_values + 0);\n");
|
||||
fprintf (fout, " }\n else\n {\n");
|
||||
fprintf (fout, " data1 = g_value_get_as_pointer (param_values + 0);\n");
|
||||
fprintf (fout, " data1 = g_value_peek_pointer (param_values + 0);\n");
|
||||
fprintf (fout, " data2 = closure->data;\n");
|
||||
fprintf (fout, " }\n");
|
||||
fprintf (fout, " callback = (GSignalFunc_%s) (marshal_data ? marshal_data : cc->callback);\n", signame);
|
||||
fprintf (fout, " callback = (GMarshalFunc_%s) (marshal_data ? marshal_data : cc->callback);\n", signame);
|
||||
|
||||
/* cfile marshal callback action */
|
||||
fprintf (fout, "\n");
|
||||
ind = fprintf (fout, " %s callback (", sig->rarg->func ? " v_return =" : "");
|
||||
ind = fprintf (fout, " %s callback (", sig->rarg->setter ? " v_return =" : "");
|
||||
fprintf (fout, "data1,\n");
|
||||
for (a = 1, node = sig->args; node; node = node->next)
|
||||
{
|
||||
Argument *arg = node->data;
|
||||
InArgument *iarg = node->data;
|
||||
|
||||
if (arg->func)
|
||||
fprintf (fout, "%sg_value_get_%s (param_values + %d),\n", indent (ind), arg->func, a++);
|
||||
if (iarg->getter)
|
||||
fprintf (fout, "%s%s (param_values + %d),\n", indent (ind), iarg->getter, a++);
|
||||
}
|
||||
fprintf (fout, "%sdata2);\n", indent (ind));
|
||||
|
||||
/* cfile marshal return value storage */
|
||||
if (sig->rarg->func)
|
||||
if (sig->rarg->setter)
|
||||
{
|
||||
fprintf (fout, "\n");
|
||||
fprintf (fout, " g_value_set_%s (return_value, v_return);\n", sig->rarg->func);
|
||||
fprintf (fout, " %s (return_value, v_return);\n", sig->rarg->setter);
|
||||
if (sig->rarg->release)
|
||||
fprintf (fout, " %s (v_return);\n", sig->rarg->release);
|
||||
}
|
||||
|
||||
/* cfile marshal footer */
|
||||
@ -388,45 +413,45 @@ process_signature (Signature *sig)
|
||||
GList *node;
|
||||
|
||||
/* lookup and complete info on arguments */
|
||||
if (!complete_arg (sig->rarg, TRUE))
|
||||
if (!complete_out_arg (sig->rarg))
|
||||
{
|
||||
g_warning ("unknown type: %s", sig->rarg->pname);
|
||||
g_warning ("unknown type: %s", sig->rarg->keyword);
|
||||
return;
|
||||
}
|
||||
for (node = sig->args; node; node = node->next)
|
||||
{
|
||||
Argument *arg = node->data;
|
||||
InArgument *iarg = node->data;
|
||||
|
||||
if (!complete_arg (arg, FALSE))
|
||||
if (!complete_in_arg (iarg))
|
||||
{
|
||||
g_warning ("unknown type: %s", arg->pname);
|
||||
g_warning ("unknown type: %s", iarg->keyword);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* construct requested marshaller name and technical marshaller name */
|
||||
pname = g_strconcat (sig->rarg->pname, "_", NULL);
|
||||
sname = g_strconcat (sig->rarg->sname, "_", NULL);
|
||||
pname = g_strconcat (sig->rarg->keyword, "_", NULL);
|
||||
sname = g_strconcat (sig->rarg->sig_name, "_", NULL);
|
||||
for (node = sig->args; node; node = node->next)
|
||||
{
|
||||
Argument *arg = node->data;
|
||||
InArgument *iarg = node->data;
|
||||
gchar *tmp;
|
||||
|
||||
tmp = sname;
|
||||
sname = g_strconcat (tmp, "_", arg->sname, NULL);
|
||||
sname = g_strconcat (tmp, "_", iarg->sig_name, NULL);
|
||||
g_free (tmp);
|
||||
tmp = pname;
|
||||
pname = g_strconcat (tmp, "_", arg->pname, NULL);
|
||||
pname = g_strconcat (tmp, "_", iarg->keyword, NULL);
|
||||
g_free (tmp);
|
||||
}
|
||||
|
||||
/* introductionary comment */
|
||||
fprintf (fout, "\n/* %s", sig->rarg->pname);
|
||||
fprintf (fout, "\n/* %s", sig->rarg->keyword);
|
||||
for (node = sig->args; node; node = node->next)
|
||||
{
|
||||
Argument *arg = node->data;
|
||||
InArgument *iarg = node->data;
|
||||
|
||||
fprintf (fout, "%c%s", node->prev ? ',' : ':', arg->pname);
|
||||
fprintf (fout, "%c%s", node->prev ? ',' : ':', iarg->keyword);
|
||||
}
|
||||
if (!skip_ploc)
|
||||
fprintf (fout, " (%s)", sig->ploc);
|
||||
@ -450,14 +475,24 @@ process_signature (Signature *sig)
|
||||
g_free (sname);
|
||||
}
|
||||
|
||||
static Argument*
|
||||
new_arg (const gchar *pname)
|
||||
static InArgument*
|
||||
new_in_arg (const gchar *pname)
|
||||
{
|
||||
Argument *arg = g_new0 (Argument, 1);
|
||||
InArgument *iarg = g_new0 (InArgument, 1);
|
||||
|
||||
arg->pname = g_strdup (pname);
|
||||
iarg->keyword = g_strdup (pname);
|
||||
|
||||
return arg;
|
||||
return iarg;
|
||||
}
|
||||
|
||||
static OutArgument*
|
||||
new_out_arg (const gchar *pname)
|
||||
{
|
||||
OutArgument *oarg = g_new0 (OutArgument, 1);
|
||||
|
||||
oarg->keyword = g_strdup (pname);
|
||||
|
||||
return oarg;
|
||||
}
|
||||
|
||||
static guint
|
||||
@ -467,7 +502,7 @@ parse_line (GScanner *scanner,
|
||||
/* parse identifier for return value */
|
||||
if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER)
|
||||
return G_TOKEN_IDENTIFIER;
|
||||
sig->rarg = new_arg (scanner->value.v_identifier);
|
||||
sig->rarg = new_out_arg (scanner->value.v_identifier);
|
||||
|
||||
/* keep a note on the location */
|
||||
sig->ploc = g_strdup_printf ("%s:%u", scanner->input_name, scanner->line);
|
||||
@ -479,7 +514,7 @@ parse_line (GScanner *scanner,
|
||||
/* parse first argument */
|
||||
if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER)
|
||||
return G_TOKEN_IDENTIFIER;
|
||||
sig->args = g_list_append (sig->args, new_arg (scanner->value.v_identifier));
|
||||
sig->args = g_list_append (sig->args, new_in_arg (scanner->value.v_identifier));
|
||||
|
||||
/* parse rest of argument list */
|
||||
while (g_scanner_peek_next_token (scanner) == ',')
|
||||
@ -490,7 +525,7 @@ parse_line (GScanner *scanner,
|
||||
/* parse arg identifier */
|
||||
if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER)
|
||||
return G_TOKEN_IDENTIFIER;
|
||||
sig->args = g_list_append (sig->args, new_arg (scanner->value.v_identifier));
|
||||
sig->args = g_list_append (sig->args, new_in_arg (scanner->value.v_identifier));
|
||||
}
|
||||
|
||||
/* expect end of line, done */
|
||||
@ -605,14 +640,14 @@ main (int argc,
|
||||
/* clean up signature contents */
|
||||
g_free (signature.ploc);
|
||||
if (signature.rarg)
|
||||
g_free (signature.rarg->pname);
|
||||
g_free (signature.rarg->keyword);
|
||||
g_free (signature.rarg);
|
||||
for (node = signature.args; node; node = node->next)
|
||||
{
|
||||
Argument *arg = node->data;
|
||||
InArgument *iarg = node->data;
|
||||
|
||||
g_free (arg->pname);
|
||||
g_free (arg);
|
||||
g_free (iarg->keyword);
|
||||
g_free (iarg);
|
||||
}
|
||||
g_list_free (signature.args);
|
||||
}
|
||||
|
@ -15,18 +15,31 @@
|
||||
# FLOAT for single-precision float types (gfloat)
|
||||
# DOUBLE for double-precision float types (gdouble)
|
||||
# STRING for string types (gchar*)
|
||||
# PARAM for GParamSpec or derived types (GParamSpec*)
|
||||
# BOXED for boxed (anonymous but reference counted) types (GBoxed*)
|
||||
# POINTER for anonymous pointer types (gpointer)
|
||||
# PARAM for GParamSpec or derived types (GParamSpec*)
|
||||
# OBJECT for GObject or derived types (GObject*)
|
||||
# NONE deprecated alias for VOID
|
||||
# BOOL deprecated alias for BOOLEAN
|
||||
|
||||
# standard VOID return marshallers
|
||||
VOID:VOID
|
||||
VOID:UINT,POINTER
|
||||
VOID:PARAM
|
||||
VOID:BOOLEAN
|
||||
VOID:CHAR
|
||||
VOID:UCHAR
|
||||
VOID:INT
|
||||
VOID:OBJECT
|
||||
VOID:POINTER
|
||||
VOID:STRING
|
||||
VOID:UINT
|
||||
VOID:LONG
|
||||
VOID:ULONG
|
||||
VOID:ENUM
|
||||
VOID:FLAGS
|
||||
VOID:FLOAT
|
||||
VOID:DOUBLE
|
||||
VOID:STRING
|
||||
VOID:PARAM
|
||||
VOID:BOXED
|
||||
VOID:POINTER
|
||||
VOID:OBJECT
|
||||
|
||||
# GRuntime specific marshallers
|
||||
VOID:UINT,POINTER
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -119,6 +119,7 @@ int
|
||||
main (gint argc,
|
||||
gchar *argv[])
|
||||
{
|
||||
GLogLevelFlags fatal_mask;
|
||||
gboolean gen_froots = 0;
|
||||
gboolean gen_tree = 0;
|
||||
guint i;
|
||||
@ -126,10 +127,14 @@ main (gint argc,
|
||||
|
||||
f_out = stdout;
|
||||
|
||||
g_type_init (0);
|
||||
fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
|
||||
fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
|
||||
g_log_set_always_fatal (fatal_mask);
|
||||
|
||||
root = G_TYPE_OBJECT;
|
||||
|
||||
g_type_init (0);
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if (strcmp ("-s", argv[i]) == 0)
|
||||
@ -194,6 +199,7 @@ main (gint argc,
|
||||
else
|
||||
return help (argv[i]);
|
||||
}
|
||||
|
||||
if (!gen_froots && !gen_tree)
|
||||
return help (argv[i-1]);
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -48,12 +48,7 @@ enum {
|
||||
|
||||
/* --- properties --- */
|
||||
enum {
|
||||
PROP_NONE,
|
||||
PROP_DATA,
|
||||
PROP_SIGNAL,
|
||||
PROP_SWAPPED_SIGNAL,
|
||||
PROP_SIGNAL_AFTER,
|
||||
PROP_SWAPPED_SIGNAL_AFTER
|
||||
PROP_NONE
|
||||
};
|
||||
|
||||
|
||||
@ -75,17 +70,17 @@ static void g_object_finalize (GObject *object);
|
||||
static void g_object_do_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer);
|
||||
GParamSpec *pspec);
|
||||
static void g_object_do_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer);
|
||||
GParamSpec *pspec);
|
||||
static void g_value_object_init (GValue *value);
|
||||
static void g_value_object_free_value (GValue *value);
|
||||
static void g_value_object_copy_value (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
static void g_value_object_transform_value (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
static gpointer g_value_object_peek_pointer (const GValue *value);
|
||||
static gchar* g_value_object_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
@ -110,13 +105,11 @@ static inline void object_queue_property (GObject *object,
|
||||
static inline void object_thaw_notifies (GObject *object,
|
||||
NotifyQueue *nqueue);
|
||||
static inline void object_get_property (GObject *object,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer);
|
||||
GValue *value);
|
||||
static inline void object_set_property (GObject *object,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer,
|
||||
const GValue *value,
|
||||
NotifyQueue *nqueue);
|
||||
|
||||
|
||||
@ -211,6 +204,7 @@ g_object_type_init (void) /* sync with gtype.c */
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_OBJECT, "GObject", &info, &finfo, 0);
|
||||
g_assert (type == G_TYPE_OBJECT);
|
||||
g_value_register_transform_func (G_TYPE_OBJECT, G_TYPE_OBJECT, g_value_object_transform_value);
|
||||
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
IF_DEBUG (OBJECTS)
|
||||
@ -272,35 +266,6 @@ g_object_do_class_init (GObjectClass *class)
|
||||
class->properties_changed = g_object_properties_changed;
|
||||
class->notify = g_object_notify_property_changed;
|
||||
|
||||
g_object_class_install_property (class,
|
||||
PROP_DATA,
|
||||
g_param_spec_pointer ("data", "Named Data",
|
||||
"Named anonymous pointers",
|
||||
G_PARAM_READABLE | G_PARAM_WRITABLE));
|
||||
g_object_class_install_property (class,
|
||||
PROP_SIGNAL,
|
||||
g_param_spec_ccallback ("signal", "Signal Connection",
|
||||
"Signal connection consisting of a callback function "
|
||||
"and a data pointer",
|
||||
G_PARAM_WRITABLE));
|
||||
g_object_class_install_property (class,
|
||||
PROP_SWAPPED_SIGNAL,
|
||||
g_param_spec_ccallback ("swapped_signal", "Swapped Signal Connection",
|
||||
"Signal connection consisting of a callback function "
|
||||
"and a data pointer",
|
||||
G_PARAM_WRITABLE));
|
||||
g_object_class_install_property (class,
|
||||
PROP_SIGNAL_AFTER,
|
||||
g_param_spec_ccallback ("signal_after", "Signal After Connection",
|
||||
"Signal connection consisting of a callback function "
|
||||
"and a data pointer",
|
||||
G_PARAM_WRITABLE));
|
||||
g_object_class_install_property (class,
|
||||
PROP_SWAPPED_SIGNAL_AFTER,
|
||||
g_param_spec_ccallback ("swapped_signal_after", "Swapped Signal After Connection",
|
||||
"Signal connection consisting of a callback function "
|
||||
"and a data pointer",
|
||||
G_PARAM_WRITABLE));
|
||||
gobject_signals[PROPERTIES_CHANGED] =
|
||||
g_signal_newc ("properties_changed",
|
||||
G_TYPE_FROM_CLASS (class),
|
||||
@ -353,7 +318,7 @@ g_object_class_install_property (GObjectClass *class,
|
||||
pspec->name);
|
||||
return;
|
||||
}
|
||||
if (g_param_spec_pool_lookup (pspec_pool, pspec->name, G_OBJECT_CLASS_TYPE (class), FALSE, NULL))
|
||||
if (g_param_spec_pool_lookup (pspec_pool, pspec->name, G_OBJECT_CLASS_TYPE (class), FALSE))
|
||||
{
|
||||
g_warning (G_STRLOC ": class `%s' already contains a property named `%s'",
|
||||
G_OBJECT_CLASS_NAME (class),
|
||||
@ -374,7 +339,7 @@ g_object_class_install_property (GObjectClass *class,
|
||||
/* for property overrides of construct poperties, we have to get rid
|
||||
* of the overidden inherited construct property
|
||||
*/
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type_parent (G_OBJECT_CLASS_TYPE (class)), TRUE, NULL);
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type_parent (G_OBJECT_CLASS_TYPE (class)), TRUE);
|
||||
if (pspec && pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
|
||||
class->construct_properties = g_slist_remove (class->construct_properties, pspec);
|
||||
}
|
||||
@ -389,7 +354,7 @@ g_object_class_find_property (GObjectClass *class,
|
||||
return g_param_spec_pool_lookup (pspec_pool,
|
||||
property_name,
|
||||
G_OBJECT_CLASS_TYPE (class),
|
||||
TRUE, NULL);
|
||||
TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -453,36 +418,10 @@ static void
|
||||
g_object_do_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer)
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
guint i = 0;
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
gboolean swapped, after;
|
||||
gpointer callback, data;
|
||||
case PROP_DATA:
|
||||
g_return_if_fail (trailer != NULL);
|
||||
|
||||
g_object_set_data (object, trailer, g_value_get_pointer (value));
|
||||
break;
|
||||
case PROP_SWAPPED_SIGNAL_AFTER:
|
||||
i++;
|
||||
case PROP_SIGNAL_AFTER:
|
||||
i++;
|
||||
case PROP_SWAPPED_SIGNAL:
|
||||
i++;
|
||||
case PROP_SIGNAL:
|
||||
after = i > 2;
|
||||
swapped = i & 1;
|
||||
g_return_if_fail (trailer != NULL);
|
||||
|
||||
g_value_get_ccallback (value, &callback, &data);
|
||||
g_signal_connect_data (object, trailer,
|
||||
callback, data, NULL,
|
||||
swapped, after);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
@ -493,16 +432,10 @@ static void
|
||||
g_object_do_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer)
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_DATA:
|
||||
g_return_if_fail (trailer != NULL);
|
||||
|
||||
g_value_set_pointer (value, g_object_get_data (object, trailer));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
@ -526,6 +459,8 @@ g_object_last_unref (GObject *object)
|
||||
|
||||
if (object->ref_count == 0) /* may have been re-referenced meanwhile */
|
||||
{
|
||||
g_signal_handlers_destroy (object);
|
||||
g_object_set_qdata (object, quark_closure_array, NULL);
|
||||
G_OBJECT_GET_CLASS (object)->finalize (object);
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
IF_DEBUG (OBJECTS)
|
||||
@ -659,7 +594,7 @@ g_object_notify (GObject *object,
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool,
|
||||
property_name,
|
||||
G_OBJECT_TYPE (object),
|
||||
TRUE, NULL);
|
||||
TRUE);
|
||||
if (!pspec)
|
||||
g_warning ("%s: object class `%s' has no property named `%s'",
|
||||
G_STRLOC,
|
||||
@ -696,34 +631,110 @@ g_object_thaw_notify (GObject *object)
|
||||
|
||||
static inline void
|
||||
object_get_property (GObject *object,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer)
|
||||
GValue *value)
|
||||
{
|
||||
GObjectClass *class;
|
||||
|
||||
g_return_if_fail (g_type_is_a (G_OBJECT_TYPE (object), pspec->owner_type)); /* paranoid */
|
||||
|
||||
class = g_type_class_peek (pspec->owner_type);
|
||||
|
||||
class->get_property (object, PARAM_SPEC_PARAM_ID (pspec), value, pspec, trailer);
|
||||
class->get_property (object, PARAM_SPEC_PARAM_ID (pspec), value, pspec);
|
||||
}
|
||||
|
||||
static gchar*
|
||||
g_strdup_value_contents (const GValue *value)
|
||||
{
|
||||
const gchar *src;
|
||||
gchar *contents;
|
||||
|
||||
g_return_val_if_fail (G_IS_VALUE (value), NULL);
|
||||
|
||||
if (G_VALUE_HOLDS_STRING (value))
|
||||
{
|
||||
src = g_value_get_string (value);
|
||||
|
||||
if (!src)
|
||||
contents = g_strdup ("NULL");
|
||||
else
|
||||
{
|
||||
gchar *s = g_strescape (src, NULL);
|
||||
|
||||
contents = g_strdup_printf ("\"%s\"", s);
|
||||
g_free (s);
|
||||
}
|
||||
}
|
||||
else if (g_value_type_transformable (G_VALUE_TYPE (value), G_TYPE_STRING))
|
||||
{
|
||||
GValue tmp_value = { 0, };
|
||||
|
||||
g_value_init (&tmp_value, G_TYPE_STRING);
|
||||
g_value_transform (value, &tmp_value);
|
||||
if (G_VALUE_HOLDS_ENUM (value) || G_VALUE_HOLDS_FLAGS (value))
|
||||
contents = g_strdup_printf ("((%s) %s)",
|
||||
g_type_name (G_VALUE_TYPE (value)),
|
||||
g_value_get_string (&tmp_value));
|
||||
else
|
||||
{
|
||||
src = g_value_get_string (&tmp_value);
|
||||
contents = g_strdup (src ? src : "NULL");
|
||||
}
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
else if (g_value_fits_pointer (value))
|
||||
{
|
||||
gpointer p = g_value_peek_pointer (value);
|
||||
|
||||
if (!p)
|
||||
contents = g_strdup ("NULL");
|
||||
else if (G_VALUE_HOLDS_OBJECT (value))
|
||||
contents = g_strdup_printf ("((%s*) %p)", G_OBJECT_TYPE_NAME (p), p);
|
||||
else if (G_VALUE_HOLDS_PARAM (value))
|
||||
contents = g_strdup_printf ("((%s*) %p)", G_PARAM_SPEC_TYPE_NAME (p), p);
|
||||
else if (G_VALUE_HOLDS_BOXED (value))
|
||||
contents = g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value)), p);
|
||||
else if (G_VALUE_HOLDS_POINTER (value))
|
||||
contents = g_strdup_printf ("((gpointer) %p)", p);
|
||||
else
|
||||
contents = g_strdup ("???");
|
||||
}
|
||||
else
|
||||
contents = g_strdup ("???");
|
||||
return contents;
|
||||
}
|
||||
|
||||
static inline void
|
||||
object_set_property (GObject *object,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer,
|
||||
NotifyQueue *nqueue)
|
||||
object_set_property (GObject *object,
|
||||
GParamSpec *pspec,
|
||||
const GValue *value,
|
||||
NotifyQueue *nqueue)
|
||||
{
|
||||
GObjectClass *class;
|
||||
GValue tmp_value = { 0, };
|
||||
GObjectClass *class = g_type_class_peek (pspec->owner_type);
|
||||
|
||||
g_return_if_fail (g_type_is_a (G_OBJECT_TYPE (object), pspec->owner_type)); /* paranoid */
|
||||
/* provide a copy to work from, convert (if necessary) and validate */
|
||||
g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
|
||||
if (!g_value_transform (value, &tmp_value))
|
||||
g_warning ("unable to set property `%s' of type `%s' from value of type `%s'",
|
||||
pspec->name,
|
||||
g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
|
||||
G_VALUE_TYPE_NAME (value));
|
||||
else if (g_param_value_validate (pspec, &tmp_value) && !(pspec->flags & G_PARAM_LAX_VALIDATION))
|
||||
{
|
||||
gchar *contents = g_strdup_value_contents (value);
|
||||
|
||||
class = g_type_class_peek (pspec->owner_type);
|
||||
|
||||
class->set_property (object, PARAM_SPEC_PARAM_ID (pspec), value, pspec, trailer);
|
||||
object_queue_property (object, pspec, nqueue);
|
||||
g_warning ("value <%s> of type `%s' is invalid for property `%s' of type `%s'",
|
||||
contents,
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
pspec->name,
|
||||
g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
|
||||
g_free (contents);
|
||||
}
|
||||
else
|
||||
{
|
||||
class->set_property (object, PARAM_SPEC_PARAM_ID (pspec), &tmp_value, pspec);
|
||||
object_queue_property (object, pspec, nqueue);
|
||||
}
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
|
||||
gpointer
|
||||
@ -765,7 +776,6 @@ g_object_new_valist (GType object_type,
|
||||
name = first_property_name;
|
||||
while (name)
|
||||
{
|
||||
const gchar *trailer = NULL;
|
||||
GValue *value;
|
||||
GParamSpec *pspec;
|
||||
gchar *error = NULL;
|
||||
@ -773,8 +783,7 @@ g_object_new_valist (GType object_type,
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool,
|
||||
name,
|
||||
object_type,
|
||||
TRUE,
|
||||
&trailer);
|
||||
TRUE);
|
||||
if (!pspec)
|
||||
{
|
||||
g_warning ("%s: object class `%s' has no property named `%s'",
|
||||
@ -814,7 +823,6 @@ g_object_new_valist (GType object_type,
|
||||
cparams = g_renew (GObjectConstructParam, cparams, MAX (n_cparams + 1, PREALLOC_CPARAMS));
|
||||
cparams[n_cparams].pspec = pspec;
|
||||
cparams[n_cparams].value = value;
|
||||
cparams[n_cparams].trailer = trailer;
|
||||
for (i = 0; i < n_cparams; i++) /* picky, aren't we? ;) */
|
||||
if (cparams[i].pspec == pspec)
|
||||
g_warning (G_STRLOC ": construct property \"%s\" for object `%s' is being set twice",
|
||||
@ -828,7 +836,6 @@ g_object_new_valist (GType object_type,
|
||||
nparams = g_renew (GObjectConstructParam, nparams, MAX (n_nparams + 1, PREALLOC_CPARAMS));
|
||||
nparams[n_nparams].pspec = pspec;
|
||||
nparams[n_nparams].value = value;
|
||||
nparams[n_nparams].trailer = trailer;
|
||||
n_nparams++;
|
||||
}
|
||||
|
||||
@ -850,7 +857,6 @@ g_object_new_valist (GType object_type,
|
||||
cparams = g_renew (GObjectConstructParam, cparams, MAX (n_cparams + 1, PREALLOC_CPARAMS));
|
||||
cparams[n_cparams].pspec = pspec;
|
||||
cparams[n_cparams].value = value;
|
||||
cparams[n_cparams].trailer = NULL;
|
||||
n_cparams++;
|
||||
|
||||
g_slist_free_1 (clist);
|
||||
@ -876,28 +882,9 @@ g_object_new_valist (GType object_type,
|
||||
{
|
||||
GValue *value = nparams->value;
|
||||
GParamSpec *pspec = nparams->pspec;
|
||||
const gchar *trailer = nparams++->trailer;
|
||||
|
||||
/* convert if necessary */
|
||||
if (!g_type_is_a (G_VALUE_TYPE (value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
|
||||
{
|
||||
GValue tmp_value = { 0, };
|
||||
|
||||
g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
|
||||
if (!g_value_convert (value, &tmp_value) ||
|
||||
g_param_value_validate (pspec, &tmp_value))
|
||||
g_warning ("%s: cannot convert `%s' value to property `%s' value of type `%s'",
|
||||
G_STRLOC,
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
pspec->name,
|
||||
g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
|
||||
else
|
||||
object_set_property (object, &tmp_value, pspec, trailer, nqueue);
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
else
|
||||
object_set_property (object, value, pspec, trailer, nqueue);
|
||||
|
||||
nparams++;
|
||||
object_set_property (object, pspec, value, nqueue);
|
||||
g_value_unset (value);
|
||||
g_free (value);
|
||||
}
|
||||
@ -931,27 +918,9 @@ g_object_constructor (GType type,
|
||||
{
|
||||
GValue *value = construct_params->value;
|
||||
GParamSpec *pspec = construct_params->pspec;
|
||||
const gchar *trailer = construct_params++->trailer;
|
||||
|
||||
/* convert if necessary */
|
||||
if (!g_type_is_a (G_VALUE_TYPE (value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
|
||||
{
|
||||
GValue tmp_value = { 0, };
|
||||
|
||||
g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
|
||||
if (!g_value_convert (value, &tmp_value) ||
|
||||
g_param_value_validate (pspec, &tmp_value))
|
||||
g_warning ("%s: cannot convert `%s' value to property `%s' value of type `%s'",
|
||||
G_STRLOC,
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
pspec->name,
|
||||
g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
|
||||
else
|
||||
object_set_property (object, &tmp_value, pspec, trailer, nqueue);
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
else
|
||||
object_set_property (object, value, pspec, trailer, nqueue);
|
||||
construct_params++;
|
||||
object_set_property (object, pspec, value, nqueue);
|
||||
}
|
||||
nqueue->freeze_count--;
|
||||
/* the notification queue is still frozen from g_object_init(), so
|
||||
@ -979,7 +948,6 @@ g_object_set_valist (GObject *object,
|
||||
name = first_property_name;
|
||||
while (name)
|
||||
{
|
||||
const gchar *trailer = NULL;
|
||||
GValue value = { 0, };
|
||||
GParamSpec *pspec;
|
||||
gchar *error = NULL;
|
||||
@ -987,8 +955,7 @@ g_object_set_valist (GObject *object,
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool,
|
||||
name,
|
||||
G_OBJECT_TYPE (object),
|
||||
TRUE,
|
||||
&trailer);
|
||||
TRUE);
|
||||
if (!pspec)
|
||||
{
|
||||
g_warning ("%s: object class `%s' has no property named `%s'",
|
||||
@ -1020,8 +987,7 @@ g_object_set_valist (GObject *object,
|
||||
break;
|
||||
}
|
||||
|
||||
object_set_property (object, &value, pspec, trailer, nqueue);
|
||||
|
||||
object_set_property (object, pspec, &value, nqueue);
|
||||
g_value_unset (&value);
|
||||
|
||||
name = va_arg (var_args, gchar*);
|
||||
@ -1046,7 +1012,6 @@ g_object_get_valist (GObject *object,
|
||||
|
||||
while (name)
|
||||
{
|
||||
const gchar *trailer = NULL;
|
||||
GValue value = { 0, };
|
||||
GParamSpec *pspec;
|
||||
gchar *error;
|
||||
@ -1054,8 +1019,7 @@ g_object_get_valist (GObject *object,
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool,
|
||||
name,
|
||||
G_OBJECT_TYPE (object),
|
||||
TRUE,
|
||||
&trailer);
|
||||
TRUE);
|
||||
if (!pspec)
|
||||
{
|
||||
g_warning ("%s: object class `%s' has no property named `%s'",
|
||||
@ -1075,9 +1039,9 @@ g_object_get_valist (GObject *object,
|
||||
|
||||
g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
|
||||
|
||||
object_get_property (object, &value, pspec, trailer);
|
||||
object_get_property (object, pspec, &value);
|
||||
|
||||
G_VALUE_LCOPY (&value, var_args, 0, &error);
|
||||
G_VALUE_LCOPY (&value, var_args, G_VALUE_NOCOPY_CONTENTS, &error);
|
||||
if (error)
|
||||
{
|
||||
g_warning ("%s: %s", G_STRLOC, error);
|
||||
@ -1097,7 +1061,7 @@ g_object_get_valist (GObject *object,
|
||||
g_object_unref (object);
|
||||
}
|
||||
|
||||
void
|
||||
gpointer
|
||||
g_object_set (gpointer _object,
|
||||
const gchar *first_property_name,
|
||||
...)
|
||||
@ -1105,11 +1069,13 @@ g_object_set (gpointer _object,
|
||||
GObject *object = _object;
|
||||
va_list var_args;
|
||||
|
||||
g_return_if_fail (G_IS_OBJECT (object));
|
||||
g_return_val_if_fail (G_IS_OBJECT (object), NULL);
|
||||
|
||||
va_start (var_args, first_property_name);
|
||||
g_object_set_valist (object, first_property_name, var_args);
|
||||
va_end (var_args);
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
void
|
||||
@ -1134,7 +1100,6 @@ g_object_set_property (GObject *object,
|
||||
{
|
||||
NotifyQueue *nqueue;
|
||||
GParamSpec *pspec;
|
||||
const gchar *trailer;
|
||||
|
||||
g_return_if_fail (G_IS_OBJECT (object));
|
||||
g_return_if_fail (property_name != NULL);
|
||||
@ -1146,32 +1111,13 @@ g_object_set_property (GObject *object,
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool,
|
||||
property_name,
|
||||
G_OBJECT_TYPE (object),
|
||||
TRUE,
|
||||
&trailer);
|
||||
TRUE);
|
||||
if (!pspec)
|
||||
g_warning ("%s: object class `%s' has no property named `%s'",
|
||||
G_STRLOC,
|
||||
g_warning ("object class `%s' has no property named `%s'",
|
||||
G_OBJECT_TYPE_NAME (object),
|
||||
property_name);
|
||||
else
|
||||
{
|
||||
GValue tmp_value = { 0, };
|
||||
|
||||
/* provide a copy to work from and convert if necessary */
|
||||
g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
|
||||
|
||||
if (!g_value_convert (value, &tmp_value) ||
|
||||
g_param_value_validate (pspec, &tmp_value))
|
||||
g_warning ("%s: cannot convert `%s' value to property `%s' value of type `%s'",
|
||||
G_STRLOC,
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
pspec->name,
|
||||
g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
|
||||
else
|
||||
object_set_property (object, &tmp_value, pspec, trailer, nqueue);
|
||||
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
object_set_property (object, pspec, value, nqueue);
|
||||
|
||||
object_thaw_notifies (object, nqueue);
|
||||
g_object_unref (object);
|
||||
@ -1183,7 +1129,6 @@ g_object_get_property (GObject *object,
|
||||
GValue *value)
|
||||
{
|
||||
GParamSpec *pspec;
|
||||
const gchar *trailer;
|
||||
|
||||
g_return_if_fail (G_IS_OBJECT (object));
|
||||
g_return_if_fail (property_name != NULL);
|
||||
@ -1194,44 +1139,140 @@ g_object_get_property (GObject *object,
|
||||
pspec = g_param_spec_pool_lookup (pspec_pool,
|
||||
property_name,
|
||||
G_OBJECT_TYPE (object),
|
||||
TRUE,
|
||||
&trailer);
|
||||
TRUE);
|
||||
if (!pspec)
|
||||
g_warning ("%s: object class `%s' has no property named `%s'",
|
||||
G_STRLOC,
|
||||
g_warning ("object class `%s' has no property named `%s'",
|
||||
G_OBJECT_TYPE_NAME (object),
|
||||
property_name);
|
||||
else
|
||||
{
|
||||
GValue tmp_value = { 0, };
|
||||
GValue *prop_value, tmp_value = { 0, };
|
||||
|
||||
/* provide a copy to work from and later convert if necessary, so
|
||||
* _get_property() implementations need *not* care about freeing values
|
||||
* that might be already set in the property to get.
|
||||
* (though, at this point, GValue should exclusively be modified
|
||||
* through the accessor functions anyways)
|
||||
/* auto-conversion of the callers value type
|
||||
*/
|
||||
g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
|
||||
|
||||
if (!g_value_types_exchangable (G_VALUE_TYPE (value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
|
||||
g_warning ("%s: can't retrive property `%s' value of type `%s' as value of type `%s'",
|
||||
G_STRLOC,
|
||||
pspec->name,
|
||||
g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
|
||||
G_VALUE_TYPE_NAME (value));
|
||||
if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec))
|
||||
{
|
||||
g_value_reset (value);
|
||||
prop_value = value;
|
||||
}
|
||||
else if (!g_value_type_transformable (G_PARAM_SPEC_VALUE_TYPE (pspec), G_VALUE_TYPE (value)))
|
||||
{
|
||||
g_warning ("can't retrive property `%s' of type `%s' as value of type `%s'",
|
||||
pspec->name,
|
||||
g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
|
||||
G_VALUE_TYPE_NAME (value));
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
object_get_property (object, &tmp_value, pspec, trailer);
|
||||
g_value_convert (&tmp_value, value);
|
||||
/* g_value_validate (value, pspec); */
|
||||
g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
|
||||
prop_value = &tmp_value;
|
||||
}
|
||||
object_get_property (object, pspec, prop_value);
|
||||
if (prop_value != value)
|
||||
{
|
||||
g_value_transform (prop_value, value);
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
|
||||
g_object_unref (object);
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_object_connect (gpointer _object,
|
||||
const gchar *signal_spec,
|
||||
...)
|
||||
{
|
||||
GObject *object = _object;
|
||||
va_list var_args;
|
||||
|
||||
g_return_val_if_fail (G_IS_OBJECT (object), NULL);
|
||||
g_return_val_if_fail (object->ref_count > 0, object);
|
||||
|
||||
va_start (var_args, signal_spec);
|
||||
while (signal_spec)
|
||||
{
|
||||
gpointer callback = va_arg (var_args, gpointer);
|
||||
gpointer data = va_arg (var_args, gpointer);
|
||||
guint sid;
|
||||
|
||||
if (strncmp (signal_spec, "signal::", 8) == 0)
|
||||
sid = g_signal_connect_data (object, signal_spec + 8,
|
||||
callback, data, NULL,
|
||||
FALSE, FALSE);
|
||||
else if (strncmp (signal_spec, "swapped_signal::", 16) == 0)
|
||||
sid = g_signal_connect_data (object, signal_spec + 16,
|
||||
callback, data, NULL,
|
||||
TRUE, FALSE);
|
||||
else if (strncmp (signal_spec, "signal_after::", 14) == 0)
|
||||
sid = g_signal_connect_data (object, signal_spec + 14,
|
||||
callback, data, NULL,
|
||||
FALSE, TRUE);
|
||||
else if (strncmp (signal_spec, "swapped_signal_after::", 22) == 0)
|
||||
sid = g_signal_connect_data (object, signal_spec + 22,
|
||||
callback, data, NULL,
|
||||
TRUE, TRUE);
|
||||
else
|
||||
{
|
||||
g_warning ("%s: invalid signal spec \"%s\"", G_STRLOC, signal_spec);
|
||||
break;
|
||||
}
|
||||
signal_spec = va_arg (var_args, gchar*);
|
||||
}
|
||||
va_end (var_args);
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_object_disconnect (gpointer _object,
|
||||
const gchar *signal_spec,
|
||||
...)
|
||||
{
|
||||
GObject *object = _object;
|
||||
va_list var_args;
|
||||
|
||||
g_return_val_if_fail (G_IS_OBJECT (object), NULL);
|
||||
g_return_val_if_fail (object->ref_count > 0, object);
|
||||
|
||||
va_start (var_args, signal_spec);
|
||||
while (signal_spec)
|
||||
{
|
||||
gpointer callback = va_arg (var_args, gpointer);
|
||||
gpointer data = va_arg (var_args, gpointer);
|
||||
guint sid = 0, detail = 0, mask = 0;
|
||||
|
||||
if (strncmp (signal_spec, "any_signal::", 12) == 0)
|
||||
{
|
||||
signal_spec += 12;
|
||||
mask = G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;
|
||||
}
|
||||
else if (strcmp (signal_spec, "any_signal") == 0)
|
||||
{
|
||||
signal_spec += 10;
|
||||
mask = G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("%s: invalid signal spec \"%s\"", G_STRLOC, signal_spec);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((mask & G_SIGNAL_MATCH_ID) &&
|
||||
!g_signal_parse_name (signal_spec, G_OBJECT_TYPE (object), &sid, &detail, FALSE))
|
||||
g_warning ("%s: invalid signal name \"%s\"", G_STRLOC, signal_spec);
|
||||
else if (!g_signal_handlers_disconnect_matched (object, mask | (detail ? G_SIGNAL_MATCH_DETAIL : 0),
|
||||
sid, detail,
|
||||
NULL, callback, data))
|
||||
g_warning (G_STRLOC ": signal handler %p(%p) is not connected", callback, data);
|
||||
signal_spec = va_arg (var_args, gchar*);
|
||||
}
|
||||
va_end (var_args);
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_object_ref (gpointer _object)
|
||||
{
|
||||
@ -1385,6 +1426,16 @@ g_value_object_copy_value (const GValue *src_value,
|
||||
dest_value->data[0].v_pointer = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
g_value_object_transform_value (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
if (src_value->data[0].v_pointer && g_type_is_a (G_OBJECT_TYPE (src_value->data[0].v_pointer), G_VALUE_TYPE (dest_value)))
|
||||
dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer);
|
||||
else
|
||||
dest_value->data[0].v_pointer = NULL;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
g_value_object_peek_pointer (const GValue *value)
|
||||
{
|
||||
@ -1406,13 +1457,14 @@ g_value_object_collect_value (GValue *value,
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
"'",
|
||||
NULL);
|
||||
else if (!g_type_is_a (G_OBJECT_TYPE (object), G_VALUE_TYPE (value)))
|
||||
else if (!g_value_type_compatible (G_OBJECT_TYPE (object), G_VALUE_TYPE (value)))
|
||||
return g_strconcat ("invalid object type `",
|
||||
G_OBJECT_TYPE_NAME (object),
|
||||
"' for value type `",
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
"'",
|
||||
NULL);
|
||||
/* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */
|
||||
value->data[0].v_pointer = g_object_ref (object);
|
||||
}
|
||||
else
|
||||
@ -1446,7 +1498,7 @@ void
|
||||
g_value_set_object (GValue *value,
|
||||
GObject *v_object)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_OBJECT (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
|
||||
|
||||
if (value->data[0].v_pointer)
|
||||
{
|
||||
@ -1457,17 +1509,17 @@ g_value_set_object (GValue *value,
|
||||
if (v_object)
|
||||
{
|
||||
g_return_if_fail (G_IS_OBJECT (v_object));
|
||||
g_return_if_fail (g_type_is_a (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
|
||||
g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
|
||||
|
||||
value->data[0].v_pointer = v_object;
|
||||
g_object_ref (value->data[0].v_pointer);
|
||||
}
|
||||
}
|
||||
|
||||
GObject*
|
||||
gpointer
|
||||
g_value_get_object (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_OBJECT (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL);
|
||||
|
||||
return value->data[0].v_pointer;
|
||||
}
|
||||
@ -1475,7 +1527,7 @@ g_value_get_object (const GValue *value)
|
||||
GObject*
|
||||
g_value_dup_object (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_OBJECT (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL);
|
||||
|
||||
return value->data[0].v_pointer ? g_object_ref (value->data[0].v_pointer) : NULL;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -31,17 +31,17 @@ extern "C" {
|
||||
|
||||
|
||||
/* --- type macros --- */
|
||||
#define G_TYPE_IS_OBJECT(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)
|
||||
#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
|
||||
#define G_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
|
||||
#define G_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))
|
||||
#define G_IS_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))
|
||||
#define G_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
|
||||
#define G_OBJECT_TYPE(object) (G_TYPE_FROM_INSTANCE (object))
|
||||
#define G_OBJECT_TYPE_NAME(object) (g_type_name (G_OBJECT_TYPE (object)))
|
||||
#define G_OBJECT_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
|
||||
#define G_OBJECT_CLASS_NAME(class) (g_type_name (G_OBJECT_CLASS_TYPE (class)))
|
||||
#define G_IS_VALUE_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT))
|
||||
#define G_TYPE_IS_OBJECT(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)
|
||||
#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
|
||||
#define G_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
|
||||
#define G_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))
|
||||
#define G_IS_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))
|
||||
#define G_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
|
||||
#define G_OBJECT_TYPE(object) (G_TYPE_FROM_INSTANCE (object))
|
||||
#define G_OBJECT_TYPE_NAME(object) (g_type_name (G_OBJECT_TYPE (object)))
|
||||
#define G_OBJECT_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
|
||||
#define G_OBJECT_CLASS_NAME(class) (g_type_name (G_OBJECT_CLASS_TYPE (class)))
|
||||
#define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT))
|
||||
|
||||
|
||||
/* --- typedefs & structures --- */
|
||||
@ -51,13 +51,11 @@ typedef struct _GObjectConstructParam GObjectConstructParam;
|
||||
typedef void (*GObjectGetPropertyFunc) (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer);
|
||||
GParamSpec *pspec);
|
||||
typedef void (*GObjectSetPropertyFunc) (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer);
|
||||
GParamSpec *pspec);
|
||||
typedef void (*GObjectFinalizeFunc) (GObject *object);
|
||||
struct _GObject
|
||||
{
|
||||
@ -83,13 +81,11 @@ struct _GObjectClass
|
||||
void (*set_property) (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer);
|
||||
GParamSpec *pspec);
|
||||
void (*get_property) (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec,
|
||||
const gchar *trailer);
|
||||
GParamSpec *pspec);
|
||||
void (*shutdown) (GObject *object);
|
||||
void (*finalize) (GObject *object);
|
||||
|
||||
@ -109,7 +105,6 @@ struct _GObjectConstructParam
|
||||
{
|
||||
GParamSpec *pspec;
|
||||
GValue *value;
|
||||
const gchar *trailer;
|
||||
};
|
||||
|
||||
|
||||
@ -125,12 +120,18 @@ gpointer g_object_new (GType object_type,
|
||||
gpointer g_object_new_valist (GType object_type,
|
||||
const gchar *first_property_name,
|
||||
va_list var_args);
|
||||
void g_object_set (gpointer object,
|
||||
gpointer g_object_set (gpointer object,
|
||||
const gchar *first_property_name,
|
||||
...);
|
||||
void g_object_get (gpointer object,
|
||||
const gchar *first_property_name,
|
||||
...);
|
||||
gpointer g_object_connect (gpointer object,
|
||||
const gchar *signal_spec,
|
||||
...);
|
||||
gpointer g_object_disconnect (gpointer object,
|
||||
const gchar *signal_spec,
|
||||
...);
|
||||
void g_object_set_valist (GObject *object,
|
||||
const gchar *first_property_name,
|
||||
va_list var_args);
|
||||
@ -181,7 +182,7 @@ GClosure* g_closure_new_object (guint sizeof_closure,
|
||||
GObject *object);
|
||||
void g_value_set_object (GValue *value,
|
||||
GObject *v_object);
|
||||
GObject* g_value_get_object (const GValue *value);
|
||||
gpointer g_value_get_object (const GValue *value);
|
||||
GObject* g_value_dup_object (const GValue *value);
|
||||
guint g_signal_connect_object (gpointer instance,
|
||||
const gchar *detailed_signal,
|
||||
|
112
gobject/gparam.c
112
gobject/gparam.c
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -31,7 +31,7 @@
|
||||
|
||||
/* --- defines --- */
|
||||
#define G_PARAM_SPEC_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_PARAM, GParamSpecClass))
|
||||
#define G_PARAM_USER_MASK ((1 << G_PARAM_USER_SHIFT) - 1)
|
||||
#define G_PARAM_USER_MASK (~0 << G_PARAM_USER_SHIFT)
|
||||
#define PSPEC_APPLIES_TO_VALUE(pspec, value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
|
||||
#define G_SLOCK(mutex) g_static_mutex_lock (mutex)
|
||||
#define G_SUNLOCK(mutex) g_static_mutex_unlock (mutex)
|
||||
@ -49,6 +49,8 @@ static void value_param_init (GValue *value);
|
||||
static void value_param_free_value (GValue *value);
|
||||
static void value_param_copy_value (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
static void value_param_transform_value (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
static gpointer value_param_peek_pointer (const GValue *value);
|
||||
static gchar* value_param_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
@ -104,6 +106,7 @@ g_param_type_init (void) /* sync with gtype.c */
|
||||
|
||||
type = g_type_register_fundamental (G_TYPE_PARAM, "GParam", ¶m_spec_info, &finfo, G_TYPE_FLAG_ABSTRACT);
|
||||
g_assert (type == G_TYPE_PARAM);
|
||||
g_value_register_transform_func (G_TYPE_PARAM, G_TYPE_PARAM, value_param_transform_value);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -345,6 +348,40 @@ g_param_value_validate (GParamSpec *pspec,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_param_value_convert (GParamSpec *pspec,
|
||||
const GValue *src_value,
|
||||
GValue *dest_value,
|
||||
gboolean strict_validation)
|
||||
{
|
||||
GValue tmp_value = { 0, };
|
||||
|
||||
g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), FALSE);
|
||||
g_return_val_if_fail (G_IS_VALUE (src_value), FALSE);
|
||||
g_return_val_if_fail (G_IS_VALUE (dest_value), FALSE);
|
||||
g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, dest_value), FALSE);
|
||||
|
||||
/* better leave dest_value untouched when returning FALSE */
|
||||
|
||||
g_value_init (&tmp_value, G_VALUE_TYPE (dest_value));
|
||||
if (g_value_transform (src_value, &tmp_value) &&
|
||||
(!g_param_value_validate (pspec, &tmp_value) || !strict_validation))
|
||||
{
|
||||
g_value_unset (dest_value);
|
||||
|
||||
/* values are relocatable */
|
||||
memcpy (dest_value, &tmp_value, sizeof (tmp_value));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_value_unset (&tmp_value);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
gint
|
||||
g_param_values_cmp (GParamSpec *pspec,
|
||||
const GValue *value1,
|
||||
@ -386,9 +423,21 @@ static void
|
||||
value_param_copy_value (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_pointer = (src_value->data[0].v_pointer
|
||||
? g_param_spec_ref (src_value->data[0].v_pointer)
|
||||
: NULL);
|
||||
if (src_value->data[0].v_pointer)
|
||||
dest_value->data[0].v_pointer = g_param_spec_ref (src_value->data[0].v_pointer);
|
||||
else
|
||||
dest_value->data[0].v_pointer = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
value_param_transform_value (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
if (src_value->data[0].v_pointer &&
|
||||
g_type_is_a (G_PARAM_SPEC_TYPE (dest_value->data[0].v_pointer), G_VALUE_TYPE (dest_value)))
|
||||
dest_value->data[0].v_pointer = g_param_spec_ref (src_value->data[0].v_pointer);
|
||||
else
|
||||
dest_value->data[0].v_pointer = NULL;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
@ -412,7 +461,7 @@ value_param_collect_value (GValue *value,
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
"'",
|
||||
NULL);
|
||||
else if (!g_type_is_a (G_PARAM_SPEC_TYPE (param), G_VALUE_TYPE (value)))
|
||||
else if (!g_value_type_compatible (G_PARAM_SPEC_TYPE (param), G_VALUE_TYPE (value)))
|
||||
return g_strconcat ("invalid param spec type `",
|
||||
G_PARAM_SPEC_TYPE_NAME (param),
|
||||
"' for value type `",
|
||||
@ -601,8 +650,7 @@ GParamSpec*
|
||||
g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
const gchar *param_name,
|
||||
GType owner_type,
|
||||
gboolean walk_ancestors,
|
||||
const gchar **trailer_p)
|
||||
gboolean walk_ancestors)
|
||||
{
|
||||
GParamSpec *pspec;
|
||||
gchar *delim;
|
||||
@ -615,13 +663,11 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
|
||||
G_SLOCK (&pool->smutex);
|
||||
|
||||
delim = strchr (param_name, ':');
|
||||
delim = pool->type_prefixing ? strchr (param_name, ':') : NULL;
|
||||
|
||||
/* try quick and away, i.e. no prefix, no trailer */
|
||||
/* try quick and away, i.e. without prefix */
|
||||
if (!delim)
|
||||
{
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
@ -645,48 +691,20 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
/* sanity check, these cases don't make a whole lot of sense */
|
||||
if ((!walk_ancestors && type != owner_type) || !g_type_is_a (owner_type, type))
|
||||
{
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
owner_type = type;
|
||||
param_name += l + 2;
|
||||
delim = strchr (param_name, ':');
|
||||
if (!delim) /* good, can still forget about trailer */
|
||||
{
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return pspec;
|
||||
}
|
||||
return pspec;
|
||||
}
|
||||
}
|
||||
|
||||
/* ok, no prefix, handle trailer */
|
||||
if (delim[1] == ':')
|
||||
{
|
||||
guint l = delim - param_name;
|
||||
gchar stack_buffer[32], *buffer = l < 32 ? stack_buffer : g_new (gchar, l + 1);
|
||||
|
||||
strncpy (buffer, param_name, delim - param_name);
|
||||
buffer[l] = 0;
|
||||
pspec = param_spec_ht_lookup (pool->hash_table, buffer, owner_type, walk_ancestors);
|
||||
if (l >= 32)
|
||||
g_free (buffer);
|
||||
if (trailer_p)
|
||||
*trailer_p = pspec ? delim + 2 : NULL;
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return pspec;
|
||||
}
|
||||
|
||||
/* malformed param_name */
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return NULL;
|
||||
@ -784,7 +802,7 @@ void
|
||||
g_value_set_param (GValue *value,
|
||||
GParamSpec *param)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_PARAM (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_PARAM (value));
|
||||
if (param)
|
||||
g_return_if_fail (G_IS_PARAM_SPEC (param));
|
||||
|
||||
@ -798,7 +816,7 @@ g_value_set_param (GValue *value,
|
||||
GParamSpec*
|
||||
g_value_get_param (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_PARAM (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_PARAM (value), NULL);
|
||||
|
||||
return value->data[0].v_pointer;
|
||||
}
|
||||
@ -806,7 +824,7 @@ g_value_get_param (const GValue *value)
|
||||
GParamSpec*
|
||||
g_value_dup_param (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_PARAM (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_PARAM (value), NULL);
|
||||
|
||||
return value->data[0].v_pointer ? g_param_spec_ref (value->data[0].v_pointer) : NULL;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -38,7 +38,7 @@ extern "C" {
|
||||
#define G_IS_PARAM_SPEC(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM))
|
||||
#define G_PARAM_SPEC_GET_CLASS(pspec) (G_TYPE_INSTANCE_GET_CLASS ((pspec), G_TYPE_PARAM, GParamSpecClass))
|
||||
#define G_PARAM_SPEC_VALUE_TYPE(pspec) (G_PARAM_SPEC (pspec)->value_type)
|
||||
#define G_IS_VALUE_PARAM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_PARAM))
|
||||
#define G_VALUE_HOLDS_PARAM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_PARAM))
|
||||
|
||||
|
||||
/* --- flags --- */
|
||||
@ -48,7 +48,8 @@ typedef enum
|
||||
G_PARAM_WRITABLE = 1 << 1,
|
||||
G_PARAM_CONSTRUCT = 1 << 2,
|
||||
G_PARAM_CONSTRUCT_ONLY = 1 << 3,
|
||||
G_PARAM_PRIVATE = 1 << 4
|
||||
G_PARAM_LAX_VALIDATION = 1 << 4,
|
||||
G_PARAM_PRIVATE = 1 << 5
|
||||
} GParamFlags;
|
||||
#define G_PARAM_READWRITE (G_PARAM_READABLE | G_PARAM_WRITABLE)
|
||||
#define G_PARAM_MASK (0x000000ff)
|
||||
@ -115,6 +116,10 @@ gboolean g_param_value_defaults (GParamSpec *pspec,
|
||||
GValue *value);
|
||||
gboolean g_param_value_validate (GParamSpec *pspec,
|
||||
GValue *value);
|
||||
gboolean g_param_value_convert (GParamSpec *dest_value_spec,
|
||||
const GValue *src_value,
|
||||
GValue *dest_value,
|
||||
gboolean strict_validation);
|
||||
gint g_param_values_cmp (GParamSpec *pspec,
|
||||
const GValue *value1,
|
||||
const GValue *value2);
|
||||
@ -163,8 +168,7 @@ void g_param_spec_pool_remove (GParamSpecPool *pool,
|
||||
GParamSpec* g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
const gchar *param_name,
|
||||
GType owner_type,
|
||||
gboolean walk_ancestors,
|
||||
const gchar **trailer_p);
|
||||
gboolean walk_ancestors);
|
||||
|
||||
|
||||
/* contracts:
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -34,63 +34,63 @@ extern "C" {
|
||||
|
||||
|
||||
/* --- type macros --- */
|
||||
#define G_IS_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CHAR))
|
||||
#define G_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CHAR, GParamSpecChar))
|
||||
#define G_IS_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UCHAR))
|
||||
#define G_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UCHAR, GParamSpecUChar))
|
||||
#define G_IS_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
|
||||
#define G_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOOLEAN, GParamSpecBoolean))
|
||||
#define G_IS_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
|
||||
#define G_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT, GParamSpecInt))
|
||||
#define G_IS_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT))
|
||||
#define G_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT, GParamSpecUInt))
|
||||
#define G_IS_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_LONG))
|
||||
#define G_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong))
|
||||
#define G_IS_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG))
|
||||
#define G_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong))
|
||||
#define G_IS_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
|
||||
#define G_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ENUM, GParamSpecEnum))
|
||||
#define G_IS_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
|
||||
#define G_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLAGS, GParamSpecFlags))
|
||||
#define G_IS_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLOAT))
|
||||
#define G_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLOAT, GParamSpecFloat))
|
||||
#define G_IS_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
|
||||
#define G_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_DOUBLE, GParamSpecDouble))
|
||||
#define G_IS_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
|
||||
#define G_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_STRING, GParamSpecString))
|
||||
#define G_IS_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_PARAM))
|
||||
#define G_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_PARAM, GParamSpecParam))
|
||||
#define G_IS_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
|
||||
#define G_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_POINTER, GParamSpecPointer))
|
||||
#define G_IS_PARAM_SPEC_CCALLBACK(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CCALLBACK))
|
||||
#define G_PARAM_SPEC_CCALLBACK(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CCALLBACK, GParamSpecCCallback))
|
||||
#define G_IS_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
|
||||
#define G_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOXED, GParamSpecBoxed))
|
||||
#define G_IS_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
|
||||
#define G_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OBJECT, GParamSpecObject))
|
||||
#define G_IS_PARAM_SPEC_INTERFACE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INTERFACE))
|
||||
#define G_PARAM_SPEC_INTERFACE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INTERFACE, GParamSpecInterface))
|
||||
#define G_IS_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CHAR))
|
||||
#define G_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CHAR, GParamSpecChar))
|
||||
#define G_IS_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UCHAR))
|
||||
#define G_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UCHAR, GParamSpecUChar))
|
||||
#define G_IS_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
|
||||
#define G_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOOLEAN, GParamSpecBoolean))
|
||||
#define G_IS_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
|
||||
#define G_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT, GParamSpecInt))
|
||||
#define G_IS_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT))
|
||||
#define G_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT, GParamSpecUInt))
|
||||
#define G_IS_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_LONG))
|
||||
#define G_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong))
|
||||
#define G_IS_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG))
|
||||
#define G_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong))
|
||||
#define G_IS_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
|
||||
#define G_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ENUM, GParamSpecEnum))
|
||||
#define G_IS_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
|
||||
#define G_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLAGS, GParamSpecFlags))
|
||||
#define G_IS_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLOAT))
|
||||
#define G_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLOAT, GParamSpecFloat))
|
||||
#define G_IS_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
|
||||
#define G_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_DOUBLE, GParamSpecDouble))
|
||||
#define G_IS_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
|
||||
#define G_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_STRING, GParamSpecString))
|
||||
#define G_IS_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_PARAM))
|
||||
#define G_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_PARAM, GParamSpecParam))
|
||||
#define G_IS_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
|
||||
#define G_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOXED, GParamSpecBoxed))
|
||||
#define G_IS_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
|
||||
#define G_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_POINTER, GParamSpecPointer))
|
||||
#define G_IS_PARAM_SPEC_VALUE_ARRAY(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_VALUE_ARRAY))
|
||||
#define G_PARAM_SPEC_VALUE_ARRAY(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_VALUE_ARRAY, GParamSpecValueArray))
|
||||
#define G_IS_PARAM_SPEC_CLOSURE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CLOSURE))
|
||||
#define G_PARAM_SPEC_CLOSURE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CLOSURE, GParamSpecClosure))
|
||||
#define G_IS_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
|
||||
#define G_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OBJECT, GParamSpecObject))
|
||||
|
||||
|
||||
/* --- typedefs & structures --- */
|
||||
typedef struct _GParamSpecChar GParamSpecChar;
|
||||
typedef struct _GParamSpecUChar GParamSpecUChar;
|
||||
typedef struct _GParamSpecBoolean GParamSpecBoolean;
|
||||
typedef struct _GParamSpecInt GParamSpecInt;
|
||||
typedef struct _GParamSpecUInt GParamSpecUInt;
|
||||
typedef struct _GParamSpecLong GParamSpecLong;
|
||||
typedef struct _GParamSpecULong GParamSpecULong;
|
||||
typedef struct _GParamSpecEnum GParamSpecEnum;
|
||||
typedef struct _GParamSpecFlags GParamSpecFlags;
|
||||
typedef struct _GParamSpecFloat GParamSpecFloat;
|
||||
typedef struct _GParamSpecDouble GParamSpecDouble;
|
||||
typedef struct _GParamSpecString GParamSpecString;
|
||||
typedef struct _GParamSpecParam GParamSpecParam;
|
||||
typedef struct _GParamSpecPointer GParamSpecPointer;
|
||||
typedef struct _GParamSpecCCallback GParamSpecCCallback;
|
||||
typedef struct _GParamSpecBoxed GParamSpecBoxed;
|
||||
typedef struct _GParamSpecObject GParamSpecObject;
|
||||
typedef struct _GParamSpecInterface GParamSpecInterface;
|
||||
typedef struct _GParamSpecChar GParamSpecChar;
|
||||
typedef struct _GParamSpecUChar GParamSpecUChar;
|
||||
typedef struct _GParamSpecBoolean GParamSpecBoolean;
|
||||
typedef struct _GParamSpecInt GParamSpecInt;
|
||||
typedef struct _GParamSpecUInt GParamSpecUInt;
|
||||
typedef struct _GParamSpecLong GParamSpecLong;
|
||||
typedef struct _GParamSpecULong GParamSpecULong;
|
||||
typedef struct _GParamSpecEnum GParamSpecEnum;
|
||||
typedef struct _GParamSpecFlags GParamSpecFlags;
|
||||
typedef struct _GParamSpecFloat GParamSpecFloat;
|
||||
typedef struct _GParamSpecDouble GParamSpecDouble;
|
||||
typedef struct _GParamSpecString GParamSpecString;
|
||||
typedef struct _GParamSpecParam GParamSpecParam;
|
||||
typedef struct _GParamSpecBoxed GParamSpecBoxed;
|
||||
typedef struct _GParamSpecPointer GParamSpecPointer;
|
||||
typedef struct _GParamSpecValueArray GParamSpecValueArray;
|
||||
typedef struct _GParamSpecClosure GParamSpecClosure;
|
||||
typedef struct _GParamSpecObject GParamSpecObject;
|
||||
struct _GParamSpecChar
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
@ -192,15 +192,21 @@ struct _GParamSpecParam
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
};
|
||||
struct _GParamSpecBoxed
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
};
|
||||
struct _GParamSpecPointer
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
};
|
||||
struct _GParamSpecCCallback
|
||||
struct _GParamSpecValueArray
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
GParamSpec *element_spec;
|
||||
guint fixed_n_elements;
|
||||
};
|
||||
struct _GParamSpecBoxed
|
||||
struct _GParamSpecClosure
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
};
|
||||
@ -208,124 +214,120 @@ struct _GParamSpecObject
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
};
|
||||
struct _GParamSpecInterface
|
||||
{
|
||||
GParamSpec parent_instance;
|
||||
};
|
||||
|
||||
|
||||
/* --- GParamSpec prototypes --- */
|
||||
GParamSpec* g_param_spec_char (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gint8 minimum,
|
||||
gint8 maximum,
|
||||
gint8 default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_uchar (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
guint8 minimum,
|
||||
guint8 maximum,
|
||||
guint8 default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_boolean (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gboolean default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_int (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gint minimum,
|
||||
gint maximum,
|
||||
gint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_uint (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
guint minimum,
|
||||
guint maximum,
|
||||
guint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_long (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
glong minimum,
|
||||
glong maximum,
|
||||
glong default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_ulong (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gulong minimum,
|
||||
gulong maximum,
|
||||
gulong default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_enum (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType enum_type,
|
||||
gint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_flags (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType flags_type,
|
||||
guint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_float (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gfloat minimum,
|
||||
gfloat maximum,
|
||||
gfloat default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_double (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gdouble minimum,
|
||||
gdouble maximum,
|
||||
gdouble default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_string (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
const gchar *default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_string_c (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
const gchar *default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_param (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType param_type,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_pointer (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_ccallback (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_boxed (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType boxed_type,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_object (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType object_type,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_interface (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType object_type,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_char (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gint8 minimum,
|
||||
gint8 maximum,
|
||||
gint8 default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_uchar (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
guint8 minimum,
|
||||
guint8 maximum,
|
||||
guint8 default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_boolean (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gboolean default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_int (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gint minimum,
|
||||
gint maximum,
|
||||
gint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_uint (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
guint minimum,
|
||||
guint maximum,
|
||||
guint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_long (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
glong minimum,
|
||||
glong maximum,
|
||||
glong default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_ulong (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gulong minimum,
|
||||
gulong maximum,
|
||||
gulong default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_enum (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType enum_type,
|
||||
gint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_flags (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType flags_type,
|
||||
guint default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_float (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gfloat minimum,
|
||||
gfloat maximum,
|
||||
gfloat default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_double (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
gdouble minimum,
|
||||
gdouble maximum,
|
||||
gdouble default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_string (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
const gchar *default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_string_c (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
const gchar *default_value,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_param (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType param_type,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_boxed (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType boxed_type,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_pointer (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_value_array (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GParamSpec *element_spec,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_closure (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GParamFlags flags);
|
||||
GParamSpec* g_param_spec_object (const gchar *name,
|
||||
const gchar *nick,
|
||||
const gchar *blurb,
|
||||
GType object_type,
|
||||
GParamFlags flags);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* Copyright (C) 2000-2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -774,6 +774,7 @@ g_signal_parse_name (const gchar *detailed_signal,
|
||||
GQuark *detail_p,
|
||||
gboolean force_detail_quark)
|
||||
{
|
||||
SignalNode *node;
|
||||
GQuark detail = 0;
|
||||
guint signal_id;
|
||||
|
||||
@ -784,17 +785,17 @@ g_signal_parse_name (const gchar *detailed_signal,
|
||||
signal_id = signal_parse_name (detailed_signal, itype, &detail, force_detail_quark);
|
||||
G_UNLOCK (g_signal_mutex);
|
||||
|
||||
if (signal_id)
|
||||
{
|
||||
if (signal_id_p)
|
||||
*signal_id_p = signal_id;
|
||||
if (detail_p)
|
||||
*detail_p = detail;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
node = signal_id ? LOOKUP_SIGNAL_NODE (signal_id) : NULL;
|
||||
if (!node || node->destroyed ||
|
||||
(detail && !(node->flags & G_SIGNAL_DETAILED)))
|
||||
return FALSE;
|
||||
|
||||
if (signal_id_p)
|
||||
*signal_id_p = signal_id;
|
||||
if (detail_p)
|
||||
*detail_p = detail;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
guint
|
||||
@ -1000,9 +1001,7 @@ g_signal_newv (const gchar *signal_name,
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < n_params; i++)
|
||||
if (!G_TYPE_IS_VALUE (param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE) ||
|
||||
(param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE) == G_TYPE_ENUM ||
|
||||
(param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE) == G_TYPE_FLAGS) /* FIXME: kludge */
|
||||
if (!G_TYPE_IS_VALUE (param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE))
|
||||
{
|
||||
g_warning (G_STRLOC ": parameter %d of type `%s' for signal \"%s::%s\" is not a value type",
|
||||
i + 1, g_type_name (param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE), g_type_name (itype), name);
|
||||
@ -1537,7 +1536,7 @@ g_signal_emitv (const GValue *instance_and_params,
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (instance_and_params != NULL);
|
||||
instance = g_value_get_as_pointer (instance_and_params);
|
||||
instance = g_value_peek_pointer (instance_and_params);
|
||||
g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
|
||||
g_return_if_fail (signal_id > 0);
|
||||
|
||||
@ -1559,7 +1558,7 @@ g_signal_emitv (const GValue *instance_and_params,
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < node->n_params; i++)
|
||||
if (!G_VALUE_HOLDS (param_values + i, node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE))
|
||||
if (!G_TYPE_CHECK_VALUE_TYPE (param_values + i, node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE))
|
||||
{
|
||||
g_critical ("%s: value for `%s' parameter %u for signal \"%s\" is of type `%s'",
|
||||
G_STRLOC,
|
||||
@ -1581,7 +1580,7 @@ g_signal_emitv (const GValue *instance_and_params,
|
||||
G_UNLOCK (g_signal_mutex);
|
||||
return;
|
||||
}
|
||||
else if (!node->accumulator && !G_VALUE_HOLDS (return_value, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE))
|
||||
else if (!node->accumulator && !G_TYPE_CHECK_VALUE_TYPE (return_value, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE))
|
||||
{
|
||||
g_critical ("%s: return value `%s' for signal \"%s\" is of type `%s'",
|
||||
G_STRLOC,
|
||||
@ -2045,4 +2044,7 @@ signal_emit_R (SignalNode *node,
|
||||
|
||||
/* --- compile standard marshallers --- */
|
||||
#include "gvaluetypes.h"
|
||||
#include "gobject.h"
|
||||
#include "genums.h"
|
||||
#include "gboxed.h"
|
||||
#include "gmarshal.c"
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* Copyright (C) 2000-2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
175
gobject/gtype.c
175
gobject/gtype.c
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -74,6 +74,16 @@ static GStaticRWLock type_rw_lock = G_STATIC_RW_LOCK_INIT;
|
||||
else \
|
||||
g_error ("%s()%s`%s'", _fname, _action, _tname); \
|
||||
}G_STMT_END
|
||||
#define g_return_val_if_uninitialized(condition, init_function, return_value) G_STMT_START{ \
|
||||
if (!(condition)) \
|
||||
{ \
|
||||
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \
|
||||
"%s: initialization assertion failed, use %s() prior to this function", \
|
||||
G_STRLOC, G_STRINGIFY (init_function)); \
|
||||
return (return_value); \
|
||||
} \
|
||||
}G_STMT_END
|
||||
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
#define DEBUG_CODE(debug_type, code_block) G_STMT_START { \
|
||||
if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) \
|
||||
@ -87,7 +97,7 @@ static GStaticRWLock type_rw_lock = G_STATIC_RW_LOCK_INIT;
|
||||
G_TYPE_FLAG_INSTANTIATABLE | \
|
||||
G_TYPE_FLAG_DERIVABLE | \
|
||||
G_TYPE_FLAG_DEEP_DERIVABLE)
|
||||
#define TYPE_FLAG_MASK (G_TYPE_FLAG_ABSTRACT)
|
||||
#define TYPE_FLAG_MASK (G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT)
|
||||
|
||||
|
||||
/* --- typedefs --- */
|
||||
@ -811,7 +821,15 @@ type_data_make_W (TypeNode *node,
|
||||
}
|
||||
}
|
||||
if (value_table)
|
||||
vtable_size = sizeof (GTypeValueTable);
|
||||
{
|
||||
/* need to setup vtable_size since we have to allocate it with data in one chunk */
|
||||
vtable_size = sizeof (GTypeValueTable);
|
||||
if (value_table->collect_format)
|
||||
vtable_size += strlen (value_table->collect_format);
|
||||
if (value_table->lcopy_format)
|
||||
vtable_size += strlen (value_table->lcopy_format);
|
||||
vtable_size += 2;
|
||||
}
|
||||
|
||||
if (node->is_instantiatable) /* carefull, is_instantiatable is also is_classed */
|
||||
{
|
||||
@ -868,9 +886,26 @@ type_data_make_W (TypeNode *node,
|
||||
|
||||
if (vtable_size)
|
||||
{
|
||||
gchar *p;
|
||||
|
||||
/* we allocate the vtable and its strings together with the type data, so
|
||||
* children can take over their parent's vtable pointer, and we don't
|
||||
* need to worry freeing it or not when the child data is destroyed
|
||||
*/
|
||||
*vtable = *value_table;
|
||||
vtable->collect_format = g_strdup (value_table->collect_format ? value_table->collect_format : "");
|
||||
vtable->lcopy_format = g_strdup (value_table->lcopy_format ? value_table->lcopy_format : "");
|
||||
p = G_STRUCT_MEMBER_P (vtable, sizeof (*vtable));
|
||||
p[0] = 0;
|
||||
vtable->collect_format = p;
|
||||
if (value_table->collect_format)
|
||||
{
|
||||
strcat (p, value_table->collect_format);
|
||||
p += strlen (value_table->collect_format);
|
||||
}
|
||||
p++;
|
||||
p[0] = 0;
|
||||
vtable->lcopy_format = p;
|
||||
if (value_table->lcopy_format)
|
||||
strcat (p, value_table->lcopy_format);
|
||||
}
|
||||
node->data->common.value_table = vtable;
|
||||
|
||||
@ -1323,10 +1358,6 @@ type_data_finalize_class_U (TypeNode *node,
|
||||
|
||||
g_assert (cdata->class && cdata->common.ref_count == 0);
|
||||
|
||||
g_message ("finalizing %sClass `%s'",
|
||||
type_descriptive_name_U (G_TYPE_FUNDAMENTAL (NODE_TYPE (node))),
|
||||
type_descriptive_name_U (NODE_TYPE (node)));
|
||||
|
||||
if (cdata->class_finalize)
|
||||
cdata->class_finalize (class, (gpointer) cdata->class_data);
|
||||
|
||||
@ -1415,11 +1446,9 @@ type_data_last_unref_Wm (GType type,
|
||||
else
|
||||
node->data = NULL;
|
||||
|
||||
if (tdata->common.value_table)
|
||||
{
|
||||
g_free (tdata->common.value_table->collect_format);
|
||||
g_free (tdata->common.value_table->lcopy_format);
|
||||
}
|
||||
/* freeing tdata->common.value_table and its contents is taking care of
|
||||
* by allocating it in one chunk with tdata
|
||||
*/
|
||||
g_free (tdata);
|
||||
|
||||
if (ptype)
|
||||
@ -1487,6 +1516,7 @@ g_type_register_fundamental (GType type_id,
|
||||
GTypeFundamentalInfo *node_finfo;
|
||||
TypeNode *node;
|
||||
|
||||
g_return_val_if_uninitialized (static_last_fundamental_id, g_type_init, 0);
|
||||
g_return_val_if_fail (type_id > 0, 0);
|
||||
g_return_val_if_fail (type_name != NULL, 0);
|
||||
g_return_val_if_fail (info != NULL, 0);
|
||||
@ -1539,6 +1569,7 @@ g_type_register_static (GType parent_type,
|
||||
TypeNode *pnode, *node;
|
||||
GType type = 0;
|
||||
|
||||
g_return_val_if_uninitialized (static_last_fundamental_id, g_type_init, 0);
|
||||
g_return_val_if_fail (parent_type > 0, 0);
|
||||
g_return_val_if_fail (type_name != NULL, 0);
|
||||
g_return_val_if_fail (info != NULL, 0);
|
||||
@ -1578,6 +1609,7 @@ g_type_register_dynamic (GType parent_type,
|
||||
TypeNode *pnode, *node;
|
||||
GType type;
|
||||
|
||||
g_return_val_if_uninitialized (static_last_fundamental_id, g_type_init, 0);
|
||||
g_return_val_if_fail (parent_type > 0, 0);
|
||||
g_return_val_if_fail (type_name != NULL, 0);
|
||||
g_return_val_if_fail (plugin != NULL, 0);
|
||||
@ -1800,27 +1832,13 @@ g_type_interface_peek (gpointer instance_class,
|
||||
return vtable;
|
||||
}
|
||||
|
||||
GTypeValueTable*
|
||||
g_type_value_table_peek (GType type)
|
||||
{
|
||||
TypeNode *node;
|
||||
GTypeValueTable *vtable = NULL;
|
||||
|
||||
G_READ_LOCK (&type_rw_lock);
|
||||
node = lookup_type_node_L (type);
|
||||
if (node && node->data && node->data->common.ref_count > 0 &&
|
||||
node->data->common.value_table->value_init)
|
||||
vtable = node->data->common.value_table;
|
||||
G_READ_UNLOCK (&type_rw_lock);
|
||||
|
||||
return vtable;
|
||||
}
|
||||
|
||||
G_CONST_RETURN gchar*
|
||||
g_type_name (GType type)
|
||||
{
|
||||
TypeNode *node;
|
||||
|
||||
g_return_val_if_uninitialized (static_last_fundamental_id, g_type_init, NULL);
|
||||
|
||||
G_READ_LOCK (&type_rw_lock);
|
||||
node = lookup_type_node_L (type);
|
||||
G_READ_UNLOCK (&type_rw_lock);
|
||||
@ -2140,7 +2158,7 @@ type_add_flags_W (TypeNode *node,
|
||||
g_return_if_fail ((flags & ~TYPE_FLAG_MASK) == 0);
|
||||
g_return_if_fail (node != NULL);
|
||||
|
||||
if ((flags & G_TYPE_FLAG_ABSTRACT) && node->is_classed && node->data && node->data->class.class)
|
||||
if ((flags & TYPE_FLAG_MASK) && node->is_classed && node->data && node->data->class.class)
|
||||
g_warning ("tagging type `%s' as abstract after class initialization", NODE_NAME (node));
|
||||
dflags = GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags));
|
||||
dflags |= flags;
|
||||
@ -2261,39 +2279,6 @@ g_type_class_is_a (GTypeClass *type_class,
|
||||
g_type_is_a (type_class->g_type, is_a_type));
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_type_value_is_a (GValue *value,
|
||||
GType type)
|
||||
{
|
||||
TypeNode *node;
|
||||
|
||||
if (!value)
|
||||
return FALSE;
|
||||
|
||||
G_READ_LOCK (&type_rw_lock);
|
||||
node = lookup_type_node_L (value->g_type);
|
||||
#if 0
|
||||
if (!G_TYPE_IS_FUNDAMENTAL (value->g_type) && !node || !node->data)
|
||||
node = lookup_type_node_L (G_TYPE_FUNDAMENTAL (value->g_type));
|
||||
#endif
|
||||
if (!node || !node->data || node->data->common.ref_count < 1 ||
|
||||
!node->data->common.value_table->value_init)
|
||||
{
|
||||
G_READ_UNLOCK (&type_rw_lock);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
G_READ_UNLOCK (&type_rw_lock);
|
||||
|
||||
return g_type_is_a (value->g_type, type);
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_type_check_value (GValue *value)
|
||||
{
|
||||
return value && g_type_value_is_a (value, value->g_type);
|
||||
}
|
||||
|
||||
GTypeInstance*
|
||||
g_type_check_instance_cast (GTypeInstance *type_instance,
|
||||
GType iface_type)
|
||||
@ -2392,6 +2377,57 @@ g_type_check_instance (GTypeInstance *type_instance)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
type_check_is_value_type_U (GType type)
|
||||
{
|
||||
GTypeFlags tflags = G_TYPE_FLAG_VALUE_ABSTRACT;
|
||||
TypeNode *node;
|
||||
|
||||
G_READ_LOCK (&type_rw_lock);
|
||||
node = lookup_type_node_L (type);
|
||||
if (node && node->data && node->data->common.ref_count > 0 &&
|
||||
node->data->common.value_table->value_init)
|
||||
tflags = GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags));
|
||||
G_READ_UNLOCK (&type_rw_lock);
|
||||
|
||||
return !(tflags & G_TYPE_FLAG_VALUE_ABSTRACT);
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_type_check_is_value_type (GType type)
|
||||
{
|
||||
return type_check_is_value_type_U (type);
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_type_check_value (GValue *value)
|
||||
{
|
||||
return value && type_check_is_value_type_U (value->g_type);
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_type_check_value_holds (GValue *value,
|
||||
GType type)
|
||||
{
|
||||
return value && type_check_is_value_type_U (value->g_type) && g_type_is_a (value->g_type, type);
|
||||
}
|
||||
|
||||
GTypeValueTable*
|
||||
g_type_value_table_peek (GType type)
|
||||
{
|
||||
TypeNode *node;
|
||||
GTypeValueTable *vtable = NULL;
|
||||
|
||||
G_READ_LOCK (&type_rw_lock);
|
||||
node = lookup_type_node_L (type);
|
||||
if (node && node->data && node->data->common.ref_count > 0 &&
|
||||
node->data->common.value_table->value_init)
|
||||
vtable = node->data->common.value_table;
|
||||
G_READ_UNLOCK (&type_rw_lock);
|
||||
|
||||
return vtable;
|
||||
}
|
||||
|
||||
|
||||
/* --- foreign prototypes --- */
|
||||
extern void g_value_types_init (void); /* sync with gvaluetypes.c */
|
||||
@ -2400,6 +2436,7 @@ extern void g_param_type_init (void); /* sync with gparam.c */
|
||||
extern void g_boxed_type_init (void); /* sync with gboxed.c */
|
||||
extern void g_object_type_init (void); /* sync with gobject.c */
|
||||
extern void g_param_spec_types_init (void); /* sync with gparamspecs.c */
|
||||
extern void g_value_transforms_init (void); /* sync with gvaluetransform.c */
|
||||
extern void g_signal_init (void); /* sync with gsignal.c */
|
||||
|
||||
|
||||
@ -2483,13 +2520,13 @@ g_type_init (GTypeDebugFlags debug_flags)
|
||||
*/
|
||||
g_enum_types_init ();
|
||||
|
||||
/* G_TYPE_PARAM
|
||||
/* G_TYPE_BOXED
|
||||
*/
|
||||
g_param_type_init ();
|
||||
g_boxed_type_init ();
|
||||
|
||||
/* G_TYPE_PARAM
|
||||
*/
|
||||
g_boxed_type_init ();
|
||||
g_param_type_init ();
|
||||
|
||||
/* G_TYPE_OBJECT
|
||||
*/
|
||||
@ -2499,6 +2536,10 @@ g_type_init (GTypeDebugFlags debug_flags)
|
||||
*/
|
||||
g_param_spec_types_init ();
|
||||
|
||||
/* Value Transformations
|
||||
*/
|
||||
g_value_transforms_init ();
|
||||
|
||||
/* Signal system
|
||||
*/
|
||||
g_signal_init ();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -59,45 +59,39 @@ typedef enum /*< skip >*/
|
||||
G_TYPE_FLOAT,
|
||||
G_TYPE_DOUBLE,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_PARAM,
|
||||
G_TYPE_BOXED,
|
||||
G_TYPE_POINTER,
|
||||
G_TYPE_CCALLBACK,
|
||||
G_TYPE_BOXED,
|
||||
G_TYPE_PARAM,
|
||||
G_TYPE_OBJECT,
|
||||
|
||||
/* the following reserved ids should vanish soon */
|
||||
G_TYPE_GTK_SIGNAL,
|
||||
|
||||
/* reserved fundamental type ids,
|
||||
* mail gtk-devel-list@redhat.com for reservations
|
||||
*/
|
||||
G_TYPE_BSE_PROCEDURE,
|
||||
G_TYPE_BSE_TIME,
|
||||
G_TYPE_BSE_NOTE,
|
||||
G_TYPE_BSE_DOTS,
|
||||
G_TYPE_GLE_GOBJECT,
|
||||
|
||||
G_TYPE_LAST_RESERVED_FUNDAMENTAL,
|
||||
G_TYPE_RESERVED_BSE_FIRST,
|
||||
G_TYPE_RESERVED_BSE_LAST = G_TYPE_RESERVED_BSE_FIRST + 15,
|
||||
G_TYPE_RESERVED_LAST_FUNDAMENTAL,
|
||||
|
||||
/* derived type ids */
|
||||
G_TYPE_PARAM_CHAR = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 1),
|
||||
G_TYPE_PARAM_UCHAR = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 2),
|
||||
G_TYPE_PARAM_BOOLEAN = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 3),
|
||||
G_TYPE_PARAM_INT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 4),
|
||||
G_TYPE_PARAM_UINT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 5),
|
||||
G_TYPE_PARAM_LONG = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 6),
|
||||
G_TYPE_PARAM_ULONG = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 7),
|
||||
G_TYPE_PARAM_ENUM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 8),
|
||||
G_TYPE_PARAM_FLAGS = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 9),
|
||||
G_TYPE_PARAM_FLOAT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 10),
|
||||
G_TYPE_PARAM_DOUBLE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 11),
|
||||
G_TYPE_PARAM_STRING = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 12),
|
||||
G_TYPE_PARAM_PARAM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 13),
|
||||
G_TYPE_PARAM_POINTER = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 14),
|
||||
G_TYPE_PARAM_CCALLBACK = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 15),
|
||||
G_TYPE_PARAM_BOXED = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 16),
|
||||
G_TYPE_PARAM_OBJECT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 17),
|
||||
G_TYPE_PARAM_INTERFACE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 18)
|
||||
G_TYPE_CLOSURE = G_TYPE_DERIVE_ID (G_TYPE_BOXED, 1),
|
||||
G_TYPE_VALUE_ARRAY = G_TYPE_DERIVE_ID (G_TYPE_BOXED, 2),
|
||||
G_TYPE_PARAM_CHAR = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 1),
|
||||
G_TYPE_PARAM_UCHAR = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 2),
|
||||
G_TYPE_PARAM_BOOLEAN = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 3),
|
||||
G_TYPE_PARAM_INT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 4),
|
||||
G_TYPE_PARAM_UINT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 5),
|
||||
G_TYPE_PARAM_LONG = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 6),
|
||||
G_TYPE_PARAM_ULONG = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 7),
|
||||
G_TYPE_PARAM_ENUM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 8),
|
||||
G_TYPE_PARAM_FLAGS = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 9),
|
||||
G_TYPE_PARAM_FLOAT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 10),
|
||||
G_TYPE_PARAM_DOUBLE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 11),
|
||||
G_TYPE_PARAM_STRING = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 12),
|
||||
G_TYPE_PARAM_PARAM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 13),
|
||||
G_TYPE_PARAM_BOXED = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 14),
|
||||
G_TYPE_PARAM_POINTER = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 15),
|
||||
G_TYPE_PARAM_VALUE_ARRAY = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 16),
|
||||
G_TYPE_PARAM_CLOSURE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 17),
|
||||
G_TYPE_PARAM_OBJECT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 18)
|
||||
} GTypeFundamentals;
|
||||
|
||||
|
||||
@ -111,8 +105,10 @@ typedef enum /*< skip >*/
|
||||
#define G_TYPE_IS_DERIVABLE(type) (g_type_check_flags ((type), G_TYPE_FLAG_DERIVABLE))
|
||||
#define G_TYPE_IS_DEEP_DERIVABLE(type) (g_type_check_flags ((type), G_TYPE_FLAG_DEEP_DERIVABLE))
|
||||
#define G_TYPE_IS_ABSTRACT(type) (g_type_check_flags ((type), G_TYPE_FLAG_ABSTRACT))
|
||||
#define G_TYPE_IS_VALUE_ABSTRACT(type) (g_type_check_flags ((type), G_TYPE_FLAG_VALUE_ABSTRACT))
|
||||
#define G_TYPE_IS_PARAM(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_PARAM)
|
||||
#define G_TYPE_IS_VALUE_TYPE(type) (g_type_value_table_peek (type) != NULL)
|
||||
#define G_TYPE_IS_VALUE_TYPE(type) (g_type_check_is_value_type (type))
|
||||
#define G_TYPE_HAS_VALUE_TABLE(type) (g_type_value_table_peek (type) != NULL)
|
||||
|
||||
|
||||
/* Typedefs
|
||||
@ -152,7 +148,6 @@ struct _GTypeInterface
|
||||
|
||||
/* Casts, checks and accessors for structured types
|
||||
* usage of these macros is reserved to type implementations only
|
||||
*
|
||||
*/
|
||||
/*< protected >*/
|
||||
#define G_TYPE_CHECK_INSTANCE(instance) (_G_TYPE_CHI ((GTypeInstance*) (instance)))
|
||||
@ -163,7 +158,7 @@ struct _GTypeInterface
|
||||
#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type) (_G_TYPE_CCC ((g_class), (g_type), c_type))
|
||||
#define G_TYPE_CHECK_CLASS_TYPE(g_class, g_type) (_G_TYPE_CCT ((g_class), (g_type)))
|
||||
#define G_TYPE_CHECK_VALUE(value) (_G_TYPE_CHV ((value)))
|
||||
#define G_TYPE_CHECK_VALUE_TYPE(value, g_type) (_G_TYPE_CVT ((value), (g_type)))
|
||||
#define G_TYPE_CHECK_VALUE_TYPE(value, g_type) (_G_TYPE_CVH ((value), (g_type)))
|
||||
#define G_TYPE_FROM_INSTANCE(instance) (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
|
||||
#define G_TYPE_FROM_CLASS(g_class) (((GTypeClass*) (g_class))->g_type)
|
||||
#define G_TYPE_FROM_INTERFACE(g_iface) (((GTypeInterface*) (g_iface))->g_type)
|
||||
@ -185,8 +180,8 @@ G_CONST_RETURN gchar* g_type_name (GType type);
|
||||
GQuark g_type_qname (GType type);
|
||||
GType g_type_from_name (const gchar *name);
|
||||
GType g_type_parent (GType type);
|
||||
GType g_type_next_base (GType type,
|
||||
GType base_type);
|
||||
GType g_type_next_base (GType leaf_type,
|
||||
GType root_type);
|
||||
gboolean g_type_is_a (GType type,
|
||||
GType is_a_type);
|
||||
guint g_type_fundamental_branch_last (GType type);
|
||||
@ -235,7 +230,8 @@ typedef enum /*< skip >*/
|
||||
} GTypeFundamentalFlags;
|
||||
typedef enum /*< skip >*/
|
||||
{
|
||||
G_TYPE_FLAG_ABSTRACT = (1 << 4)
|
||||
G_TYPE_FLAG_ABSTRACT = (1 << 4),
|
||||
G_TYPE_FLAG_VALUE_ABSTRACT = (1 << 5)
|
||||
} GTypeFlags;
|
||||
struct _GTypeInfo
|
||||
{
|
||||
@ -335,8 +331,9 @@ GTypeClass* g_type_check_class_cast (GTypeClass *g_class,
|
||||
GType is_a_type);
|
||||
gboolean g_type_class_is_a (GTypeClass *g_class,
|
||||
GType is_a_type);
|
||||
gboolean g_type_check_is_value_type (GType type);
|
||||
gboolean g_type_check_value (GValue *value);
|
||||
gboolean g_type_value_is_a (GValue *value,
|
||||
gboolean g_type_check_value_holds (GValue *value,
|
||||
GType type);
|
||||
GTypeValueTable* g_type_value_table_peek (GType type);
|
||||
|
||||
@ -354,7 +351,7 @@ GTypeValueTable* g_type_value_table_peek (GType type);
|
||||
#define _G_TYPE_CHI(ip) (g_type_check_instance ((GTypeInstance*) ip))
|
||||
#define _G_TYPE_CIT(ip, gt) (g_type_instance_is_a ((GTypeInstance*) ip, gt))
|
||||
#define _G_TYPE_CCT(cp, gt) (g_type_class_is_a ((GTypeClass*) cp, gt))
|
||||
#define _G_TYPE_CVT(vl, gt) (g_type_value_is_a ((GValue*) vl, gt))
|
||||
#define _G_TYPE_CVH(vl, gt) (g_type_check_value_holds ((GValue*) vl, gt))
|
||||
#define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl))
|
||||
#define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class))
|
||||
#define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt))
|
||||
|
418
gobject/gvalue.c
418
gobject/gvalue.c
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -25,66 +25,130 @@
|
||||
|
||||
#include "gvalue.h"
|
||||
#include "gvaluecollector.h"
|
||||
#include "gbsearcharray.h"
|
||||
|
||||
|
||||
/* --- typedefs & structures --- */
|
||||
typedef struct
|
||||
{
|
||||
GType value_type1;
|
||||
GType value_type2;
|
||||
GValueExchange func;
|
||||
GType first_type;
|
||||
} ExchangeEntry;
|
||||
typedef struct {
|
||||
GType src_type;
|
||||
GType dest_type;
|
||||
GValueTransform func;
|
||||
} TransformEntry;
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
static gint transform_entries_cmp (gconstpointer bsearch_node1,
|
||||
gconstpointer bsearch_node2);
|
||||
|
||||
|
||||
/* --- variables --- */
|
||||
static GHashTable *param_exchange_ht = NULL;
|
||||
static GBSearchArray transform_array = {
|
||||
transform_entries_cmp,
|
||||
sizeof (TransformEntry),
|
||||
0, /* no flags */
|
||||
0, NULL,
|
||||
};
|
||||
|
||||
|
||||
/* --- functions --- */
|
||||
void
|
||||
static inline void /* keep this function in sync with gvaluecollector.h and gboxed.c */
|
||||
value_meminit (GValue *value,
|
||||
GType value_type)
|
||||
{
|
||||
value->g_type = value_type;
|
||||
memset (value->data, 0, sizeof (value->data));
|
||||
}
|
||||
|
||||
GValue*
|
||||
g_value_init (GValue *value,
|
||||
GType g_type)
|
||||
{
|
||||
GTypeValueTable *value_table = g_type_value_table_peek (g_type);
|
||||
/* g_return_val_if_fail (G_TYPE_IS_VALUE (g_type), NULL); be more elaborate below */
|
||||
g_return_val_if_fail (value != NULL, NULL);
|
||||
/* g_return_val_if_fail (G_VALUE_TYPE (value) == 0, NULL); be more elaborate below */
|
||||
|
||||
g_return_if_fail (value != NULL);
|
||||
g_return_if_fail (G_VALUE_TYPE (value) == 0);
|
||||
|
||||
if (value_table)
|
||||
if (G_TYPE_IS_VALUE (g_type) && G_VALUE_TYPE (value) == 0)
|
||||
{
|
||||
memset (value, 0, sizeof (*value));
|
||||
value->g_type = g_type;
|
||||
GTypeValueTable *value_table = g_type_value_table_peek (g_type);
|
||||
|
||||
/* setup and init */
|
||||
value_meminit (value, g_type);
|
||||
value_table->value_init (value);
|
||||
}
|
||||
else
|
||||
g_warning (G_STRLOC ": cannot initialize value of type `%s' which has no GTypeValueTable",
|
||||
g_type_name (g_type));
|
||||
else if (G_VALUE_TYPE (value))
|
||||
g_warning ("%s: cannot initialize GValue with type `%s', the value has already been initialized as `%s'",
|
||||
G_STRLOC,
|
||||
g_type_name (g_type),
|
||||
g_type_name (G_VALUE_TYPE (value)));
|
||||
else /* !G_TYPE_IS_VALUE (g_type) */
|
||||
g_warning ("%s: cannot initialize GValue with type `%s', %s",
|
||||
G_STRLOC,
|
||||
g_type_name (g_type),
|
||||
g_type_value_table_peek (g_type) ?
|
||||
"this type is abstract with regards to GValue use, use a more specific (derived) type" :
|
||||
"this type has no GTypeValueTable implementation");
|
||||
return value;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_copy (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
GTypeValueTable *value_table;
|
||||
|
||||
g_return_if_fail (G_IS_VALUE (src_value));
|
||||
g_return_if_fail (G_IS_VALUE (dest_value));
|
||||
g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value)));
|
||||
|
||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (dest_value));
|
||||
if (!value_table)
|
||||
g_return_if_fail (g_type_value_table_peek (G_VALUE_TYPE (dest_value)) != NULL);
|
||||
g_return_if_fail (g_value_type_compatible (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value)));
|
||||
|
||||
if (src_value != dest_value)
|
||||
{
|
||||
/* make sure dest_value's value is free()d and zero initialized */
|
||||
g_value_reset (dest_value);
|
||||
GType dest_type = G_VALUE_TYPE (dest_value);
|
||||
GTypeValueTable *value_table = g_type_value_table_peek (dest_type);
|
||||
|
||||
/* make sure dest_value's value is free()d */
|
||||
if (value_table->value_free)
|
||||
value_table->value_free (dest_value);
|
||||
|
||||
/* setup and copy */
|
||||
value_meminit (dest_value, dest_type);
|
||||
value_table->value_copy (src_value, dest_value);
|
||||
}
|
||||
}
|
||||
|
||||
GValue*
|
||||
g_value_reset (GValue *value)
|
||||
{
|
||||
GTypeValueTable *value_table;
|
||||
GType g_type;
|
||||
|
||||
g_return_val_if_fail (G_IS_VALUE (value), NULL);
|
||||
|
||||
g_type = G_VALUE_TYPE (value);
|
||||
value_table = g_type_value_table_peek (g_type);
|
||||
|
||||
/* make sure value's value is free()d */
|
||||
if (value_table->value_free)
|
||||
value_table->value_free (value);
|
||||
|
||||
/* setup and init */
|
||||
value_meminit (value, g_type);
|
||||
value_table->value_init (value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_unset (GValue *value)
|
||||
{
|
||||
GTypeValueTable *value_table;
|
||||
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
|
||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||
|
||||
if (value_table->value_free)
|
||||
value_table->value_free (value);
|
||||
memset (value, 0, sizeof (*value));
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_value_fits_pointer (const GValue *value)
|
||||
{
|
||||
@ -93,22 +157,18 @@ g_value_fits_pointer (const GValue *value)
|
||||
g_return_val_if_fail (G_IS_VALUE (value), FALSE);
|
||||
|
||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||
if (!value_table)
|
||||
g_return_val_if_fail (g_type_value_table_peek (G_VALUE_TYPE (value)) != NULL, FALSE);
|
||||
|
||||
return value_table->value_peek_pointer != NULL;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_value_get_as_pointer (const GValue *value)
|
||||
g_value_peek_pointer (const GValue *value)
|
||||
{
|
||||
GTypeValueTable *value_table;
|
||||
|
||||
g_return_val_if_fail (G_IS_VALUE (value), NULL);
|
||||
|
||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||
if (!value_table)
|
||||
g_return_val_if_fail (g_type_value_table_peek (G_VALUE_TYPE (value)) != NULL, NULL);
|
||||
if (!value_table->value_peek_pointer)
|
||||
g_return_val_if_fail (g_value_fits_pointer (value) == TRUE, NULL);
|
||||
|
||||
@ -119,231 +179,167 @@ void
|
||||
g_value_set_instance (GValue *value,
|
||||
gpointer instance)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
GType g_type;
|
||||
GTypeValueTable *value_table;
|
||||
GTypeCValue cvalue;
|
||||
gchar *error_msg;
|
||||
|
||||
g_value_reset (value);
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
if (instance)
|
||||
{
|
||||
GType g_type = G_VALUE_TYPE (value);
|
||||
GTypeValueTable *value_table = g_type_value_table_peek (g_type);
|
||||
GTypeCValue cvalue = { 0, };
|
||||
gchar *error_msg;
|
||||
|
||||
g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
|
||||
g_return_if_fail (g_type_is_a (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value)));
|
||||
g_return_if_fail (strcmp (value_table->collect_format, "p") == 0);
|
||||
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value)));
|
||||
}
|
||||
|
||||
cvalue.v_pointer = instance;
|
||||
error_msg = value_table->collect_value (value, 1, &cvalue, 0);
|
||||
g_type = G_VALUE_TYPE (value);
|
||||
value_table = g_type_value_table_peek (g_type);
|
||||
|
||||
if (error_msg)
|
||||
{
|
||||
g_warning ("%s: %s", G_STRLOC, error_msg);
|
||||
g_free (error_msg);
|
||||
g_return_if_fail (strcmp (value_table->collect_format, "p") == 0);
|
||||
|
||||
/* we purposely leak the value here, it might not be
|
||||
* in a sane state if an error condition occoured
|
||||
*/
|
||||
memset (value, 0, sizeof (*value));
|
||||
value->g_type = g_type;
|
||||
value_table->value_init (value);
|
||||
}
|
||||
memset (&cvalue, 0, sizeof (cvalue));
|
||||
cvalue.v_pointer = instance;
|
||||
|
||||
/* make sure value's value is free()d */
|
||||
if (value_table->value_free)
|
||||
value_table->value_free (value);
|
||||
|
||||
/* setup and collect */
|
||||
value_meminit (value, g_type);
|
||||
error_msg = value_table->collect_value (value, 1, &cvalue, 0);
|
||||
if (error_msg)
|
||||
{
|
||||
g_warning ("%s: %s", G_STRLOC, error_msg);
|
||||
g_free (error_msg);
|
||||
|
||||
/* we purposely leak the value here, it might not be
|
||||
* in a sane state if an error condition occoured
|
||||
*/
|
||||
value_meminit (value, g_type);
|
||||
value_table->value_init (value);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_value_unset (GValue *value)
|
||||
static GValueTransform
|
||||
transform_func_lookup (GType src_type,
|
||||
GType dest_type)
|
||||
{
|
||||
GTypeValueTable *value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||
TransformEntry entry;
|
||||
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
if (!value_table)
|
||||
g_return_if_fail (g_type_value_table_peek (G_VALUE_TYPE (value)) != NULL);
|
||||
|
||||
if (value_table->value_free)
|
||||
value_table->value_free (value);
|
||||
memset (value, 0, sizeof (*value));
|
||||
}
|
||||
|
||||
void
|
||||
g_value_reset (GValue *value)
|
||||
{
|
||||
GTypeValueTable *value_table;
|
||||
GType g_type;
|
||||
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
|
||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||
g_type = G_VALUE_TYPE (value);
|
||||
|
||||
if (value_table->value_free)
|
||||
value_table->value_free (value);
|
||||
memset (value, 0, sizeof (*value));
|
||||
|
||||
value->g_type = g_type;
|
||||
value_table->value_init (value);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
exchange_entries_equal (gconstpointer v1,
|
||||
gconstpointer v2)
|
||||
{
|
||||
const ExchangeEntry *entry1 = v1;
|
||||
const ExchangeEntry *entry2 = v2;
|
||||
|
||||
return (entry1->value_type1 == entry2->value_type1 &&
|
||||
entry1->value_type2 == entry2->value_type2);
|
||||
}
|
||||
|
||||
static guint
|
||||
exchange_entry_hash (gconstpointer key)
|
||||
{
|
||||
const ExchangeEntry *entry = key;
|
||||
|
||||
return entry->value_type1 ^ entry->value_type2;
|
||||
}
|
||||
|
||||
static void
|
||||
value_exchange_memcpy (GValue *value1,
|
||||
GValue *value2)
|
||||
{
|
||||
GValue tmp_value;
|
||||
|
||||
memcpy (&tmp_value.data, &value1->data, sizeof (value1->data));
|
||||
memcpy (&value1->data, &value2->data, sizeof (value1->data));
|
||||
memcpy (&value2->data, &tmp_value.data, sizeof (value2->data));
|
||||
}
|
||||
|
||||
static inline GValueExchange
|
||||
exchange_func_lookup (GType value_type1,
|
||||
GType value_type2,
|
||||
gboolean *need_swap)
|
||||
{
|
||||
if (value_type1 == value_type2)
|
||||
return value_exchange_memcpy;
|
||||
else
|
||||
entry.src_type = src_type;
|
||||
do
|
||||
{
|
||||
GType type1 = value_type1;
|
||||
|
||||
entry.dest_type = dest_type;
|
||||
do
|
||||
{
|
||||
GType type2 = value_type2;
|
||||
TransformEntry *e;
|
||||
|
||||
do
|
||||
e = g_bsearch_array_lookup (&transform_array, &entry);
|
||||
if (e)
|
||||
{
|
||||
ExchangeEntry entry, *ret;
|
||||
|
||||
entry.value_type1 = MIN (type1, type2);
|
||||
entry.value_type2 = MAX (type1, type2);
|
||||
ret = g_hash_table_lookup (param_exchange_ht, &entry);
|
||||
if (ret)
|
||||
{
|
||||
if (need_swap)
|
||||
*need_swap = ret->first_type == type2;
|
||||
|
||||
return ret->func;
|
||||
}
|
||||
|
||||
type2 = g_type_parent (type2);
|
||||
/* need to check that there hasn't been a change in value handling */
|
||||
if (g_type_value_table_peek (entry.dest_type) == g_type_value_table_peek (dest_type) &&
|
||||
g_type_value_table_peek (entry.src_type) == g_type_value_table_peek (src_type))
|
||||
return e->func;
|
||||
}
|
||||
while (type2);
|
||||
|
||||
type1 = g_type_parent (type1);
|
||||
entry.dest_type = g_type_parent (entry.dest_type);
|
||||
}
|
||||
while (type1);
|
||||
while (entry.dest_type);
|
||||
|
||||
entry.src_type = g_type_parent (entry.src_type);
|
||||
}
|
||||
while (entry.src_type);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_register_exchange_func (GType value_type1,
|
||||
GType value_type2,
|
||||
GValueExchange func)
|
||||
static gint
|
||||
transform_entries_cmp (gconstpointer bsearch_node1,
|
||||
gconstpointer bsearch_node2)
|
||||
{
|
||||
ExchangeEntry entry;
|
||||
const TransformEntry *e1 = bsearch_node1;
|
||||
const TransformEntry *e2 = bsearch_node2;
|
||||
gint cmp = G_BSEARCH_ARRAY_CMP (e1->src_type, e2->src_type);
|
||||
|
||||
g_return_if_fail (g_type_name (value_type1) != NULL);
|
||||
g_return_if_fail (g_type_name (value_type2) != NULL);
|
||||
g_return_if_fail (func != NULL);
|
||||
|
||||
entry.value_type1 = MIN (value_type1, value_type2);
|
||||
entry.value_type2 = MAX (value_type1, value_type2);
|
||||
if (param_exchange_ht && g_hash_table_lookup (param_exchange_ht, &entry))
|
||||
g_warning (G_STRLOC ": cannot re-register param value exchange function "
|
||||
"for `%s' and `%s'",
|
||||
g_type_name (value_type1),
|
||||
g_type_name (value_type2));
|
||||
if (cmp)
|
||||
return cmp;
|
||||
else
|
||||
{
|
||||
ExchangeEntry *entry = g_new (ExchangeEntry, 1);
|
||||
return G_BSEARCH_ARRAY_CMP (e1->dest_type, e2->dest_type);
|
||||
}
|
||||
|
||||
if (!param_exchange_ht)
|
||||
param_exchange_ht = g_hash_table_new (exchange_entry_hash, exchange_entries_equal);
|
||||
entry->value_type1 = MIN (value_type1, value_type2);
|
||||
entry->value_type2 = MAX (value_type1, value_type2);
|
||||
entry->func = func;
|
||||
entry->first_type = value_type1;
|
||||
g_hash_table_insert (param_exchange_ht, entry, entry);
|
||||
}
|
||||
void
|
||||
g_value_register_transform_func (GType src_type,
|
||||
GType dest_type,
|
||||
GValueTransform transform_func)
|
||||
{
|
||||
TransformEntry entry;
|
||||
|
||||
g_return_if_fail (G_TYPE_HAS_VALUE_TABLE (src_type));
|
||||
g_return_if_fail (G_TYPE_HAS_VALUE_TABLE (dest_type));
|
||||
g_return_if_fail (transform_func != NULL);
|
||||
|
||||
if (transform_func_lookup (src_type, dest_type))
|
||||
g_warning ("reregistering value transformation function (%p) for `%s' to `%s'",
|
||||
transform_func,
|
||||
g_type_name (src_type),
|
||||
g_type_name (dest_type));
|
||||
entry.src_type = src_type;
|
||||
entry.dest_type = dest_type;
|
||||
entry.func = transform_func;
|
||||
g_bsearch_array_insert (&transform_array, &entry, TRUE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_value_types_exchangable (GType value_type1,
|
||||
GType value_type2)
|
||||
g_value_type_transformable (GType src_type,
|
||||
GType dest_type)
|
||||
{
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (value_type1), FALSE); /* these might bite us, think G_TYPE_ENUM */
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (value_type2), FALSE);
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE);
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE);
|
||||
|
||||
return exchange_func_lookup (value_type1, value_type2, NULL) != NULL;
|
||||
return (g_value_type_compatible (src_type, dest_type) ||
|
||||
transform_func_lookup (src_type, dest_type) != NULL);
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_values_exchange (GValue *value1,
|
||||
GValue *value2)
|
||||
g_value_type_compatible (GType src_type,
|
||||
GType dest_type)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE (value1), FALSE);
|
||||
g_return_val_if_fail (G_IS_VALUE (value2), FALSE);
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE);
|
||||
g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE);
|
||||
|
||||
if (value1 != value2)
|
||||
{
|
||||
gboolean need_swap;
|
||||
GValueExchange value_exchange = exchange_func_lookup (G_VALUE_TYPE (value1),
|
||||
G_VALUE_TYPE (value2),
|
||||
&need_swap);
|
||||
if (value_exchange)
|
||||
{
|
||||
if (need_swap)
|
||||
value_exchange (value2, value1);
|
||||
else
|
||||
value_exchange (value1, value2);
|
||||
}
|
||||
|
||||
return value_exchange != NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return (g_type_is_a (src_type, dest_type) &&
|
||||
g_type_value_table_peek (dest_type) == g_type_value_table_peek (src_type));
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_value_convert (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
g_value_transform (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
gboolean success = TRUE;
|
||||
GType dest_type;
|
||||
|
||||
g_return_val_if_fail (G_IS_VALUE (src_value), FALSE);
|
||||
g_return_val_if_fail (G_IS_VALUE (dest_value), FALSE);
|
||||
|
||||
if (src_value != dest_value)
|
||||
dest_type = G_VALUE_TYPE (dest_value);
|
||||
if (g_value_type_compatible (G_VALUE_TYPE (src_value), dest_type))
|
||||
{
|
||||
GValue tmp_value = { 0, };
|
||||
g_value_copy (src_value, dest_value);
|
||||
|
||||
g_value_init (&tmp_value, G_VALUE_TYPE (src_value));
|
||||
g_value_copy (src_value, &tmp_value);
|
||||
|
||||
success = g_values_exchange (&tmp_value, dest_value);
|
||||
g_value_unset (&tmp_value);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
GValueTransform transform = transform_func_lookup (G_VALUE_TYPE (src_value), dest_type);
|
||||
|
||||
return success;
|
||||
if (transform)
|
||||
{
|
||||
g_value_unset (dest_value);
|
||||
|
||||
/* setup and transform */
|
||||
value_meminit (dest_value, dest_type);
|
||||
transform (src_value, dest_value);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -32,14 +32,16 @@ extern "C" {
|
||||
/* --- type macros --- */
|
||||
#define G_TYPE_IS_VALUE(type) (g_type_value_table_peek (type) != NULL)
|
||||
#define G_IS_VALUE(value) (G_TYPE_CHECK_VALUE (value))
|
||||
#define G_VALUE_HOLDS(value, g_type) (G_TYPE_CHECK_VALUE_TYPE ((value), (g_type)))
|
||||
#define G_VALUE_TYPE(value) (((GValue*) (value))->g_type)
|
||||
#define G_VALUE_TYPE_NAME(value) (g_type_name (G_VALUE_TYPE (value)))
|
||||
#define G_VALUE_HOLDS(value,type) (G_TYPE_CHECK_VALUE_TYPE ((value), (type)))
|
||||
|
||||
|
||||
/* --- typedefs & structures --- */
|
||||
typedef void (*GValueExchange) (GValue *value1,
|
||||
GValue *value2);
|
||||
typedef void (*GValueExchange) (GValue *value1,
|
||||
GValue *value2);
|
||||
typedef void (*GValueTransform) (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
struct _GValue
|
||||
{
|
||||
/*< private >*/
|
||||
@ -59,28 +61,33 @@ struct _GValue
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
void g_value_init (GValue *value,
|
||||
GValue* g_value_init (GValue *value,
|
||||
GType g_type);
|
||||
void g_value_copy (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
gboolean g_value_convert (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
void g_value_reset (GValue *value);
|
||||
GValue* g_value_reset (GValue *value);
|
||||
void g_value_unset (GValue *value);
|
||||
gboolean g_value_fits_pointer (const GValue *value);
|
||||
gpointer g_value_get_as_pointer (const GValue *value);
|
||||
void g_value_set_instance (GValue *value,
|
||||
gpointer instance);
|
||||
|
||||
|
||||
/* --- private --- */
|
||||
gboolean g_value_fits_pointer (const GValue *value);
|
||||
gpointer g_value_peek_pointer (const GValue *value);
|
||||
|
||||
|
||||
/* --- implementation details --- */
|
||||
gboolean g_values_exchange (GValue *value1,
|
||||
GValue *value2);
|
||||
gboolean g_value_types_exchangable (GType value_type1,
|
||||
GType value_type2);
|
||||
void g_value_register_exchange_func (GType value_type1,
|
||||
GType value_type2,
|
||||
GValueExchange func);
|
||||
gboolean g_value_type_compatible (GType src_type,
|
||||
GType dest_type);
|
||||
gboolean g_value_type_transformable (GType src_type,
|
||||
GType dest_type);
|
||||
gboolean g_value_transform (const GValue *src_value,
|
||||
GValue *dest_value);
|
||||
void g_value_register_transform_func (GType src_type,
|
||||
GType dest_type,
|
||||
GValueTransform transform_func);
|
||||
#define G_VALUE_NOCOPY_CONTENTS (1 << 27)
|
||||
|
||||
|
||||
|
184
gobject/gvaluearray.c
Normal file
184
gobject/gvaluearray.c
Normal file
@ -0,0 +1,184 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include "gvaluearray.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h> /* qsort() */
|
||||
|
||||
|
||||
|
||||
/* --- functions --- */
|
||||
GValue*
|
||||
g_value_array_get_nth (GValueArray *value_array,
|
||||
guint index)
|
||||
{
|
||||
g_return_val_if_fail (value_array != NULL, NULL);
|
||||
g_return_val_if_fail (index < value_array->n_values, NULL);
|
||||
|
||||
return value_array->values + index;
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_new (guint n_prealloced)
|
||||
{
|
||||
GValueArray *value_array = g_new0 (GValueArray, 1);
|
||||
|
||||
value_array->n_values = n_prealloced;
|
||||
value_array->values = g_renew (GValue, value_array->values, value_array->n_values);
|
||||
memset (value_array->values, 0, value_array->n_values * sizeof (value_array->values[0]));
|
||||
|
||||
return value_array;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_array_free (GValueArray *value_array)
|
||||
{
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (value_array != NULL);
|
||||
|
||||
for (i = 0; i < value_array->n_values; i++)
|
||||
{
|
||||
GValue *value = value_array->values + i;
|
||||
|
||||
if (G_VALUE_TYPE (value) != 0) /* we allow unset values in the array */
|
||||
g_value_unset (value);
|
||||
}
|
||||
g_free (value_array->values);
|
||||
g_free (value_array);
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_copy (const GValueArray *value_array)
|
||||
{
|
||||
GValueArray *new_array;
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail (value_array != NULL, NULL);
|
||||
|
||||
new_array = g_new0 (GValueArray, 1);
|
||||
new_array->n_values = value_array->n_values;
|
||||
new_array->values = g_renew (GValue, new_array->values, new_array->n_values);
|
||||
memset (new_array->values, 0, new_array->n_values * sizeof (new_array->values[0]));
|
||||
for (i = 0; i < new_array->n_values; i++)
|
||||
if (G_VALUE_TYPE (value_array->values + i) != 0)
|
||||
{
|
||||
GValue *value = new_array->values + i;
|
||||
|
||||
g_value_init (value, G_VALUE_TYPE (value_array->values + i));
|
||||
g_value_copy (value_array->values + i, value);
|
||||
}
|
||||
return new_array;
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_prepend (GValueArray *value_array,
|
||||
const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (value_array != NULL, NULL);
|
||||
|
||||
return g_value_array_insert (value_array, 0, value);
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_append (GValueArray *value_array,
|
||||
const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (value_array != NULL, NULL);
|
||||
|
||||
return g_value_array_insert (value_array, value_array->n_values, value);
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_insert (GValueArray *value_array,
|
||||
guint index,
|
||||
const GValue *value)
|
||||
{
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail (value_array != NULL, NULL);
|
||||
g_return_val_if_fail (index <= value_array->n_values, value_array);
|
||||
|
||||
/* we support NULL for "value" as a shortcut for an unset value */
|
||||
|
||||
i = value_array->n_values++;
|
||||
value_array->values = g_renew (GValue, value_array->values, value_array->n_values);
|
||||
if (index + 1 < value_array->n_values)
|
||||
g_memmove (value_array->values + index + 1, value_array->values + index,
|
||||
(i - index) * sizeof (value_array->values[0]));
|
||||
memset (value_array->values + index, 0, sizeof (value_array->values[0]));
|
||||
if (value)
|
||||
{
|
||||
g_value_init (value_array->values + index, G_VALUE_TYPE (value));
|
||||
g_value_copy (value, value_array->values + index);
|
||||
}
|
||||
return value_array;
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_remove (GValueArray *value_array,
|
||||
guint index)
|
||||
{
|
||||
g_return_val_if_fail (value_array != NULL, NULL);
|
||||
g_return_val_if_fail (index < value_array->n_values, value_array);
|
||||
|
||||
if (G_VALUE_TYPE (value_array->values + index) != 0)
|
||||
g_value_unset (value_array->values + index);
|
||||
value_array->n_values--;
|
||||
if (index < value_array->n_values)
|
||||
g_memmove (value_array->values + index, value_array->values + index + 1,
|
||||
(value_array->n_values - index) * sizeof (value_array->values[0]));
|
||||
value_array->values = g_renew (GValue, value_array->values, value_array->n_values);
|
||||
|
||||
return value_array;
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_sort (GValueArray *value_array,
|
||||
GCompareFunc compare_func)
|
||||
{
|
||||
g_return_val_if_fail (compare_func != NULL, NULL);
|
||||
|
||||
if (value_array->n_values)
|
||||
qsort (value_array->values,
|
||||
value_array->n_values,
|
||||
sizeof (value_array->values[0]),
|
||||
compare_func);
|
||||
return value_array;
|
||||
}
|
||||
|
||||
GValueArray*
|
||||
g_value_array_sort_with_data (GValueArray *value_array,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_return_val_if_fail (value_array != NULL, NULL);
|
||||
g_return_val_if_fail (compare_func != NULL, NULL);
|
||||
|
||||
if (value_array->n_values)
|
||||
g_qsort_with_data (value_array->values,
|
||||
value_array->n_values,
|
||||
sizeof (value_array->values[0]),
|
||||
compare_func, user_data);
|
||||
return value_array;
|
||||
}
|
69
gobject/gvaluearray.h
Normal file
69
gobject/gvaluearray.h
Normal file
@ -0,0 +1,69 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser 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.
|
||||
*
|
||||
* gvaluearray.h: GLib array type holding GValues
|
||||
*/
|
||||
#ifndef __G_VALUE_ARRAY_H__
|
||||
#define __G_VALUE_ARRAY_H__
|
||||
|
||||
|
||||
#include <gobject/gvalue.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
/* --- typedefs & structs --- */
|
||||
typedef struct _GValueArray GValueArray;
|
||||
struct _GValueArray
|
||||
{
|
||||
guint n_values;
|
||||
GValue *values;
|
||||
};
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
GValue* g_value_array_get_nth (GValueArray *value_array,
|
||||
guint index);
|
||||
GValueArray* g_value_array_new (guint n_prealloced);
|
||||
void g_value_array_free (GValueArray *value_array);
|
||||
GValueArray* g_value_array_copy (const GValueArray *value_array);
|
||||
GValueArray* g_value_array_prepend (GValueArray *value_array,
|
||||
const GValue *value);
|
||||
GValueArray* g_value_array_append (GValueArray *value_array,
|
||||
const GValue *value);
|
||||
GValueArray* g_value_array_insert (GValueArray *value_array,
|
||||
guint index,
|
||||
const GValue *value);
|
||||
GValueArray* g_value_array_remove (GValueArray *value_array,
|
||||
guint index);
|
||||
GValueArray* g_value_array_sort (GValueArray *value_array,
|
||||
GCompareFunc compare_func);
|
||||
GValueArray* g_value_array_sort_with_data (GValueArray *value_array,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __G_VALUE_ARRAY_H__ */
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -66,12 +66,16 @@ union _GTypeCValue
|
||||
G_STMT_START { \
|
||||
GValue *_value = (value); \
|
||||
guint _flags = (flags); \
|
||||
GTypeValueTable *_vtable = g_type_value_table_peek (G_VALUE_TYPE (_value)); \
|
||||
GType _value_type = G_VALUE_TYPE (_value); \
|
||||
GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \
|
||||
gchar *_collect_format = _vtable->collect_format; \
|
||||
GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
|
||||
guint _n_values = 0; \
|
||||
\
|
||||
g_value_reset (_value); \
|
||||
if (_vtable->value_free) \
|
||||
_vtable->value_free (_value); \
|
||||
_value->g_type = _value_type; /* value_meminit() from gvalue.c */ \
|
||||
memset (_value->data, 0, sizeof (_value->data)); \
|
||||
while (*_collect_format) \
|
||||
{ \
|
||||
GTypeCValue *_cvalue = _cvalues + _n_values++; \
|
||||
@ -108,7 +112,8 @@ G_STMT_START { \
|
||||
G_STMT_START { \
|
||||
GValue *_value = (value); \
|
||||
guint _flags = (flags); \
|
||||
GTypeValueTable *_vtable = g_type_value_table_peek (G_VALUE_TYPE (_value)); \
|
||||
GType _value_type = G_VALUE_TYPE (_value); \
|
||||
GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \
|
||||
gchar *_lcopy_format = _vtable->lcopy_format; \
|
||||
GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
|
||||
guint _n_values = 0; \
|
||||
|
339
gobject/gvaluetransform.c
Normal file
339
gobject/gvaluetransform.c
Normal file
@ -0,0 +1,339 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 2001 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser 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.
|
||||
*/
|
||||
#include "gvalue.h"
|
||||
#include "genums.h"
|
||||
|
||||
|
||||
/* same type transforms
|
||||
*/
|
||||
static void
|
||||
value_transform_memcpy_data0 (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
memcpy (&dest_value->data[0], &src_value->data[0], sizeof (src_value->data[0]));
|
||||
}
|
||||
#define value_transform_int_int value_transform_memcpy_data0
|
||||
#define value_transform_uint_uint value_transform_memcpy_data0
|
||||
#define value_transform_long_long value_transform_memcpy_data0
|
||||
#define value_transform_ulong_ulong value_transform_memcpy_data0
|
||||
#define value_transform_float_float value_transform_memcpy_data0
|
||||
#define value_transform_double_double value_transform_memcpy_data0
|
||||
|
||||
|
||||
/* numeric casts
|
||||
*/
|
||||
#define DEFINE_CAST(func_name, from_member, ctype, to_member) \
|
||||
static void \
|
||||
value_transform_##func_name (const GValue *src_value, \
|
||||
GValue *dest_value) \
|
||||
{ \
|
||||
ctype c_value = src_value->data[0].##from_member; \
|
||||
dest_value->data[0].##to_member = c_value; \
|
||||
}
|
||||
DEFINE_CAST (int_s8, v_int, gint8, v_int);
|
||||
DEFINE_CAST (int_u8, v_int, guint8, v_uint);
|
||||
DEFINE_CAST (int_uint, v_int, guint, v_uint);
|
||||
DEFINE_CAST (int_long, v_int, glong, v_long);
|
||||
DEFINE_CAST (int_ulong, v_int, gulong, v_ulong);
|
||||
DEFINE_CAST (int_float, v_int, gfloat, v_float);
|
||||
DEFINE_CAST (int_double, v_int, gdouble, v_double);
|
||||
DEFINE_CAST (uint_s8, v_uint, gint8, v_int);
|
||||
DEFINE_CAST (uint_u8, v_uint, guint8, v_uint);
|
||||
DEFINE_CAST (uint_int, v_uint, gint, v_int);
|
||||
DEFINE_CAST (uint_long, v_uint, glong, v_long);
|
||||
DEFINE_CAST (uint_ulong, v_uint, gulong, v_ulong);
|
||||
DEFINE_CAST (uint_float, v_uint, gfloat, v_float);
|
||||
DEFINE_CAST (uint_double, v_uint, gdouble, v_double);
|
||||
DEFINE_CAST (long_s8, v_long, gint8, v_int);
|
||||
DEFINE_CAST (long_u8, v_long, guint8, v_uint);
|
||||
DEFINE_CAST (long_int, v_long, gint, v_int);
|
||||
DEFINE_CAST (long_uint, v_long, guint, v_uint);
|
||||
DEFINE_CAST (long_ulong, v_long, gulong, v_ulong);
|
||||
DEFINE_CAST (long_float, v_long, gfloat, v_float);
|
||||
DEFINE_CAST (long_double, v_long, gdouble, v_double);
|
||||
DEFINE_CAST (ulong_s8, v_ulong, gint8, v_int);
|
||||
DEFINE_CAST (ulong_u8, v_ulong, guint8, v_uint);
|
||||
DEFINE_CAST (ulong_int, v_ulong, gint, v_int);
|
||||
DEFINE_CAST (ulong_uint, v_ulong, guint, v_uint);
|
||||
DEFINE_CAST (ulong_long, v_ulong, glong, v_long);
|
||||
DEFINE_CAST (ulong_float, v_ulong, gfloat, v_float);
|
||||
DEFINE_CAST (ulong_double, v_ulong, gdouble, v_double);
|
||||
DEFINE_CAST (float_s8, v_float, gint8, v_int);
|
||||
DEFINE_CAST (float_u8, v_float, guint8, v_uint);
|
||||
DEFINE_CAST (float_int, v_float, gint, v_int);
|
||||
DEFINE_CAST (float_uint, v_float, guint, v_uint);
|
||||
DEFINE_CAST (float_long, v_float, glong, v_long);
|
||||
DEFINE_CAST (float_ulong, v_float, gulong, v_ulong);
|
||||
DEFINE_CAST (float_double, v_float, gdouble, v_double);
|
||||
DEFINE_CAST (double_s8, v_double, gint8, v_int);
|
||||
DEFINE_CAST (double_u8, v_double, guint8, v_uint);
|
||||
DEFINE_CAST (double_int, v_double, gint, v_int);
|
||||
DEFINE_CAST (double_uint, v_double, guint, v_uint);
|
||||
DEFINE_CAST (double_long, v_double, glong, v_long);
|
||||
DEFINE_CAST (double_ulong, v_double, gulong, v_ulong);
|
||||
DEFINE_CAST (double_float, v_double, gfloat, v_float);
|
||||
|
||||
|
||||
/* boolean assignments
|
||||
*/
|
||||
#define DEFINE_BOOL_CHECK(func_name, from_member) \
|
||||
static void \
|
||||
value_transform_##func_name (const GValue *src_value, \
|
||||
GValue *dest_value) \
|
||||
{ \
|
||||
dest_value->data[0].v_int = src_value->data[0].##from_member != 0; \
|
||||
}
|
||||
DEFINE_BOOL_CHECK (int_bool, v_int);
|
||||
DEFINE_BOOL_CHECK (uint_bool, v_uint);
|
||||
DEFINE_BOOL_CHECK (long_bool, v_long);
|
||||
DEFINE_BOOL_CHECK (ulong_bool, v_uint);
|
||||
|
||||
|
||||
/* string printouts
|
||||
*/
|
||||
#define DEFINE_SPRINTF(func_name, from_member, format) \
|
||||
static void \
|
||||
value_transform_##func_name (const GValue *src_value, \
|
||||
GValue *dest_value) \
|
||||
{ \
|
||||
dest_value->data[0].v_pointer = \
|
||||
g_strdup_printf ((format), src_value->data[0].##from_member); \
|
||||
}
|
||||
DEFINE_SPRINTF (int_string, v_int, "%d");
|
||||
DEFINE_SPRINTF (uint_string, v_uint, "%u");
|
||||
DEFINE_SPRINTF (long_string, v_long, "%ld");
|
||||
DEFINE_SPRINTF (ulong_string, v_ulong, "%lu");
|
||||
DEFINE_SPRINTF (float_string, v_float, "%f");
|
||||
DEFINE_SPRINTF (double_string, v_double, "%f");
|
||||
|
||||
|
||||
/* special cases
|
||||
*/
|
||||
static void
|
||||
value_transform_bool_string (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_pointer = g_strdup_printf ("%s",
|
||||
src_value->data[0].v_int ?
|
||||
"TRUE" : "FALSE");
|
||||
}
|
||||
static void
|
||||
value_transform_string_string (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
|
||||
}
|
||||
static void
|
||||
value_transform_enum_string (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
GEnumClass *class = g_type_class_ref (G_VALUE_TYPE (src_value));
|
||||
GEnumValue *enum_value = g_enum_get_value (class, src_value->data[0].v_int);
|
||||
|
||||
if (enum_value)
|
||||
dest_value->data[0].v_pointer = g_strdup (enum_value->value_name);
|
||||
else
|
||||
dest_value->data[0].v_pointer = g_strdup_printf ("%d", src_value->data[0].v_int);
|
||||
|
||||
g_type_class_unref (class);
|
||||
}
|
||||
static void
|
||||
value_transform_flags_string (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
GFlagsClass *class = g_type_class_ref (G_VALUE_TYPE (src_value));
|
||||
GFlagsValue *flags_value = g_flags_get_first_value (class, src_value->data[0].v_uint);
|
||||
|
||||
if (flags_value)
|
||||
{
|
||||
GString *gstring = g_string_new ("");
|
||||
guint v_flags = src_value->data[0].v_uint;
|
||||
|
||||
do
|
||||
{
|
||||
v_flags &= ~flags_value->value;
|
||||
|
||||
if (gstring->str[0])
|
||||
g_string_append (gstring, " | ");
|
||||
g_string_append (gstring, flags_value->value_name);
|
||||
flags_value = g_flags_get_first_value (class, v_flags);
|
||||
}
|
||||
while (flags_value);
|
||||
|
||||
if (v_flags)
|
||||
dest_value->data[0].v_pointer = g_strdup_printf ("%s | %u",
|
||||
gstring->str,
|
||||
v_flags);
|
||||
else
|
||||
dest_value->data[0].v_pointer = g_strdup (gstring->str);
|
||||
g_string_free (gstring, TRUE);
|
||||
}
|
||||
else
|
||||
dest_value->data[0].v_pointer = g_strdup_printf ("%u", src_value->data[0].v_uint);
|
||||
|
||||
g_type_class_unref (class);
|
||||
}
|
||||
|
||||
|
||||
/* registration
|
||||
*/
|
||||
void
|
||||
g_value_transforms_init (void) /* sync with gtype.c */
|
||||
{
|
||||
/* some transformations are a bit questionable,
|
||||
* we currently skip those
|
||||
*/
|
||||
#define SKIP____register_transform_func(type1,type2,transform_func) /* skip questionable transforms */
|
||||
|
||||
/* numeric types (plus to string) */
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_CHAR, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UCHAR, value_transform_int_u8);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_BOOLEAN, value_transform_int_bool);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_INT, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UINT, value_transform_int_uint);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_LONG, value_transform_int_long);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_ULONG, value_transform_int_ulong);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_ENUM, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_FLAGS, value_transform_int_uint);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_FLOAT, value_transform_int_float);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_DOUBLE, value_transform_int_double);
|
||||
g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_STRING, value_transform_int_string);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_CHAR, value_transform_uint_s8);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UCHAR, value_transform_uint_uint);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_BOOLEAN, value_transform_uint_bool);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_INT, value_transform_uint_int);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UINT, value_transform_uint_uint);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_LONG, value_transform_uint_long);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_ULONG, value_transform_uint_ulong);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_ENUM, value_transform_uint_int);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_FLAGS, value_transform_uint_uint);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_FLOAT, value_transform_uint_float);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_DOUBLE, value_transform_uint_double);
|
||||
g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_STRING, value_transform_uint_string);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_CHAR, value_transform_int_s8);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UCHAR, value_transform_int_u8);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_INT, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UINT, value_transform_int_uint);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_LONG, value_transform_int_long);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_ULONG, value_transform_int_ulong);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_ENUM, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_FLAGS, value_transform_int_uint);
|
||||
SKIP____register_transform_func (G_TYPE_BOOLEAN, G_TYPE_FLOAT, value_transform_int_float);
|
||||
SKIP____register_transform_func (G_TYPE_BOOLEAN, G_TYPE_DOUBLE, value_transform_int_double);
|
||||
g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_STRING, value_transform_bool_string);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_CHAR, value_transform_int_s8);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_UCHAR, value_transform_int_u8);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_BOOLEAN, value_transform_int_bool);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_INT, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_UINT, value_transform_int_uint);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_LONG, value_transform_int_long);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_ULONG, value_transform_int_ulong);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_ENUM, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_FLAGS, value_transform_int_uint);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_FLOAT, value_transform_int_float);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_DOUBLE, value_transform_int_double);
|
||||
g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, value_transform_int_string);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_CHAR, value_transform_uint_s8);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UCHAR, value_transform_uint_u8);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_BOOLEAN, value_transform_uint_bool);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_INT, value_transform_uint_int);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UINT, value_transform_uint_uint);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_LONG, value_transform_uint_long);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_ULONG, value_transform_uint_ulong);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_ENUM, value_transform_uint_int);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_FLAGS, value_transform_uint_uint);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_FLOAT, value_transform_uint_float);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_DOUBLE, value_transform_uint_double);
|
||||
g_value_register_transform_func (G_TYPE_UINT, G_TYPE_STRING, value_transform_uint_string);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_CHAR, value_transform_long_s8);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UCHAR, value_transform_long_u8);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_BOOLEAN, value_transform_long_bool);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_INT, value_transform_long_int);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UINT, value_transform_long_uint);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_LONG, value_transform_long_long);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_ULONG, value_transform_long_ulong);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_ENUM, value_transform_long_int);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_FLAGS, value_transform_long_uint);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_FLOAT, value_transform_long_float);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_DOUBLE, value_transform_long_double);
|
||||
g_value_register_transform_func (G_TYPE_LONG, G_TYPE_STRING, value_transform_long_string);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_CHAR, value_transform_ulong_s8);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UCHAR, value_transform_ulong_u8);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_BOOLEAN, value_transform_ulong_bool);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_INT, value_transform_ulong_int);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UINT, value_transform_ulong_uint);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_LONG, value_transform_ulong_long);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_ULONG, value_transform_ulong_ulong);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_ENUM, value_transform_ulong_int);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_FLAGS, value_transform_ulong_uint);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_FLOAT, value_transform_ulong_float);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_DOUBLE, value_transform_ulong_double);
|
||||
g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_STRING, value_transform_ulong_string);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_CHAR, value_transform_int_s8);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UCHAR, value_transform_int_u8);
|
||||
SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_BOOLEAN, value_transform_int_bool);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_INT, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UINT, value_transform_int_uint);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_LONG, value_transform_int_long);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_ULONG, value_transform_int_ulong);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_ENUM, value_transform_int_int);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_FLAGS, value_transform_int_uint);
|
||||
SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_FLOAT, value_transform_int_float);
|
||||
SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_DOUBLE, value_transform_int_double);
|
||||
g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_STRING, value_transform_enum_string);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_CHAR, value_transform_uint_s8);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UCHAR, value_transform_uint_u8);
|
||||
SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_BOOLEAN, value_transform_uint_bool);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_INT, value_transform_uint_int);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UINT, value_transform_uint_uint);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_LONG, value_transform_uint_long);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_ULONG, value_transform_uint_ulong);
|
||||
SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_ENUM, value_transform_uint_int);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_FLAGS, value_transform_uint_uint);
|
||||
SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_FLOAT, value_transform_uint_float);
|
||||
SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_DOUBLE, value_transform_uint_double);
|
||||
g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_STRING, value_transform_flags_string);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_CHAR, value_transform_float_s8);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UCHAR, value_transform_float_u8);
|
||||
SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_BOOLEAN, value_transform_float_bool);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_INT, value_transform_float_int);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UINT, value_transform_float_uint);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_LONG, value_transform_float_long);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_ULONG, value_transform_float_ulong);
|
||||
SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_ENUM, value_transform_float_int);
|
||||
SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_FLAGS, value_transform_float_uint);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_FLOAT, value_transform_float_float);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_DOUBLE, value_transform_float_double);
|
||||
g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_STRING, value_transform_float_string);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_CHAR, value_transform_double_s8);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UCHAR, value_transform_double_u8);
|
||||
SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_BOOLEAN, value_transform_double_bool);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_INT, value_transform_double_int);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UINT, value_transform_double_uint);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_LONG, value_transform_double_long);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_ULONG, value_transform_double_ulong);
|
||||
SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_ENUM, value_transform_double_int);
|
||||
SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_FLAGS, value_transform_double_uint);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_FLOAT, value_transform_double_float);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_DOUBLE, value_transform_double_double);
|
||||
g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_STRING, value_transform_double_string);
|
||||
/* string types */
|
||||
g_value_register_transform_func (G_TYPE_STRING, G_TYPE_STRING, value_transform_string_string);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -25,27 +25,28 @@
|
||||
|
||||
#include "gvaluecollector.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h> /* qsort() */
|
||||
|
||||
|
||||
/* --- value functions --- */
|
||||
static void
|
||||
value_long0_init (GValue *value)
|
||||
value_init_long0 (GValue *value)
|
||||
{
|
||||
value->data[0].v_long = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
value_long0_copy (const GValue *src_value,
|
||||
value_copy_long0 (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_long = src_value->data[0].v_long;
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_char_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_char (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gint8 *int8_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -58,10 +59,10 @@ value_char_lcopy_value (const GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_boolean_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_boolean (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gboolean *bool_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -74,10 +75,10 @@ value_boolean_lcopy_value (const GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_int_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_collect_int (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
value->data[0].v_int = collect_values[0].v_int;
|
||||
|
||||
@ -85,10 +86,10 @@ value_int_collect_value (GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_int_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_int (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gint *int_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -101,10 +102,10 @@ value_int_lcopy_value (const GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_long_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_collect_long (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
value->data[0].v_long = collect_values[0].v_long;
|
||||
|
||||
@ -112,10 +113,10 @@ value_long_collect_value (GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_long_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_long (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
glong *long_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -128,23 +129,23 @@ value_long_lcopy_value (const GValue *value,
|
||||
}
|
||||
|
||||
static void
|
||||
value_float_init (GValue *value)
|
||||
value_init_float (GValue *value)
|
||||
{
|
||||
value->data[0].v_float = 0.0;
|
||||
}
|
||||
|
||||
static void
|
||||
value_float_copy (const GValue *src_value,
|
||||
value_copy_float (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_float = src_value->data[0].v_float;
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_float_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_collect_float (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
value->data[0].v_float = collect_values[0].v_double;
|
||||
|
||||
@ -152,10 +153,10 @@ value_float_collect_value (GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_float_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_float (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gfloat *float_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -168,23 +169,23 @@ value_float_lcopy_value (const GValue *value,
|
||||
}
|
||||
|
||||
static void
|
||||
value_double_init (GValue *value)
|
||||
value_init_double (GValue *value)
|
||||
{
|
||||
value->data[0].v_double = 0.0;
|
||||
}
|
||||
|
||||
static void
|
||||
value_double_copy (const GValue *src_value,
|
||||
value_copy_double (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_double = src_value->data[0].v_double;
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_double_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_collect_double (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
value->data[0].v_double = collect_values[0].v_double;
|
||||
|
||||
@ -192,10 +193,10 @@ value_double_collect_value (GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_double_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_double (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gdouble *double_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -208,30 +209,30 @@ value_double_lcopy_value (const GValue *value,
|
||||
}
|
||||
|
||||
static void
|
||||
value_string_init (GValue *value)
|
||||
value_init_string (GValue *value)
|
||||
{
|
||||
value->data[0].v_pointer = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
value_string_free_value (GValue *value)
|
||||
value_free_string (GValue *value)
|
||||
{
|
||||
if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
||||
g_free (value->data[0].v_pointer);
|
||||
}
|
||||
|
||||
static void
|
||||
value_string_copy_value (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
value_copy_string (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_string_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_collect_string (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
if (!collect_values[0].v_pointer)
|
||||
value->data[0].v_pointer = NULL;
|
||||
@ -247,10 +248,10 @@ value_string_collect_value (GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_string_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_string (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gchar **string_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -268,29 +269,29 @@ value_string_lcopy_value (const GValue *value,
|
||||
}
|
||||
|
||||
static void
|
||||
value_pointer_init (GValue *value)
|
||||
value_init_pointer (GValue *value)
|
||||
{
|
||||
value->data[0].v_pointer = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
value_pointer_copy (const GValue *src_value,
|
||||
value_copy_pointer (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
value_pointer_peek_pointer (const GValue *value)
|
||||
value_peek_pointer0 (const GValue *value)
|
||||
{
|
||||
return value->data[0].v_pointer;
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_pointer_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_collect_pointer (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
value->data[0].v_pointer = collect_values[0].v_pointer;
|
||||
|
||||
@ -298,10 +299,10 @@ value_pointer_collect_value (GValue *value,
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_pointer_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
value_lcopy_pointer (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gpointer *pointer_p = collect_values[0].v_pointer;
|
||||
|
||||
@ -313,59 +314,6 @@ value_pointer_lcopy_value (const GValue *value,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
value_ccallback_init (GValue *value)
|
||||
{
|
||||
value->data[0].v_pointer = NULL;
|
||||
value->data[1].v_pointer = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
value_ccallback_copy (const GValue *src_value,
|
||||
GValue *dest_value)
|
||||
{
|
||||
dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
|
||||
dest_value->data[1].v_pointer = src_value->data[1].v_pointer;
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_ccallback_collect_value (GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gchar *error = NULL;
|
||||
|
||||
if (!collect_values[0].v_pointer)
|
||||
error = g_strconcat ("invalid (NULL) pointer callback function for value type `",
|
||||
G_VALUE_TYPE_NAME (value),
|
||||
"'",
|
||||
NULL);
|
||||
value->data[0].v_pointer = collect_values[0].v_pointer;
|
||||
value->data[1].v_pointer = collect_values[1].v_pointer;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static gchar*
|
||||
value_ccallback_lcopy_value (const GValue *value,
|
||||
guint n_collect_values,
|
||||
GTypeCValue *collect_values,
|
||||
guint collect_flags)
|
||||
{
|
||||
gpointer *callback_p = collect_values[0].v_pointer;
|
||||
gpointer *data_p = collect_values[1].v_pointer;
|
||||
|
||||
if (!callback_p || !data_p)
|
||||
return g_strdup_printf ("%s location for `%s' passed as NULL",
|
||||
callback_p ? "data" : "callback",
|
||||
G_VALUE_TYPE_NAME (value));
|
||||
*callback_p = value->data[0].v_pointer;
|
||||
*data_p = value->data[1].v_pointer;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* --- type initialization --- */
|
||||
void
|
||||
@ -390,14 +338,14 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_long0_init, /* value_init */
|
||||
value_init_long0, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_long0_copy, /* value_copy */
|
||||
value_copy_long0, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"i", /* collect_format */
|
||||
value_int_collect_value, /* collect_value */
|
||||
value_collect_int, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_char_lcopy_value, /* lcopy_value */
|
||||
value_lcopy_char, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0);
|
||||
@ -410,14 +358,14 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_long0_init, /* value_init */
|
||||
value_init_long0, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_long0_copy, /* value_copy */
|
||||
value_copy_long0, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"i", /* collect_format */
|
||||
value_int_collect_value, /* collect_value */
|
||||
value_collect_int, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_boolean_lcopy_value, /* lcopy_value */
|
||||
value_lcopy_boolean, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_BOOLEAN, "gboolean", &info, &finfo, 0);
|
||||
@ -428,14 +376,14 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_long0_init, /* value_init */
|
||||
value_init_long0, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_long0_copy, /* value_copy */
|
||||
value_copy_long0, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"i", /* collect_format */
|
||||
value_int_collect_value, /* collect_value */
|
||||
value_collect_int, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_int_lcopy_value, /* lcopy_value */
|
||||
value_lcopy_int, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_INT, "gint", &info, &finfo, 0);
|
||||
@ -448,14 +396,14 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_long0_init, /* value_init */
|
||||
value_init_long0, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_long0_copy, /* value_copy */
|
||||
value_copy_long0, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"l", /* collect_format */
|
||||
value_long_collect_value, /* collect_value */
|
||||
value_collect_long, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_long_lcopy_value, /* lcopy_value */
|
||||
value_lcopy_long, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_LONG, "glong", &info, &finfo, 0);
|
||||
@ -468,14 +416,14 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_float_init, /* value_init */
|
||||
value_init_float, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_float_copy, /* value_copy */
|
||||
value_copy_float, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"d", /* collect_format */
|
||||
value_float_collect_value, /* collect_value */
|
||||
value_collect_float, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_float_lcopy_value, /* lcopy_value */
|
||||
value_lcopy_float, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_FLOAT, "gfloat", &info, &finfo, 0);
|
||||
@ -486,14 +434,14 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_double_init, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_double_copy, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"d", /* collect_format */
|
||||
value_double_collect_value, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_double_lcopy_value, /* lcopy_value */
|
||||
value_init_double, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_copy_double, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"d", /* collect_format */
|
||||
value_collect_double, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_lcopy_double, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_DOUBLE, "gdouble", &info, &finfo, 0);
|
||||
@ -504,14 +452,14 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_string_init, /* value_init */
|
||||
value_string_free_value, /* value_free */
|
||||
value_string_copy_value, /* value_copy */
|
||||
value_pointer_peek_pointer, /* value_peek_pointer */
|
||||
"p", /* collect_format */
|
||||
value_string_collect_value, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_string_lcopy_value, /* lcopy_value */
|
||||
value_init_string, /* value_init */
|
||||
value_free_string, /* value_free */
|
||||
value_copy_string, /* value_copy */
|
||||
value_peek_pointer0, /* value_peek_pointer */
|
||||
"p", /* collect_format */
|
||||
value_collect_string, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_lcopy_string, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_STRING, "gstring", &info, &finfo, 0);
|
||||
@ -522,71 +470,53 @@ g_value_types_init (void) /* sync with gtype.c */
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_pointer_init, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_pointer_copy, /* value_copy */
|
||||
value_pointer_peek_pointer, /* value_peek_pointer */
|
||||
"p", /* collect_format */
|
||||
value_pointer_collect_value, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_pointer_lcopy_value, /* lcopy_value */
|
||||
value_init_pointer, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_copy_pointer, /* value_copy */
|
||||
value_peek_pointer0, /* value_peek_pointer */
|
||||
"p", /* collect_format */
|
||||
value_collect_pointer, /* collect_value */
|
||||
"p", /* lcopy_format */
|
||||
value_lcopy_pointer, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_POINTER, "gpointer", &info, &finfo, 0);
|
||||
g_assert (type == G_TYPE_POINTER);
|
||||
}
|
||||
|
||||
/* G_TYPE_CCALLBACK
|
||||
*/
|
||||
{
|
||||
static const GTypeValueTable value_table = {
|
||||
value_ccallback_init, /* value_init */
|
||||
NULL, /* value_free */
|
||||
value_ccallback_copy, /* value_copy */
|
||||
NULL, /* value_peek_pointer */
|
||||
"pp", /* collect_format */
|
||||
value_ccallback_collect_value, /* collect_value */
|
||||
"pp", /* lcopy_format */
|
||||
value_ccallback_lcopy_value, /* lcopy_value */
|
||||
};
|
||||
info.value_table = &value_table;
|
||||
type = g_type_register_fundamental (G_TYPE_CCALLBACK, "GCCallback", &info, &finfo, 0);
|
||||
g_assert (type == G_TYPE_CCALLBACK);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* --- GValue functions --- */
|
||||
void
|
||||
g_value_set_char (GValue *value,
|
||||
gint8 v_char)
|
||||
gchar v_char)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_CHAR (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_CHAR (value));
|
||||
|
||||
value->data[0].v_int = v_char;
|
||||
}
|
||||
|
||||
gint8
|
||||
gchar
|
||||
g_value_get_char (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_CHAR (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_CHAR (value), 0);
|
||||
|
||||
return value->data[0].v_int;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_uchar (GValue *value,
|
||||
guint8 v_uchar)
|
||||
guchar v_uchar)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_UCHAR (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_UCHAR (value));
|
||||
|
||||
value->data[0].v_uint = v_uchar;
|
||||
}
|
||||
|
||||
guint8
|
||||
guchar
|
||||
g_value_get_uchar (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_UCHAR (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_UCHAR (value), 0);
|
||||
|
||||
return value->data[0].v_uint;
|
||||
}
|
||||
@ -595,15 +525,15 @@ void
|
||||
g_value_set_boolean (GValue *value,
|
||||
gboolean v_boolean)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_BOOLEAN (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value));
|
||||
|
||||
value->data[0].v_int = v_boolean;
|
||||
value->data[0].v_int = v_boolean != FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
g_value_get_boolean (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_BOOLEAN (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (value), 0);
|
||||
|
||||
return value->data[0].v_int;
|
||||
}
|
||||
@ -612,7 +542,7 @@ void
|
||||
g_value_set_int (GValue *value,
|
||||
gint v_int)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_INT (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_INT (value));
|
||||
|
||||
value->data[0].v_int = v_int;
|
||||
}
|
||||
@ -620,7 +550,7 @@ g_value_set_int (GValue *value,
|
||||
gint
|
||||
g_value_get_int (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_INT (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_INT (value), 0);
|
||||
|
||||
return value->data[0].v_int;
|
||||
}
|
||||
@ -629,7 +559,7 @@ void
|
||||
g_value_set_uint (GValue *value,
|
||||
guint v_uint)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_UINT (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_UINT (value));
|
||||
|
||||
value->data[0].v_uint = v_uint;
|
||||
}
|
||||
@ -637,7 +567,7 @@ g_value_set_uint (GValue *value,
|
||||
guint
|
||||
g_value_get_uint (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_UINT (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_UINT (value), 0);
|
||||
|
||||
return value->data[0].v_uint;
|
||||
}
|
||||
@ -646,7 +576,7 @@ void
|
||||
g_value_set_long (GValue *value,
|
||||
glong v_long)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_LONG (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_LONG (value));
|
||||
|
||||
value->data[0].v_long = v_long;
|
||||
}
|
||||
@ -654,7 +584,7 @@ g_value_set_long (GValue *value,
|
||||
glong
|
||||
g_value_get_long (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_LONG (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_LONG (value), 0);
|
||||
|
||||
return value->data[0].v_long;
|
||||
}
|
||||
@ -663,7 +593,7 @@ void
|
||||
g_value_set_ulong (GValue *value,
|
||||
gulong v_ulong)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_ULONG (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_ULONG (value));
|
||||
|
||||
value->data[0].v_ulong = v_ulong;
|
||||
}
|
||||
@ -671,7 +601,7 @@ g_value_set_ulong (GValue *value,
|
||||
gulong
|
||||
g_value_get_ulong (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_ULONG (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_ULONG (value), 0);
|
||||
|
||||
return value->data[0].v_ulong;
|
||||
}
|
||||
@ -680,7 +610,7 @@ void
|
||||
g_value_set_float (GValue *value,
|
||||
gfloat v_float)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_FLOAT (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_FLOAT (value));
|
||||
|
||||
value->data[0].v_float = v_float;
|
||||
}
|
||||
@ -688,7 +618,7 @@ g_value_set_float (GValue *value,
|
||||
gfloat
|
||||
g_value_get_float (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_FLOAT (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (value), 0);
|
||||
|
||||
return value->data[0].v_float;
|
||||
}
|
||||
@ -697,7 +627,7 @@ void
|
||||
g_value_set_double (GValue *value,
|
||||
gdouble v_double)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_DOUBLE (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value));
|
||||
|
||||
value->data[0].v_double = v_double;
|
||||
}
|
||||
@ -705,7 +635,7 @@ g_value_set_double (GValue *value,
|
||||
gdouble
|
||||
g_value_get_double (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_DOUBLE (value), 0);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_DOUBLE (value), 0);
|
||||
|
||||
return value->data[0].v_double;
|
||||
}
|
||||
@ -714,7 +644,7 @@ void
|
||||
g_value_set_string (GValue *value,
|
||||
const gchar *v_string)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_STRING (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_STRING (value));
|
||||
|
||||
if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
|
||||
value->data[1].v_uint = 0;
|
||||
@ -727,7 +657,7 @@ void
|
||||
g_value_set_static_string (GValue *value,
|
||||
const gchar *v_string)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_STRING (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_STRING (value));
|
||||
|
||||
if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
||||
g_free (value->data[0].v_pointer);
|
||||
@ -735,10 +665,23 @@ g_value_set_static_string (GValue *value,
|
||||
value->data[0].v_pointer = (gchar*) v_string;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_string_take_ownership (GValue *value,
|
||||
gchar *v_string)
|
||||
{
|
||||
g_return_if_fail (G_VALUE_HOLDS_STRING (value));
|
||||
|
||||
if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
|
||||
value->data[1].v_uint = 0;
|
||||
else
|
||||
g_free (value->data[0].v_pointer);
|
||||
value->data[0].v_pointer = v_string;
|
||||
}
|
||||
|
||||
G_CONST_RETURN gchar*
|
||||
g_value_get_string (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
|
||||
|
||||
return value->data[0].v_pointer;
|
||||
}
|
||||
@ -746,7 +689,7 @@ g_value_get_string (const GValue *value)
|
||||
gchar*
|
||||
g_value_dup_string (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
|
||||
|
||||
return g_strdup (value->data[0].v_pointer);
|
||||
}
|
||||
@ -755,7 +698,7 @@ void
|
||||
g_value_set_pointer (GValue *value,
|
||||
gpointer v_pointer)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_POINTER (value));
|
||||
g_return_if_fail (G_VALUE_HOLDS_POINTER (value));
|
||||
|
||||
value->data[0].v_pointer = v_pointer;
|
||||
}
|
||||
@ -763,31 +706,7 @@ g_value_set_pointer (GValue *value,
|
||||
gpointer
|
||||
g_value_get_pointer (const GValue *value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE_POINTER (value), NULL);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_POINTER (value), NULL);
|
||||
|
||||
return value->data[0].v_pointer;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_set_ccallback (GValue *value,
|
||||
gpointer callback_func,
|
||||
gpointer callback_data)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_CCALLBACK (value));
|
||||
|
||||
value->data[0].v_pointer = callback_func;
|
||||
value->data[1].v_pointer = callback_data;
|
||||
}
|
||||
|
||||
void
|
||||
g_value_get_ccallback (const GValue *value,
|
||||
gpointer *callback_func,
|
||||
gpointer *callback_data)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE_CCALLBACK (value));
|
||||
|
||||
if (callback_func)
|
||||
*callback_func = value->data[0].v_pointer;
|
||||
if (callback_data)
|
||||
*callback_data = value->data[1].v_pointer;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* GObject - GLib Type, Object, Parameter and Signal Library
|
||||
* Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
||||
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@ -31,63 +31,63 @@ extern "C" {
|
||||
|
||||
|
||||
/* --- type macros --- */
|
||||
#define G_IS_VALUE_CHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_CHAR))
|
||||
#define G_IS_VALUE_UCHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UCHAR))
|
||||
#define G_IS_VALUE_BOOLEAN(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOOLEAN))
|
||||
#define G_IS_VALUE_INT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT))
|
||||
#define G_IS_VALUE_UINT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT))
|
||||
#define G_IS_VALUE_LONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_LONG))
|
||||
#define G_IS_VALUE_ULONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ULONG))
|
||||
#define G_IS_VALUE_FLOAT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT))
|
||||
#define G_IS_VALUE_DOUBLE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_DOUBLE))
|
||||
#define G_IS_VALUE_STRING(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_STRING))
|
||||
#define G_IS_VALUE_POINTER(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_POINTER))
|
||||
#define G_IS_VALUE_CCALLBACK(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_CCALLBACK))
|
||||
#define G_VALUE_HOLDS_CHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_CHAR))
|
||||
#define G_VALUE_HOLDS_UCHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UCHAR))
|
||||
#define G_VALUE_HOLDS_BOOLEAN(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOOLEAN))
|
||||
#define G_VALUE_HOLDS_INT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT))
|
||||
#define G_VALUE_HOLDS_UINT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT))
|
||||
#define G_VALUE_HOLDS_LONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_LONG))
|
||||
#define G_VALUE_HOLDS_ULONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ULONG))
|
||||
#define G_VALUE_HOLDS_FLOAT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT))
|
||||
#define G_VALUE_HOLDS_DOUBLE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_DOUBLE))
|
||||
#define G_VALUE_HOLDS_STRING(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_STRING))
|
||||
#define G_VALUE_HOLDS_POINTER(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_POINTER))
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
void g_value_set_char (GValue *value,
|
||||
gint8 v_char);
|
||||
gint8 g_value_get_char (const GValue *value);
|
||||
void g_value_set_uchar (GValue *value,
|
||||
guint8 v_uchar);
|
||||
guint8 g_value_get_uchar (const GValue *value);
|
||||
void g_value_set_boolean (GValue *value,
|
||||
void g_value_set_char (GValue *value,
|
||||
gchar v_char);
|
||||
gchar g_value_get_char (const GValue *value);
|
||||
void g_value_set_uchar (GValue *value,
|
||||
guchar v_uchar);
|
||||
guchar g_value_get_uchar (const GValue *value);
|
||||
void g_value_set_boolean (GValue *value,
|
||||
gboolean v_boolean);
|
||||
gboolean g_value_get_boolean (const GValue *value);
|
||||
void g_value_set_int (GValue *value,
|
||||
gint v_int);
|
||||
gint g_value_get_int (const GValue *value);
|
||||
void g_value_set_uint (GValue *value,
|
||||
guint v_uint);
|
||||
guint g_value_get_uint (const GValue *value);
|
||||
void g_value_set_long (GValue *value,
|
||||
glong v_long);
|
||||
glong g_value_get_long (const GValue *value);
|
||||
void g_value_set_ulong (GValue *value,
|
||||
gulong v_ulong);
|
||||
gulong g_value_get_ulong (const GValue *value);
|
||||
void g_value_set_float (GValue *value,
|
||||
gfloat v_float);
|
||||
gfloat g_value_get_float (const GValue *value);
|
||||
void g_value_set_double (GValue *value,
|
||||
gboolean g_value_get_boolean (const GValue *value);
|
||||
void g_value_set_int (GValue *value,
|
||||
gint v_int);
|
||||
gint g_value_get_int (const GValue *value);
|
||||
void g_value_set_uint (GValue *value,
|
||||
guint v_uint);
|
||||
guint g_value_get_uint (const GValue *value);
|
||||
void g_value_set_long (GValue *value,
|
||||
glong v_long);
|
||||
glong g_value_get_long (const GValue *value);
|
||||
void g_value_set_ulong (GValue *value,
|
||||
gulong v_ulong);
|
||||
gulong g_value_get_ulong (const GValue *value);
|
||||
void g_value_set_float (GValue *value,
|
||||
gfloat v_float);
|
||||
gfloat g_value_get_float (const GValue *value);
|
||||
void g_value_set_double (GValue *value,
|
||||
gdouble v_double);
|
||||
gdouble g_value_get_double (const GValue *value);
|
||||
void g_value_set_string (GValue *value,
|
||||
gdouble g_value_get_double (const GValue *value);
|
||||
void g_value_set_string (GValue *value,
|
||||
const gchar *v_string);
|
||||
void g_value_set_static_string (GValue *value,
|
||||
void g_value_set_static_string (GValue *value,
|
||||
const gchar *v_string);
|
||||
G_CONST_RETURN gchar* g_value_get_string (const GValue *value);
|
||||
gchar* g_value_dup_string (const GValue *value);
|
||||
void g_value_set_pointer (GValue *value,
|
||||
G_CONST_RETURN gchar* g_value_get_string (const GValue *value);
|
||||
gchar* g_value_dup_string (const GValue *value);
|
||||
void g_value_set_pointer (GValue *value,
|
||||
gpointer v_pointer);
|
||||
gpointer g_value_get_pointer (const GValue *value);
|
||||
void g_value_set_ccallback (GValue *value,
|
||||
gpointer callback_func,
|
||||
gpointer callback_data);
|
||||
void g_value_get_ccallback (const GValue *value,
|
||||
gpointer *callback_func,
|
||||
gpointer *callback_data);
|
||||
gpointer g_value_get_pointer (const GValue *value);
|
||||
|
||||
|
||||
/* --- marshaller specific --- */
|
||||
void g_value_set_string_take_ownership (GValue *value,
|
||||
gchar *v_string);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
2
gqsort.c
2
gqsort.c
@ -96,7 +96,7 @@ void
|
||||
g_qsort_with_data (gconstpointer pbase,
|
||||
gint total_elems,
|
||||
size_t size,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
register char *base_ptr = (char *) pbase;
|
||||
|
2
gqsort.h
2
gqsort.h
@ -35,7 +35,7 @@ G_BEGIN_DECLS
|
||||
void g_qsort_with_data (gconstpointer pbase,
|
||||
gint total_elems,
|
||||
size_t size,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
|
||||
G_END_DECLS
|
||||
|
4
gslist.c
4
gslist.c
@ -634,7 +634,7 @@ g_slist_sort_merge (GSList *l1,
|
||||
while (l1 && l2)
|
||||
{
|
||||
if (use_data)
|
||||
cmp = ((GCompareFuncData) compare_func) (l1->data, l2->data, user_data);
|
||||
cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
|
||||
else
|
||||
cmp = ((GCompareFunc) compare_func) (l1->data, l2->data);
|
||||
|
||||
@ -695,7 +695,7 @@ g_slist_sort (GSList *list,
|
||||
|
||||
GSList *
|
||||
g_slist_sort_with_data (GSList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data)
|
||||
{
|
||||
return g_slist_sort_real (list, (GFunc) compare_func, TRUE, user_data);
|
||||
|
2
gslist.h
2
gslist.h
@ -88,7 +88,7 @@ void g_slist_foreach (GSList *list,
|
||||
GSList* g_slist_sort (GSList *list,
|
||||
GCompareFunc compare_func);
|
||||
GSList* g_slist_sort_with_data (GSList *list,
|
||||
GCompareFuncData compare_func,
|
||||
GCompareDataFunc compare_func,
|
||||
gpointer user_data);
|
||||
gpointer g_slist_nth_data (GSList *list,
|
||||
guint n);
|
||||
|
22
gstring.c
22
gstring.c
@ -565,9 +565,9 @@ g_string_up (GString *fstring)
|
||||
}
|
||||
|
||||
static void
|
||||
g_string_sprintfa_int (GString *string,
|
||||
const gchar *fmt,
|
||||
va_list args)
|
||||
g_string_printfa_internal (GString *string,
|
||||
const gchar *fmt,
|
||||
va_list args)
|
||||
{
|
||||
gchar *buffer;
|
||||
|
||||
@ -577,27 +577,27 @@ g_string_sprintfa_int (GString *string,
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintf (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
g_string_printf (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
g_string_truncate (string, 0);
|
||||
|
||||
va_start (args, fmt);
|
||||
g_string_sprintfa_int (string, fmt, args);
|
||||
g_string_printfa_internal (string, fmt, args);
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintfa (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
g_string_printfa (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start (args, fmt);
|
||||
g_string_sprintfa_int (string, fmt, args);
|
||||
g_string_printfa_internal (string, fmt, args);
|
||||
va_end (args);
|
||||
}
|
||||
|
@ -94,12 +94,15 @@ GString* g_string_erase (GString *string,
|
||||
gint len);
|
||||
GString* g_string_down (GString *string);
|
||||
GString* g_string_up (GString *string);
|
||||
void g_string_sprintf (GString *string,
|
||||
void g_string_printf (GString *string,
|
||||
const gchar *format,
|
||||
...) G_GNUC_PRINTF (2, 3);
|
||||
void g_string_sprintfa (GString *string,
|
||||
void g_string_printfa (GString *string,
|
||||
const gchar *format,
|
||||
...) G_GNUC_PRINTF (2, 3);
|
||||
/* compatibility */
|
||||
#define g_string_sprintf g_string_printf
|
||||
#define g_string_sprintfa g_string_printfa
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
18
gtree.c
18
gtree.c
@ -41,7 +41,7 @@ typedef struct _GTreeNode GTreeNode;
|
||||
struct _GRealTree
|
||||
{
|
||||
GTreeNode *root;
|
||||
GCompareFuncData key_compare;
|
||||
GCompareDataFunc key_compare;
|
||||
gpointer key_compare_data;
|
||||
};
|
||||
|
||||
@ -59,13 +59,13 @@ static GTreeNode* g_tree_node_new (gpointer key,
|
||||
gpointer value);
|
||||
static void g_tree_node_destroy (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer comp_data,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
gint *inserted);
|
||||
static GTreeNode* g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer comp_data,
|
||||
gconstpointer key);
|
||||
static GTreeNode* g_tree_node_balance (GTreeNode *node);
|
||||
@ -76,7 +76,7 @@ static GTreeNode* g_tree_node_restore_left_balance (GTreeNode *node,
|
||||
static GTreeNode* g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
gint old_balance);
|
||||
static gpointer g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer comp_data,
|
||||
gconstpointer key);
|
||||
static gint g_tree_node_count (GTreeNode *node);
|
||||
@ -157,7 +157,7 @@ g_tree_node_destroy (GTreeNode *node)
|
||||
}
|
||||
}
|
||||
|
||||
GTree* g_tree_new_udata(GCompareFuncData key_compare_func,
|
||||
GTree* g_tree_new_udata(GCompareDataFunc key_compare_func,
|
||||
gpointer key_compare_data)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
@ -175,7 +175,7 @@ GTree* g_tree_new_udata(GCompareFuncData key_compare_func,
|
||||
GTree*
|
||||
g_tree_new (GCompareFunc key_compare_func)
|
||||
{
|
||||
return g_tree_new_udata ((GCompareFuncData) key_compare_func, NULL);
|
||||
return g_tree_new_udata ((GCompareDataFunc) key_compare_func, NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -322,7 +322,7 @@ g_tree_nnodes (GTree *tree)
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer compare_data,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
@ -393,7 +393,7 @@ g_tree_node_insert (GTreeNode *node,
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer compare_data,
|
||||
gconstpointer key)
|
||||
{
|
||||
@ -526,7 +526,7 @@ g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
|
||||
static gpointer
|
||||
g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFuncData compare,
|
||||
GCompareDataFunc compare,
|
||||
gpointer compare_data,
|
||||
gconstpointer key)
|
||||
{
|
||||
|
2
gtree.h
2
gtree.h
@ -40,7 +40,7 @@ typedef gint (*GTraverseFunc) (gpointer key,
|
||||
/* Balanced binary trees
|
||||
*/
|
||||
GTree* g_tree_new (GCompareFunc key_compare_func);
|
||||
GTree* g_tree_new_with_data (GCompareFuncData key_compare_func,
|
||||
GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func,
|
||||
gpointer user_data);
|
||||
void g_tree_destroy (GTree *tree);
|
||||
void g_tree_insert (GTree *tree,
|
||||
|
2
gtypes.h
2
gtypes.h
@ -69,7 +69,7 @@ typedef const void *gconstpointer;
|
||||
|
||||
typedef gint (*GCompareFunc) (gconstpointer a,
|
||||
gconstpointer b);
|
||||
typedef gint (*GCompareFuncData) (gconstpointer a,
|
||||
typedef gint (*GCompareDataFunc) (gconstpointer a,
|
||||
gconstpointer b,
|
||||
gpointer user_data);
|
||||
typedef gboolean (*GEqualFunc) (gconstpointer a,
|
||||
|
Loading…
Reference in New Issue
Block a user