Blender V5.0
wm_message_bus.hh
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#pragma once
10
11#include "BLI_string_ref.hh"
12
13#include "DNA_listBase.h"
14
15#include "RNA_prototypes.hh"
16#include "RNA_types.hh"
17#include <cstdio>
18
19struct ID;
20struct bContext;
21struct wmMsg;
22/* Opaque (don't expose outside `wm_message_bus.cc`). */
23struct wmMsgBus;
27
28using wmMsgNotifyFn = void (*)(bContext *C,
29 wmMsgSubscribeKey *msg_key,
30 wmMsgSubscribeValue *msg_val);
32 wmMsgSubscribeValue *msg_val);
33
34/* Exactly what arguments here is not obvious. */
36 void (*)(bContext *C, wmMsgBus *mbus, ID *id_src, ID *id_dst, wmMsgSubscribeValue *msg_val);
37enum {
43};
44#define WM_MSG_TYPE_NUM 3
45
47 struct {
48 unsigned int (*hash_fn)(const void *msg);
49 bool (*cmp_fn)(const void *a, const void *b);
50
51 /* Creation, duplication and deletion callbacks. */
52 /* Not needed currently, key are always allocated by duplicating from stack data. */
53 /* void *(*key_alloc_fn)(); */
54 void *(*key_duplicate_fn)(const void *key);
55 void (*key_free_fn)(void *key);
57
58 void (*update_by_id)(wmMsgBus *mbus, ID *id_src, ID *id_dst);
59 void (*remove_by_id)(wmMsgBus *mbus, const ID *id);
60 void (*repr)(FILE *stream, const wmMsgSubscribeKey *msg_key);
61};
62
63struct wmMsg {
64 unsigned int type;
65 // #ifndef NDEBUG
66 /* For debugging: '__func__:__LINE__'. */
67 const char *id;
68 // #endif
69};
70
75 /* Over-allocate, eg: #wmMsgSubscribeKey_RNA. */
76 /* Last member will be `wmMsg_*`. */
77};
78
82
84 void *owner;
86 void *user_data;
87
92
95 /* Tag to run when handling events,
96 * we may want option for immediate execution. */
97 uint tag : 1;
98};
99
105
107
109void WM_msgbus_destroy(wmMsgBus *mbus);
110
111void WM_msgbus_clear_by_owner(wmMsgBus *mbus, void *owner);
112
113void WM_msg_dump(wmMsgBus *mbus, const char *info_str);
114void WM_msgbus_handle(wmMsgBus *mbus, bContext *C);
115
128 const wmMsgSubscribeKey *msg_key_test,
129 const wmMsgSubscribeValue *msg_val_params);
130
131void WM_msg_id_update(wmMsgBus *mbus, ID *id_src, ID *id_dst);
132void WM_msg_id_remove(wmMsgBus *mbus, const ID *id);
133
134/* -------------------------------------------------------------------------- */
135/* `wm_message_bus_static.cc` */
136
137enum {
138 /* Generic window redraw. */
142};
143
145 int event;
146};
147
149 wmMsg head; /* Keep first. */
151};
152
157
158void WM_msgtypeinfo_init_static(wmMsgTypeInfo *msgtype_info);
159
161 const wmMsgParams_Static *msg_key_params);
162void WM_msg_publish_static_params(wmMsgBus *mbus, const wmMsgParams_Static *msg_key_params);
164 /* #wmMsgParams_Static (expanded). */
165 int event);
167 const wmMsgParams_Static *msg_key_params,
168 const wmMsgSubscribeValue *msg_val_params,
169 const char *id_repr);
171 int event,
172 const wmMsgSubscribeValue *msg_val_params,
173 const char *id_repr);
174
175/* -------------------------------------------------------------------------- */
176/* `wm_message_bus_remote_io.cc` */
177
179 /* Owned, needs freeing with `MEM_freeN()`. */
180 const char *remote_url;
181};
182
187
192
194
196 const wmMsgParams_RemoteIO *msg_key_params);
197void WM_msg_publish_remote_io_params(wmMsgBus *mbus, const wmMsgParams_RemoteIO *msg_key_params);
200 const wmMsgParams_RemoteIO *msg_key_params,
201 const wmMsgSubscribeValue *msg_val_params,
202 const char *id_repr);
204 blender::StringRef remote_url,
205 const wmMsgSubscribeValue *msg_val_params,
206 const char *id_repr);
207
208/* -------------------------------------------------------------------------- */
209/* `wm_message_bus_rna.cc` */
210
223
224struct wmMsg_RNA {
225 wmMsg head; /* Keep first. */
227};
228
233
234void WM_msgtypeinfo_init_rna(wmMsgTypeInfo *msgtype_info);
235
237void WM_msg_publish_rna_params(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params);
239 /* #wmMsgParams_RNA (expanded). */
241 PropertyRNA *prop);
243 const wmMsgParams_RNA *msg_key_params,
244 const wmMsgSubscribeValue *msg_val_params,
245 const char *id_repr);
248 const PropertyRNA *prop,
249 const wmMsgSubscribeValue *msg_val_params,
250 const char *id_repr);
251
252/* ID variants. */
254 ID *id,
255 const wmMsgSubscribeValue *msg_val_params,
256 const char *id_repr);
257void WM_msg_publish_ID(wmMsgBus *mbus, ID *id);
258
259#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_) \
260 { \
261 wmMsgParams_RNA msg_key_params_ = {{}}; \
262 msg_key_params_.ptr = RNA_pointer_create_discrete(id_, &RNA_##type_, data_); \
263 msg_key_params_.prop = &rna_##type_##_##prop_; \
264 WM_msg_publish_rna_params(mbus, &msg_key_params_); \
265 } \
266 ((void)0)
267#define WM_msg_subscribe_rna_prop(mbus, id_, data_, type_, prop_, value) \
268 { \
269 wmMsgParams_RNA msg_key_params_ = {{}}; \
270 msg_key_params_.ptr = RNA_pointer_create_discrete(id_, &RNA_##type_, data_); \
271 msg_key_params_.prop = &rna_##type_##_##prop_; \
272 WM_msg_subscribe_rna_params(mbus, &msg_key_params_, value, __func__); \
273 } \
274 ((void)0)
275
276/* Anonymous variants (for convenience). */
277#define WM_msg_subscribe_rna_anon_type(mbus, type_, value) \
278 { \
279 PointerRNA msg_ptr_ = {nullptr, &RNA_##type_, nullptr}; \
280 wmMsgParams_RNA msg_key_params_ = {{}}; \
281 msg_key_params_.ptr = msg_ptr_; \
282\
283 WM_msg_subscribe_rna_params(mbus, &msg_key_params_, value, __func__); \
284 } \
285 ((void)0)
286#define WM_msg_subscribe_rna_anon_prop(mbus, type_, prop_, value) \
287 { \
288 PointerRNA msg_ptr_ = {nullptr, &RNA_##type_, nullptr}; \
289 wmMsgParams_RNA msg_key_params_ = {{}}; \
290 msg_key_params_.ptr = msg_ptr_; \
291 msg_key_params_.prop = &rna_##type_##_##prop_; \
292\
293 WM_msg_subscribe_rna_params(mbus, &msg_key_params_, value, __func__); \
294 } \
295 ((void)0)
unsigned int uint
These structs are the foundation for all linked lists in the library system.
#define C
Definition RandGen.cpp:29
Definition DNA_ID.h:414
const PropertyRNA * prop
wmMsgSubscribeKey head
wmMsgSubscribeKey * prev
wmMsgSubscribeKey * next
wmMsgSubscribeValueFreeDataFn free_data
wmMsgSubscribeValue * next
wmMsgSubscribeValueUpdateIdFn update_id
wmMsgSubscribeValue * prev
void(* remove_by_id)(wmMsgBus *mbus, const ID *id)
void(* update_by_id)(wmMsgBus *mbus, ID *id_src, ID *id_dst)
struct wmMsgTypeInfo::@062176151244273150215163026361115361006314120344 gset
void(* repr)(FILE *stream, const wmMsgSubscribeKey *msg_key)
unsigned int(* hash_fn)(const void *msg)
void(* key_free_fn)(void *key)
bool(* cmp_fn)(const void *a, const void *b)
wmMsgParams_RNA params
wmMsgParams_RemoteIO params
wmMsgParams_Static params
unsigned int type
const char * id
PointerRNA * ptr
Definition wm_files.cc:4238
void WM_msg_subscribe_rna_params(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
wmMsgSubscribeKey_RNA * WM_msg_lookup_rna(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params)
void WM_msg_subscribe_rna(wmMsgBus *mbus, PointerRNA *ptr, const PropertyRNA *prop, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
@ WM_MSG_STATICTYPE_WINDOW_DRAW
@ WM_MSG_STATICTYPE_FILE_READ
@ WM_MSG_STATICTYPE_SCREEN_EDIT
void WM_msgbus_destroy(wmMsgBus *mbus)
void WM_msg_publish_static(wmMsgBus *mbus, int event)
void WM_msg_publish_rna_params(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params)
void WM_msgtypeinfo_init_rna(wmMsgTypeInfo *msgtype_info)
void WM_msgtypeinfo_init_static(wmMsgTypeInfo *msgtype_info)
void WM_msg_publish_remote_io(wmMsgBus *mbus, blender::StringRef remote_url)
void WM_msgtypeinfo_init_remote_io(wmMsgTypeInfo *msgtype_info)
void WM_msg_subscribe_remote_io(wmMsgBus *mbus, blender::StringRef remote_url, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_msg_subscribe_remote_io_params(wmMsgBus *mbus, const wmMsgParams_RemoteIO *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_msg_publish_static_params(wmMsgBus *mbus, const wmMsgParams_Static *msg_key_params)
void WM_msg_publish_remote_io_params(wmMsgBus *mbus, const wmMsgParams_RemoteIO *msg_key_params)
wmMsgSubscribeKey_Static * WM_msg_lookup_static(wmMsgBus *mbus, const wmMsgParams_Static *msg_key_params)
void WM_msg_subscribe_static(wmMsgBus *mbus, int event, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_msg_publish_ID(wmMsgBus *mbus, ID *id)
wmMsgSubscribeKey_RemoteIO * WM_msg_lookup_remote_io(wmMsgBus *mbus, const wmMsgParams_RemoteIO *msg_key_params)
void WM_msg_publish_with_key(wmMsgBus *mbus, wmMsgSubscribeKey *msg_key)
void(*)(bContext *C, wmMsgSubscribeKey *msg_key, wmMsgSubscribeValue *msg_val) wmMsgNotifyFn
void WM_msg_id_update(wmMsgBus *mbus, ID *id_src, ID *id_dst)
void WM_msg_subscribe_static_params(wmMsgBus *mbus, const wmMsgParams_Static *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_msg_publish_rna(wmMsgBus *mbus, PointerRNA *ptr, PropertyRNA *prop)
void WM_msgbus_handle(wmMsgBus *mbus, bContext *C)
void WM_msg_id_remove(wmMsgBus *mbus, const ID *id)
@ WM_MSG_TYPE_STATIC
@ WM_MSG_TYPE_REMOTE_IO
@ WM_MSG_TYPE_RNA
wmMsgBus * WM_msgbus_create()
void WM_msgbus_clear_by_owner(wmMsgBus *mbus, void *owner)
wmMsgSubscribeKey * WM_msg_subscribe_with_key(wmMsgBus *mbus, const wmMsgSubscribeKey *msg_key_test, const wmMsgSubscribeValue *msg_val_params)
void(*)(wmMsgSubscribeKey *msg_key, wmMsgSubscribeValue *msg_val) wmMsgSubscribeValueFreeDataFn
void WM_msgbus_types_init()
void WM_msg_dump(wmMsgBus *mbus, const char *info_str)
void(*)(bContext *C, wmMsgBus *mbus, ID *id_src, ID *id_dst, wmMsgSubscribeValue *msg_val) wmMsgSubscribeValueUpdateIdFn
void WM_msg_subscribe_ID(wmMsgBus *mbus, ID *id, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)