add names to behaviors

Sat, 05 Jul 2025 23:06:07 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 05 Jul 2025 23:06:07 +0200
changeset 180
d942f48dc83a
parent 179
9d0946907cd9
child 181
fa550b550072

add names to behaviors

src/ascension/behavior.h file | annotate | diff | comparison | revisions
src/behavior.c file | annotate | diff | comparison | revisions
--- a/src/ascension/behavior.h	Fri Jul 04 23:36:40 2025 +0200
+++ b/src/ascension/behavior.h	Sat Jul 05 23:06:07 2025 +0200
@@ -43,6 +43,7 @@
     void *data;
     uint64_t last_execution;
     uint64_t interval;
+    cxmutstr name;
     bool enabled;
     bool killed;
     // TODO: more useful attributes
@@ -65,6 +66,10 @@
      * Minimum delay between two successive executions in nanoseconds.
      */
     uint64_t interval;
+    /**
+     * Optional name of the behavior.
+     */
+    const char *name;
 };
 
 AscBehavior *asc_behavior_add_(AscSceneNode *node, struct asc_behavior_create_args args);
@@ -88,6 +93,14 @@
 void asc_behavior_trigger(AscBehavior *behavior);
 
 /**
+ * Assigns a name to a behavior.
+ *
+ * @param behavior the behavior
+ * @param name the new name
+ */
+void asc_behavior_name(AscBehavior *behavior, const char *name);
+
+/**
  * Enables a behavior
  *
  * Has no effect on killed behaviors.
--- a/src/behavior.c	Fri Jul 04 23:36:40 2025 +0200
+++ b/src/behavior.c	Sat Jul 05 23:06:07 2025 +0200
@@ -28,6 +28,8 @@
 #include "ascension/behavior.h"
 #include "ascension/context.h"
 #include "ascension/scene.h"
+#include "ascension/util.h"
+#include "ascension/error.h"
 
 #include <cx/array_list.h>
 #include <cx/tree.h>
@@ -36,13 +38,14 @@
 
 static void asc_behavior_destroy(void *b) {
     AscBehavior *behavior = b;
+    asc_dprintf("Destroy behavior: %"CX_PRIstr, CX_SFMT(behavior->name));
+    cx_strfree(&behavior->name);
     if (behavior->destroy_func) {
         behavior->destroy_func(behavior);
     }
 }
 
 static CxList *asc_behavior_new_list(void) {
-    // TODO: add comparator when we know how to identify behaviors in order to remove them
     CxList *list = cxArrayListCreate(NULL, NULL, sizeof(AscBehavior), 4);
     cxDefineDestructor(list, asc_behavior_destroy);
     return list;
@@ -62,6 +65,8 @@
     behavior->data = args.data;
     behavior->interval = args.interval;
     behavior->last_execution = 0;
+    asc_behavior_name(behavior, args.name);
+    asc_dprintf("Create behavior: %"CX_PRIstr, CX_SFMT(behavior->name));
     return behavior;
 }
 
@@ -77,4 +82,14 @@
 
     behavior->func(behavior);
     behavior->last_execution = asc_context.total_nanos;
-}
\ No newline at end of file
+}
+
+void asc_behavior_name(AscBehavior *behavior, const char *name) {
+    cx_strfree(&behavior->name);
+    if (name == NULL) {
+        behavior->name = asc_util_gen_name(behavior, "behavior");
+    } else {
+        behavior->name.ptr = strdup(name);
+        behavior->name.length = strlen(name);
+    }
+}

mercurial