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