Blender V4.3
callbacks.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_listbase.h"
10#include "BLI_utildefines.h"
11
12#include "BKE_callbacks.hh"
13
14#include "MEM_guardedalloc.h"
15
16#include "RNA_access.hh"
17#include "RNA_prototypes.hh"
18
20
21static bool callbacks_initialized = false;
22
23#define ASSERT_CALLBACKS_INITIALIZED() \
24 BLI_assert_msg(callbacks_initialized, \
25 "Callbacks should be initialized with BKE_callback_global_init() before using " \
26 "the callback system.")
27
28void BKE_callback_exec(Main *bmain, PointerRNA **pointers, const int num_pointers, eCbEvent evt)
29{
31
32 /* Use mutable iteration so handlers are able to remove themselves. */
33 ListBase *lb = &callback_slots[evt];
35 funcstore->func(bmain, pointers, num_pointers, funcstore->arg);
36 }
37}
38
40{
41 BKE_callback_exec(bmain, nullptr, 0, evt);
42}
43
44void BKE_callback_exec_id(Main *bmain, ID *id, eCbEvent evt)
45{
47
48 PointerRNA *pointers[1] = {&id_ptr};
49
50 BKE_callback_exec(bmain, pointers, 1, evt);
51}
52
53void BKE_callback_exec_id_depsgraph(Main *bmain, ID *id, Depsgraph *depsgraph, eCbEvent evt)
54{
56
57 PointerRNA depsgraph_ptr = RNA_pointer_create(nullptr, &RNA_Depsgraph, depsgraph);
58
59 PointerRNA *pointers[2] = {&id_ptr, &depsgraph_ptr};
60
61 BKE_callback_exec(bmain, pointers, 2, evt);
62}
63
64void BKE_callback_exec_string(Main *bmain, eCbEvent evt, const char *str)
65{
66 PrimitiveStringRNA data = {nullptr};
67 data.value = str;
68 PointerRNA str_ptr = RNA_pointer_create(nullptr, &RNA_PrimitiveString, &data);
69
70 PointerRNA *pointers[1] = {&str_ptr};
71
72 BKE_callback_exec(bmain, pointers, 1, evt);
73}
74
76{
78 ListBase *lb = &callback_slots[evt];
79 BLI_addtail(lb, funcstore);
80}
81
83{
84 /* The callback may have already been removed by BKE_callback_global_finalize(), for
85 * example when removing callbacks in response to a BKE_blender_atexit_register callback
86 * function. `BKE_blender_atexit()` runs after `BKE_callback_global_finalize()`. */
88 return;
89 }
90
91 ListBase *lb = &callback_slots[evt];
92
93 /* Be noisy about potential programming errors. */
94 BLI_assert_msg(BLI_findindex(lb, funcstore) != -1, "To-be-removed callback not found");
95
96 BLI_remlink(lb, funcstore);
97
98 if (funcstore->alloc) {
99 MEM_freeN(funcstore);
100 }
101}
102
107
109{
110 for (int evt_i = 0; evt_i < BKE_CB_EVT_TOT; evt_i++) {
111 const eCbEvent evt = eCbEvent(evt_i);
112 ListBase *lb = &callback_slots[evt];
113 bCallbackFuncStore *funcstore;
114 bCallbackFuncStore *funcstore_next;
115 for (funcstore = static_cast<bCallbackFuncStore *>(lb->first); funcstore;
116 funcstore = funcstore_next)
117 {
118 funcstore_next = funcstore->next;
119 BKE_callback_remove(funcstore, evt);
120 }
121 }
122
123 callbacks_initialized = false;
124}
eCbEvent
@ BKE_CB_EVT_TOT
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Read Guarded memory(de)allocation.
void BKE_callback_add(bCallbackFuncStore *funcstore, eCbEvent evt)
Definition callbacks.cc:75
void BKE_callback_exec(Main *bmain, PointerRNA **pointers, const int num_pointers, eCbEvent evt)
Definition callbacks.cc:28
void BKE_callback_global_finalize()
Definition callbacks.cc:108
void BKE_callback_exec_id(Main *bmain, ID *id, eCbEvent evt)
Definition callbacks.cc:44
static ListBase callback_slots[BKE_CB_EVT_TOT]
Definition callbacks.cc:19
void BKE_callback_exec_string(Main *bmain, eCbEvent evt, const char *str)
Definition callbacks.cc:64
static bool callbacks_initialized
Definition callbacks.cc:21
void BKE_callback_remove(bCallbackFuncStore *funcstore, eCbEvent evt)
Definition callbacks.cc:82
void BKE_callback_exec_null(Main *bmain, eCbEvent evt)
Definition callbacks.cc:39
void BKE_callback_global_init()
Definition callbacks.cc:103
void BKE_callback_exec_id_depsgraph(Main *bmain, ID *id, Depsgraph *depsgraph, eCbEvent evt)
Definition callbacks.cc:53
#define ASSERT_CALLBACKS_INITIALIZED()
Definition callbacks.cc:23
const Depsgraph * depsgraph
#define str(s)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
PointerRNA RNA_id_pointer_create(ID *id)
Definition DNA_ID.h:413
void * first
const char * value
Definition RNA_types.hh:788
bCallbackFuncStore * next