144
bContextStore *CTX_store_add_all(ListBase *contexts, bContextStore *context)
146
bContextStoreEntry *entry, *tentry;
147
bContextStore *ctx, *lastctx;
149
/* ensure we have a context to put the entries in, if it was already used
150
* we have to copy the context to ensure */
153
if (!ctx || ctx->used) {
156
ctx= MEM_dupallocN(lastctx);
157
BLI_duplicatelist(&ctx->entries, &lastctx->entries);
160
ctx= MEM_callocN(sizeof(bContextStore), "bContextStore");
162
BLI_addtail(contexts, ctx);
165
for (tentry= context->entries.first; tentry; tentry= tentry->next) {
166
entry= MEM_dupallocN(tentry);
167
BLI_addtail(&ctx->entries, entry);
139
173
void CTX_store_set(bContext *C, bContextStore *store)
141
175
C->wm.store= store;
239
273
View3D *CTX_wm_view3d(const bContext *C)
241
if(C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
275
if (C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
242
276
return C->wm.area->spacedata.first;
246
280
RegionView3D *CTX_wm_region_view3d(const bContext *C)
248
if(C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
282
if (C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
250
284
return C->wm.region->regiondata;
254
288
struct SpaceText *CTX_wm_space_text(const bContext *C)
256
if(C->wm.area && C->wm.area->spacetype==SPACE_TEXT)
290
if (C->wm.area && C->wm.area->spacetype==SPACE_TEXT)
257
291
return C->wm.area->spacedata.first;
261
295
struct SpaceConsole *CTX_wm_space_console(const bContext *C)
263
if(C->wm.area && C->wm.area->spacetype==SPACE_CONSOLE)
297
if (C->wm.area && C->wm.area->spacetype==SPACE_CONSOLE)
264
298
return C->wm.area->spacedata.first;
268
302
struct SpaceImage *CTX_wm_space_image(const bContext *C)
270
if(C->wm.area && C->wm.area->spacetype==SPACE_IMAGE)
304
if (C->wm.area && C->wm.area->spacetype==SPACE_IMAGE)
271
305
return C->wm.area->spacedata.first;
275
309
struct SpaceButs *CTX_wm_space_buts(const bContext *C)
277
if(C->wm.area && C->wm.area->spacetype==SPACE_BUTS)
311
if (C->wm.area && C->wm.area->spacetype==SPACE_BUTS)
278
312
return C->wm.area->spacedata.first;
282
316
struct SpaceFile *CTX_wm_space_file(const bContext *C)
284
if(C->wm.area && C->wm.area->spacetype==SPACE_FILE)
318
if (C->wm.area && C->wm.area->spacetype==SPACE_FILE)
285
319
return C->wm.area->spacedata.first;
289
323
struct SpaceSeq *CTX_wm_space_seq(const bContext *C)
291
if(C->wm.area && C->wm.area->spacetype==SPACE_SEQ)
325
if (C->wm.area && C->wm.area->spacetype==SPACE_SEQ)
292
326
return C->wm.area->spacedata.first;
296
330
struct SpaceOops *CTX_wm_space_outliner(const bContext *C)
298
if(C->wm.area && C->wm.area->spacetype==SPACE_OUTLINER)
332
if (C->wm.area && C->wm.area->spacetype==SPACE_OUTLINER)
299
333
return C->wm.area->spacedata.first;
303
337
struct SpaceNla *CTX_wm_space_nla(const bContext *C)
305
if(C->wm.area && C->wm.area->spacetype==SPACE_NLA)
339
if (C->wm.area && C->wm.area->spacetype==SPACE_NLA)
306
340
return C->wm.area->spacedata.first;
310
344
struct SpaceTime *CTX_wm_space_time(const bContext *C)
312
if(C->wm.area && C->wm.area->spacetype==SPACE_TIME)
346
if (C->wm.area && C->wm.area->spacetype==SPACE_TIME)
313
347
return C->wm.area->spacedata.first;
317
351
struct SpaceNode *CTX_wm_space_node(const bContext *C)
319
if(C->wm.area && C->wm.area->spacetype==SPACE_NODE)
353
if (C->wm.area && C->wm.area->spacetype==SPACE_NODE)
320
354
return C->wm.area->spacedata.first;
324
358
struct SpaceLogic *CTX_wm_space_logic(const bContext *C)
326
if(C->wm.area && C->wm.area->spacetype==SPACE_LOGIC)
360
if (C->wm.area && C->wm.area->spacetype==SPACE_LOGIC)
327
361
return C->wm.area->spacedata.first;
331
365
struct SpaceIpo *CTX_wm_space_graph(const bContext *C)
333
if(C->wm.area && C->wm.area->spacetype==SPACE_IPO)
367
if (C->wm.area && C->wm.area->spacetype==SPACE_IPO)
334
368
return C->wm.area->spacedata.first;
338
372
struct SpaceAction *CTX_wm_space_action(const bContext *C)
340
if(C->wm.area && C->wm.area->spacetype==SPACE_ACTION)
374
if (C->wm.area && C->wm.area->spacetype==SPACE_ACTION)
341
375
return C->wm.area->spacedata.first;
345
379
struct SpaceInfo *CTX_wm_space_info(const bContext *C)
347
if(C->wm.area && C->wm.area->spacetype==SPACE_INFO)
381
if (C->wm.area && C->wm.area->spacetype==SPACE_INFO)
348
382
return C->wm.area->spacedata.first;
352
386
struct SpaceUserPref *CTX_wm_space_userpref(const bContext *C)
354
if(C->wm.area && C->wm.area->spacetype==SPACE_USERPREF)
388
if (C->wm.area && C->wm.area->spacetype==SPACE_USERPREF)
389
return C->wm.area->spacedata.first;
393
struct SpaceClip *CTX_wm_space_clip(const bContext *C)
395
if (C->wm.area && C->wm.area->spacetype==SPACE_CLIP)
355
396
return C->wm.area->spacedata.first;
424
477
* loops requesting data from ourselfs in a context callback */
426
479
/* Ok, this looks evil...
427
* if(ret) done= -(-ret | -done);
480
* if (ret) done= -(-ret | -done);
429
482
* Values in order of importance
430
483
* (0, -1, 1) - Where 1 is highest priority
432
if(done!=1 && recursion < 1 && C->wm.store) {
485
if (done!=1 && recursion < 1 && C->wm.store) {
433
486
bContextStoreEntry *entry;
435
488
C->data.recursion= 1;
437
for(entry=C->wm.store->entries.first; entry; entry=entry->next) {
438
if(strcmp(entry->name, member) == 0) {
439
result->ptr= entry->ptr;
490
entry= BLI_rfindstring(&C->wm.store->entries, member, offsetof(bContextStoreEntry, name));
492
result->ptr= entry->ptr;
444
if(done!=1 && recursion < 2 && C->wm.region) {
496
if (done!=1 && recursion < 2 && C->wm.region) {
445
497
C->data.recursion= 2;
446
if(C->wm.region->type && C->wm.region->type->context) {
498
if (C->wm.region->type && C->wm.region->type->context) {
447
499
ret = C->wm.region->type->context(C, member, result);
448
if(ret) done= -(-ret | -done);
500
if (ret) done= -(-ret | -done);
452
if(done!=1 && recursion < 3 && C->wm.area) {
504
if (done!=1 && recursion < 3 && C->wm.area) {
453
505
C->data.recursion= 3;
454
if(C->wm.area->type && C->wm.area->type->context) {
506
if (C->wm.area->type && C->wm.area->type->context) {
455
507
ret = C->wm.area->type->context(C, member, result);
456
if(ret) done= -(-ret | -done);
508
if (ret) done= -(-ret | -done);
459
if(done!=1 && recursion < 4 && C->wm.screen) {
511
if (done!=1 && recursion < 4 && C->wm.screen) {
460
512
bContextDataCallback cb= C->wm.screen->context;
461
513
C->data.recursion= 4;
463
515
ret = cb(C, member, result);
464
if(ret) done= -(-ret | -done);
516
if (ret) done= -(-ret | -done);
571
622
static void data_dir_add(ListBase *lb, const char *member)
575
if(strcmp(member, "scene") == 0) /* exception */
578
for(link=lb->first; link; link=link->next)
579
if(strcmp(link->data, member) == 0)
626
if (strcmp(member, "scene") == 0) /* exception */
629
if (BLI_findstring(lb, member, offsetof(LinkData, data)))
582
632
link= MEM_callocN(sizeof(LinkData), "LinkData");
583
633
link->data= (void*)member;
593
643
memset(&lb, 0, sizeof(lb));
596
646
bContextStoreEntry *entry;
598
for(entry=C->wm.store->entries.first; entry; entry=entry->next)
648
for (entry=C->wm.store->entries.first; entry; entry=entry->next)
599
649
data_dir_add(&lb, entry->name);
601
if(C->wm.region && C->wm.region->type && C->wm.region->type->context) {
651
if (C->wm.region && C->wm.region->type && C->wm.region->type->context) {
602
652
memset(&result, 0, sizeof(result));
603
653
C->wm.region->type->context(C, "", &result);
606
for(a=0; result.dir[a]; a++)
656
for (a=0; result.dir[a]; a++)
607
657
data_dir_add(&lb, result.dir[a]);
609
if(C->wm.area && C->wm.area->type && C->wm.area->type->context) {
659
if (C->wm.area && C->wm.area->type && C->wm.area->type->context) {
610
660
memset(&result, 0, sizeof(result));
611
661
C->wm.area->type->context(C, "", &result);
614
for(a=0; result.dir[a]; a++)
664
for (a=0; result.dir[a]; a++)
615
665
data_dir_add(&lb, result.dir[a]);
617
if(C->wm.screen && C->wm.screen->context) {
667
if (C->wm.screen && C->wm.screen->context) {
618
668
bContextDataCallback cb= C->wm.screen->context;
619
669
memset(&result, 0, sizeof(result));
620
670
cb(C, "", &result);
623
for(a=0; result.dir[a]; a++)
673
for (a=0; result.dir[a]; a++)
624
674
data_dir_add(&lb, result.dir[a]);
748
798
Object *ob = CTX_data_active_object(C);
751
if(ob->mode & OB_MODE_POSE) return CTX_MODE_POSE;
752
else if(ob->mode & OB_MODE_SCULPT) return CTX_MODE_SCULPT;
753
else if(ob->mode & OB_MODE_WEIGHT_PAINT) return CTX_MODE_PAINT_WEIGHT;
754
else if(ob->mode & OB_MODE_VERTEX_PAINT) return CTX_MODE_PAINT_VERTEX;
755
else if(ob->mode & OB_MODE_TEXTURE_PAINT) return CTX_MODE_PAINT_TEXTURE;
756
else if(ob->mode & OB_MODE_PARTICLE_EDIT) return CTX_MODE_PARTICLE;
801
if (ob->mode & OB_MODE_POSE) return CTX_MODE_POSE;
802
else if (ob->mode & OB_MODE_SCULPT) return CTX_MODE_SCULPT;
803
else if (ob->mode & OB_MODE_WEIGHT_PAINT) return CTX_MODE_PAINT_WEIGHT;
804
else if (ob->mode & OB_MODE_VERTEX_PAINT) return CTX_MODE_PAINT_VERTEX;
805
else if (ob->mode & OB_MODE_TEXTURE_PAINT) return CTX_MODE_PAINT_TEXTURE;
806
else if (ob->mode & OB_MODE_PARTICLE_EDIT) return CTX_MODE_PARTICLE;