[dia] Old DiagramTree ported to new change signaling mechanism
- From: Hans Breuer <hans src gnome org>
- To: svn-commits-list gnome org
- Subject: [dia] Old DiagramTree ported to new change signaling mechanism
- Date: Sun, 31 May 2009 05:46:51 -0400 (EDT)
commit 9e65e51530ac0c41e0e9e807c2cf4b1c6985a055
Author: Hans Breuer <hans breuer org>
Date: Sat Apr 25 13:39:39 2009 +0200
Old DiagramTree ported to new change signaling mechanism
To simplify the removal of the old DiagramTree it got ported to
the new signaling mechanism via DiaApplication. Instead of
sprinkling a lot of diagram_tree_*() calls through the code the
DiagramTree object just listens on DiaApplication and Diagram
to react on the relevant changes.
Stuff like LayerDialog and 'recent files' should be ported, too.
---
app/Makefile.am | 3 +
app/commands.c | 4 +-
app/dia-application.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++
app/dia-application.h | 15 ++++++
app/diagram.c | 21 ++++----
app/diagram_tree.c | 81 ++++++++++++++++++++++++++++++-
app/diagram_tree.h | 20 -------
app/diagram_tree_view.c | 3 +
app/makefile.msc | 2 +
app/textedit.c | 1 +
app/undo.c | 27 ++--------
lib/diamarshal.list | 2 +
lib/layer.c | 21 +++++++-
lib/libdia.def | 3 +
14 files changed, 273 insertions(+), 56 deletions(-)
diff --git a/app/Makefile.am b/app/Makefile.am
index 6f18451..2d87c7b 100644
--- a/app/Makefile.am
+++ b/app/Makefile.am
@@ -189,6 +189,9 @@ dia_core_files = \
diagram_tree_menu_callbacks.h \
diagram_tree_menu_callbacks.c \
\
+ dia-application.h \
+ dia-application.c \
+ \
diagram_tree_model.c \
diagram_tree_model.h \
diagram_tree_view.c \
diff --git a/app/commands.c b/app/commands.c
index 40b7dc1..f81d6ac 100644
--- a/app/commands.c
+++ b/app/commands.c
@@ -38,6 +38,7 @@
#include <textedit.h>
#include <focus.h>
#include "confirm.h"
+#include "dia-application.h"
/** Functions called on menu selects.
* Note that GTK (at least up to 2.12) doesn't disable the keyboard shortcuts
@@ -86,7 +87,6 @@ ShellExecuteA (long hwnd,
#include "lib/properties.h"
#include "lib/parent.h"
#include "dia-props.h"
-#include "diagram_tree_window.h"
#include "authors.h" /* master contributors data */
void
@@ -151,7 +151,7 @@ file_new_callback (GtkAction *action)
filename = g_filename_from_utf8(name, -1, NULL, NULL, NULL);
dia = new_diagram(filename);
ddisp = new_display(dia);
- diagram_tree_add(diagram_tree(), dia);
+ dia_diagram_add (dia); /* notify DiagramTree etc. */
g_free (name);
g_free (filename);
}
diff --git a/app/dia-application.c b/app/dia-application.c
new file mode 100644
index 0000000..fed6f88
--- /dev/null
+++ b/app/dia-application.c
@@ -0,0 +1,126 @@
+/*
+create_diagram_tree_window
+diagram_tree
+diagtree_show_callback
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "dia-application.h"
+#include "display.h"
+
+#include <lib/diamarshal.h>
+
+enum {
+ DIAGRAM_ADD,
+ DIAGRAM_CHANGE,
+ DIAGRAM_REMOVE,
+
+ DISPLAY_ADD,
+ DISPLAY_CHANGE,
+ DISPLAY_REMOVE,
+
+ LAST_SIGNAL
+};
+
+static guint _dia_application_signals[LAST_SIGNAL] = { 0, };
+
+typedef struct _DiaApplicationClass DiaApplicationClass;
+struct _DiaApplicationClass
+{
+ GObjectClass parent_class;
+
+ /* signalsing global state changes */
+ void (*diagram_add) (DiaApplication *app, Diagram *diagram);
+ void (*diagram_change) (DiaApplication *app, Diagram *diagram, guint flags);
+ void (*diagram_remove) (DiaApplication *app, Diagram *diagram);
+
+ void (*display_add) (DiaApplication *app, DDisplay *display);
+ void (*display_change) (DiaApplication *app, DDisplay *display, guint flags);
+ void (*display_remove) (DiaApplication *app, DDisplay *display);
+};
+
+/**
+ * The central place managing global state changes like (dis-)appearance of diagrams
+ */
+struct _DiaApplication
+{
+ GObject parent;
+};
+
+#define DIA_TYPE_APPLICATION (dia_application_get_type ())
+
+G_DEFINE_TYPE (DiaApplication, dia_application, G_TYPE_OBJECT);
+
+static void
+dia_application_class_init (DiaApplicationClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ _dia_application_signals[DIAGRAM_ADD] =
+ g_signal_new ("diagram_add",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (DiaApplicationClass, diagram_add),
+ NULL, NULL,
+ dia_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1,
+ DIA_TYPE_DIAGRAM);
+ _dia_application_signals[DIAGRAM_CHANGE] =
+ g_signal_new ("diagram_change",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (DiaApplicationClass, diagram_change),
+ NULL, NULL,
+ dia_marshal_VOID__OBJECT_UINT_POINTER,
+ G_TYPE_NONE,
+ 3,
+ DIA_TYPE_DIAGRAM, G_TYPE_UINT, G_TYPE_POINTER);
+ _dia_application_signals[DIAGRAM_REMOVE] =
+ g_signal_new ("diagram_remove",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (DiaApplicationClass, diagram_remove),
+ NULL, NULL,
+ dia_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1,
+ DIA_TYPE_DIAGRAM);
+}
+
+static void
+dia_application_init (DiaApplication *app)
+{
+}
+
+/* ensure the singleton is available */
+DiaApplication *
+dia_application_get (void)
+{
+ static DiaApplication *app = NULL;
+
+ if (!app)
+ app = g_object_new (DIA_TYPE_APPLICATION, NULL);
+
+ return app;
+}
+
+void
+dia_diagram_add (Diagram *dia)
+{
+ g_signal_emit (dia_application_get (), _dia_application_signals[DIAGRAM_ADD], 0, dia);
+}
+void
+dia_diagram_remove (Diagram *dia)
+{
+ g_signal_emit (dia_application_get (), _dia_application_signals[DIAGRAM_REMOVE], 0, dia);
+}
+
+void
+dia_diagram_change (Diagram *dia, guint flags, gpointer object)
+{
+ g_signal_emit (dia_application_get (), _dia_application_signals[DIAGRAM_CHANGE], 0, dia, flags, object);
+}
diff --git a/app/dia-application.h b/app/dia-application.h
new file mode 100644
index 0000000..dbfdbc1
--- /dev/null
+++ b/app/dia-application.h
@@ -0,0 +1,15 @@
+#include "diagram.h"
+
+typedef struct _DiaApplication DiaApplication;
+
+enum {
+ DIAGRAM_CHANGE_NAME = (1<<0),
+ DIAGRAM_CHANGE_LAYER = (1<<1),
+ DIAGRAM_CHANGE_OBJECT = (1<<2)
+};
+
+DiaApplication * dia_application_get (void);
+
+void dia_diagram_add (Diagram *dia);
+void dia_diagram_change (Diagram *dia, guint flags, gpointer object);
+void dia_diagram_remove (Diagram *dia);
diff --git a/app/diagram.c b/app/diagram.c
index 14e4b01..fb2a292 100644
--- a/app/diagram.c
+++ b/app/diagram.c
@@ -37,7 +37,7 @@
#include "dia_dirs.h"
#include "load_save.h"
#include "recent_files.h"
-#include "diagram_tree_window.h"
+#include "dia-application.h"
#include "autosave.h"
#include "dynamic_refresh.h"
#include "textedit.h"
@@ -112,7 +112,7 @@ diagram_finalize(GObject *object)
undo_destroy(dia->undo);
dia->undo = NULL;
- diagram_tree_remove(diagram_tree(), dia);
+ dia_diagram_remove(dia);
diagram_cleanup_autosave(dia);
@@ -321,7 +321,7 @@ diagram_load(const char *filename, DiaImportFilter *ifilter)
diagram_set_modified(diagram, FALSE);
if (app_is_interactive()) {
recent_file_history_add(filename);
- diagram_tree_add(diagram_tree(), diagram);
+ dia_diagram_add(diagram);
}
}
@@ -659,8 +659,6 @@ diagram_add_object(Diagram *dia, DiaObject *obj)
layer_add_object(dia->data->active_layer, obj);
diagram_modified(dia);
-
- diagram_tree_add_object(diagram_tree(), dia, obj);
}
void
@@ -669,8 +667,6 @@ diagram_add_object_list(Diagram *dia, GList *list)
layer_add_objects(dia->data->active_layer, list);
diagram_modified(dia);
-
- diagram_tree_add_objects(diagram_tree(), dia, list);
}
void
@@ -733,7 +729,7 @@ diagram_selected_break_external(Diagram *dia)
connected_list = g_list_next(connected_list);
}
}
- diagram_tree_remove_object(diagram_tree(), obj);
+ data_emit (dia->data, dia_object_get_parent_layer(obj), obj, "object_remove");
list = g_list_next(list);
}
}
@@ -1504,7 +1500,8 @@ diagram_update_for_filename(Diagram *dia)
layer_dialog_update_diagram_list();
- diagram_tree_update_name(diagram_tree(), dia);
+ /* signal about the change */
+ dia_diagram_change (dia, DIAGRAM_CHANGE_NAME, NULL);
}
/** Returns a string with a 'sensible' (human-readable) name for the
@@ -1535,7 +1532,9 @@ int diagram_modified_exists(void)
return FALSE;
}
-void diagram_object_modified(Diagram *dia, DiaObject *object)
+void
+diagram_object_modified(Diagram *dia, DiaObject *object)
{
- diagram_tree_update_object(diagram_tree(), dia, object);
+ /* signal about the change */
+ dia_diagram_change (dia, DIAGRAM_CHANGE_OBJECT, object);
}
diff --git a/app/diagram_tree.c b/app/diagram_tree.c
index e341bd4..dddd557 100644
--- a/app/diagram_tree.c
+++ b/app/diagram_tree.c
@@ -32,6 +32,7 @@
#include "diagram_tree_menu_callbacks.h"
#include "diagram_tree.h"
#include "persistence.h"
+#include "dia-application.h"
/* delete a tree (the widget is destroyed, but not the diagrams */
static void diagram_tree_delete(DiagramTree *tree);
@@ -63,6 +64,16 @@ find_hidden_type(gconstpointer type, gconstpointer object_type)
static void
update_object(DiagramTree *tree, GtkCTreeNode *node, DiaObject *object);
+static void
+diagram_tree_add_object(DiagramTree *tree, Diagram *diagram, DiaObject *object);
+static void
+diagram_tree_remove_object(DiagramTree *tree, DiaObject *object);
+static void
+diagram_tree_remove_objects(DiagramTree *tree, GList *objects);
+static void
+diagram_tree_update_name(DiagramTree *tree, Diagram *diagram);
+static void
+diagram_tree_update_object(DiagramTree *tree, Diagram *diagram, DiaObject *object);
static void
select_node(DiagramTree *tree, GtkCTreeNode *node, gboolean raise)
@@ -326,6 +337,33 @@ update_diagram_children(DiagramTree *tree, GtkCTreeNode *node,
sort_objects(tree, node);
}
+/* listen to diagram creation */
+static void
+_diagram_add (DiaApplication *app,
+ Diagram *dia,
+ DiagramTree *tree)
+{
+ diagram_tree_add(tree, dia);
+}
+static void
+_diagram_change (DiaApplication *app,
+ Diagram *dia,
+ guint flags,
+ gpointer object,
+ DiagramTree *tree)
+{
+ if (flags & DIAGRAM_CHANGE_NAME)
+ diagram_tree_update_name (tree, dia);
+ if (flags & DIAGRAM_CHANGE_OBJECT)
+ diagram_tree_update_object (tree, dia, object);
+}
+static void
+_diagram_remove (DiaApplication *app,
+ Diagram *dia,
+ DiagramTree *tree)
+{
+ diagram_tree_remove(tree, dia);
+}
/* external interface */
DiagramTree*
diagram_tree_new(GList *diagrams, GtkWindow *window,
@@ -342,6 +380,20 @@ diagram_tree_new(GList *diagrams, GtkWindow *window,
"button_press_event",
G_CALLBACK(button_press_callback),
(gpointer)result);
+
+ g_signal_connect (G_OBJECT (dia_application_get ()),
+ "diagram_add",
+ G_CALLBACK (_diagram_add),
+ result);
+ g_signal_connect (G_OBJECT (dia_application_get ()),
+ "diagram_change",
+ G_CALLBACK (_diagram_change),
+ result);
+ g_signal_connect (G_OBJECT(dia_application_get ()),
+ "diagram_add",
+ G_CALLBACK (_diagram_add),
+ result);
+
while (diagrams) {
diagram_tree_add(result, (Diagram *)diagrams->data);
diagrams = g_list_next(diagrams);
@@ -364,6 +416,27 @@ diagram_tree_delete(DiagramTree *tree)
gtk_widget_destroy(GTK_WIDGET(tree->tree));
}
+static void
+_object_add (DiagramData *dia,
+ Layer *layer,
+ DiaObject *obj,
+ DiagramTree *tree)
+{
+ g_return_if_fail (DIA_DIAGRAM(dia) != NULL);
+
+ diagram_tree_add_object (tree, DIA_DIAGRAM(dia), obj);
+}
+static void
+_object_remove(DiagramData *dia,
+ Layer *layer,
+ DiaObject *obj,
+ DiagramTree *tree)
+{
+ g_return_if_fail (DIA_DIAGRAM(dia) != NULL);
+
+ diagram_tree_remove_object (tree, obj);
+}
+
void
diagram_tree_add(DiagramTree *tree, Diagram *diagram)
{
@@ -378,6 +451,9 @@ diagram_tree_add(DiagramTree *tree, Diagram *diagram)
gtk_ctree_node_set_row_data(tree->tree, node, (gpointer)diagram);
create_diagram_children(tree, node, diagram);
sort_diagrams(tree);
+
+ g_signal_connect (G_OBJECT(diagram), "object_add", G_CALLBACK(_object_add), tree);
+ g_signal_connect (G_OBJECT(diagram), "object_remove", G_CALLBACK(_object_remove), tree);
}
}
}
@@ -391,6 +467,9 @@ diagram_tree_remove(DiagramTree *tree, Diagram *diagram)
&& (node = gtk_ctree_find_by_row_data(tree->tree, NULL,
(gpointer)diagram)))
gtk_ctree_remove_node(tree->tree, node);
+
+ g_signal_handlers_disconnect_by_func (diagram, _object_add, tree);
+ g_signal_handlers_disconnect_by_func (diagram, _object_remove, tree);
}
}
@@ -435,7 +514,7 @@ diagram_tree_update_name(DiagramTree *tree, Diagram *diagram)
}
}
-void
+static void
diagram_tree_add_object(DiagramTree *tree, Diagram *diagram, DiaObject *object)
{
if (tree) {
diff --git a/app/diagram_tree.h b/app/diagram_tree.h
index a71cd1b..bfe609c 100644
--- a/app/diagram_tree.h
+++ b/app/diagram_tree.h
@@ -63,26 +63,6 @@ diagram_tree_update_all(DiagramTree *tree);
extern void
diagram_tree_update(DiagramTree *tree, Diagram *diagram);
-extern void
-diagram_tree_update_name(DiagramTree *tree, Diagram *diagram);
-
-/* add/remove an object in a diagram already contained in the tree */
-extern void
-diagram_tree_add_object(DiagramTree *tree, Diagram *diagram, DiaObject *object);
-
-extern void
-diagram_tree_add_objects(DiagramTree *tree, Diagram *diagram, GList *objects);
-
-extern void
-diagram_tree_remove_object(DiagramTree *tree, DiaObject *object);
-
-extern void
-diagram_tree_remove_objects(DiagramTree *tree, GList *objects);
-
-extern void
-diagram_tree_update_object(DiagramTree *tree, Diagram *diagram,
- DiaObject *object);
-
/* operations on the last clicked node */
extern void
diagram_tree_raise(DiagramTree *tree);
diff --git a/app/diagram_tree_view.c b/app/diagram_tree_view.c
index d7d4bba..597fb38 100644
--- a/app/diagram_tree_view.c
+++ b/app/diagram_tree_view.c
@@ -509,6 +509,9 @@ diagram_tree_show (void)
/* expand all rows after the treeview widget has been realized */
g_signal_connect (dtv, "realize",
G_CALLBACK (gtk_tree_view_expand_all), NULL);
+ g_signal_connect (GTK_OBJECT (window), "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &window);
if (!GTK_WIDGET_VISIBLE (window))
gtk_widget_show_all (window);
diff --git a/app/makefile.msc b/app/makefile.msc
index 1c9fa77..a62864f 100644
--- a/app/makefile.msc
+++ b/app/makefile.msc
@@ -78,6 +78,8 @@ OBJECTS = \
\
diagram_tree_model.obj \
diagram_tree_view.obj \
+ \
+ dia-application.obj
ICON_PNG_PAIRS = \
dia_connectable_icon pixmaps\connectable.png \
diff --git a/app/textedit.c b/app/textedit.c
index 4890125..5de4832 100644
--- a/app/textedit.c
+++ b/app/textedit.c
@@ -159,6 +159,7 @@ textedit_end_edit(DDisplay *ddisp, Focus *focus)
*/
highlight_object_off(focus->obj, ddisp->diagram);
object_add_updates(focus->obj, ddisp->diagram);
+ diagram_object_modified(ddisp->diagram, focus->obj);
/* Undo not quite ready yet
change = (TextEditChange *) undo_remove_to(ddisp->diagram->undo,
text_edit_apply);
diff --git a/app/undo.c b/app/undo.c
index 644747d..88f81cc 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -25,7 +25,6 @@
#include "focus.h"
#include "group.h"
#include "preferences.h"
-#include "diagram_tree_window.h"
#include "textedit.h"
#include "parent.h"
@@ -647,8 +646,6 @@ delete_objects_apply(struct DeleteObjectsChange *change, Diagram *dia)
list = g_list_next(list);
}
-
- diagram_tree_remove_objects(diagram_tree(), change->obj_list);
}
static void
@@ -673,8 +670,6 @@ delete_objects_revert(struct DeleteObjectsChange *change, Diagram *dia)
list = g_list_next(list);
}
-
- diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
}
static void
@@ -737,7 +732,6 @@ insert_objects_apply(struct InsertObjectsChange *change, Diagram *dia)
change->applied = 1;
layer_add_objects(change->layer, g_list_copy(change->obj_list));
object_add_updates_list(change->obj_list, dia);
- diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
}
static void
@@ -761,8 +755,6 @@ insert_objects_revert(struct InsertObjectsChange *change, Diagram *dia)
list = g_list_next(list);
}
-
- diagram_tree_remove_objects(diagram_tree(), change->obj_list);
}
static void
@@ -974,9 +966,6 @@ group_objects_apply(struct GroupObjectsChange *change, Diagram *dia)
list = g_list_next(list);
}
-
- diagram_tree_add_object(diagram_tree(), dia, change->group);
- diagram_tree_remove_objects(diagram_tree(), change->obj_list);
}
static void
@@ -993,9 +982,6 @@ group_objects_revert(struct GroupObjectsChange *change, Diagram *dia)
object_add_updates_list(change->obj_list, dia);
properties_hide_if_shown(dia, change->group);
-
- diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
- diagram_tree_remove_object(diagram_tree(), change->group);
}
static void
@@ -1060,9 +1046,6 @@ ungroup_objects_apply(struct UngroupObjectsChange *change, Diagram *dia)
object_add_updates_list(change->obj_list, dia);
properties_hide_if_shown(dia, change->group);
-
- diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
- diagram_tree_remove_object(diagram_tree(), change->group);
}
static void
@@ -1090,8 +1073,12 @@ ungroup_objects_revert(struct UngroupObjectsChange *change, Diagram *dia)
list = g_list_next(list);
}
- diagram_tree_add_object(diagram_tree(), dia, change->group);
- diagram_tree_remove_objects(diagram_tree(), change->obj_list);
+ data_emit (dia, change->layer, change->group, "object_add");
+ list = change->obj_list;
+ while (list) {
+ data_emit (dia, change->layer, list->data, "object_remove");
+ list = g_list_next(list);
+ }
}
static void
@@ -1241,10 +1228,8 @@ move_object_layer_relative(Diagram *dia, GList *objects, gint dist)
target = g_ptr_array_index(dia->data->layers, pos);
object_add_updates_list(objects, dia);
layer_remove_objects(active, objects);
- diagram_tree_add_objects(diagram_tree(), dia, objects);
layer_add_objects(target, g_list_copy(objects));
data_set_active_layer(dia->data, target);
- diagram_tree_add_objects(diagram_tree(), dia, objects);
}
static void
diff --git a/lib/diamarshal.list b/lib/diamarshal.list
index 6569357..67e179d 100644
--- a/lib/diamarshal.list
+++ b/lib/diamarshal.list
@@ -24,6 +24,8 @@
VOID: VOID
VOID: OBJECT
+VOID: OBJECT,UINT,POINTER
+VOID: OBJECT,OBJECT
VOID: INT
VOID: POINTER,POINTER
VOID: STRING, FLAGS
diff --git a/lib/layer.c b/lib/layer.c
index ff3c77b..d78f2ea 100644
--- a/lib/layer.c
+++ b/lib/layer.c
@@ -501,13 +501,14 @@ void
layer_replace_object_with_list(Layer *layer, DiaObject *remove_obj,
GList *insert_list)
{
- GList *list;
+ GList *list, *il;
list = g_list_find(layer->objects, remove_obj);
g_assert(list!=NULL);
set_parent_layer(remove_obj, NULL);
dynobj_list_remove_object(remove_obj);
+ data_emit (layer_get_parent_diagram(layer), layer, remove_obj, "object_remove");
g_list_foreach(insert_list, set_parent_layer, layer);
if (list->prev == NULL) {
@@ -522,6 +523,11 @@ layer_replace_object_with_list(Layer *layer, DiaObject *remove_obj,
last->next = list->next;
list->next->prev = last;
}
+ il = insert_list;
+ while (il) {
+ data_emit (layer_get_parent_diagram(layer), layer, il->data, "object_add");
+ il = g_list_next(il);
+ }
g_list_free_1(list);
}
@@ -533,11 +539,24 @@ layer_remove_dynobj(gpointer obj, gpointer userdata)
void layer_set_object_list(Layer *layer, GList *list)
{
+ GList *ol;
+ /* signal removal on all objects */
+ ol = layer->objects;
+ while (ol) {
+ data_emit (layer_get_parent_diagram(layer), layer, ol->data, "object_remove");
+ ol = g_list_next (ol);
+ }
g_list_foreach(layer->objects, set_parent_layer, NULL);
g_list_foreach(layer->objects, layer_remove_dynobj, NULL);
g_list_free(layer->objects);
layer->objects = list;
g_list_foreach(layer->objects, set_parent_layer, layer);
+ /* signal addition on all objects */
+ list = layer->objects;
+ while (list) {
+ data_emit (layer_get_parent_diagram(layer), layer, list->data, "object_add");
+ list = g_list_next (list);
+ }
}
DiagramData *
diff --git a/lib/libdia.def b/lib/libdia.def
index 0e78181..d045631 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -717,3 +717,6 @@ EXPORTS
libdia_init
dia_log_message
+
+ dia_marshal_VOID__OBJECT_UINT_POINTER
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]