code cleanup:
[blender.git] / source / blender / blenkernel / intern / context.c
index 7a5b4ef9b2493b20f7ca859e1efdcb19c45e7c4c..be81c70f26110f5a308dbb38a0e57801ee9e3e2c 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "BLI_listbase.h"
 #include "BLI_string.h"
+#include "BLI_utildefines.h"
 
 #include "BKE_context.h"
 #include "BKE_main.h"
@@ -92,14 +93,14 @@ bContext *CTX_create(void)
 {
        bContext *C;
        
-       C= MEM_callocN(sizeof(bContext), "bContext");
+       C = MEM_callocN(sizeof(bContext), "bContext");
 
        return C;
 }
 
 bContext *CTX_copy(const bContext *C)
 {
-       bContext *newC= MEM_dupallocN((void*)C);
+       bContext *newC = MEM_dupallocN((void *)C);
 
        return newC;
 }
@@ -118,23 +119,23 @@ bContextStore *CTX_store_add(ListBase *contexts, const char *name, PointerRNA *p
 
        /* ensure we have a context to put the entry in, if it was already used
         * we have to copy the context to ensure */
-       ctx= contexts->last;
+       ctx = contexts->last;
 
        if (!ctx || ctx->used) {
                if (ctx) {
-                       lastctx= ctx;
-                       ctx= MEM_dupallocN(lastctx);
+                       lastctx = ctx;
+                       ctx = MEM_dupallocN(lastctx);
                        BLI_duplicatelist(&ctx->entries, &lastctx->entries);
                }
                else
-                       ctx= MEM_callocN(sizeof(bContextStore), "bContextStore");
+                       ctx = MEM_callocN(sizeof(bContextStore), "bContextStore");
 
                BLI_addtail(contexts, ctx);
        }
 
-       entry= MEM_callocN(sizeof(bContextStoreEntry), "bContextStoreEntry");
+       entry = MEM_callocN(sizeof(bContextStoreEntry), "bContextStoreEntry");
        BLI_strncpy(entry->name, name, sizeof(entry->name));
-       entry->ptr= *ptr;
+       entry->ptr = *ptr;
 
        BLI_addtail(&ctx->entries, entry);
 
@@ -148,22 +149,22 @@ bContextStore *CTX_store_add_all(ListBase *contexts, bContextStore *context)
 
        /* ensure we have a context to put the entries in, if it was already used
         * we have to copy the context to ensure */
-       ctx= contexts->last;
+       ctx = contexts->last;
 
        if (!ctx || ctx->used) {
                if (ctx) {
-                       lastctx= ctx;
-                       ctx= MEM_dupallocN(lastctx);
+                       lastctx = ctx;
+                       ctx = MEM_dupallocN(lastctx);
                        BLI_duplicatelist(&ctx->entries, &lastctx->entries);
                }
                else
-                       ctx= MEM_callocN(sizeof(bContextStore), "bContextStore");
+                       ctx = MEM_callocN(sizeof(bContextStore), "bContextStore");
 
                BLI_addtail(contexts, ctx);
        }
 
-       for (tentry= context->entries.first; tentry; tentry= tentry->next) {
-               entry= MEM_dupallocN(tentry);
+       for (tentry = context->entries.first; tentry; tentry = tentry->next) {
+               entry = MEM_dupallocN(tentry);
                BLI_addtail(&ctx->entries, entry);
        }
 
@@ -172,14 +173,14 @@ bContextStore *CTX_store_add_all(ListBase *contexts, bContextStore *context)
 
 void CTX_store_set(bContext *C, bContextStore *store)
 {
-       C->wm.store= store;
+       C->wm.store = store;
 }
 
 bContextStore *CTX_store_copy(bContextStore *store)
 {
        bContextStore *ctx;
 
-       ctx= MEM_dupallocN(store);
+       ctx = MEM_dupallocN(store);
        BLI_duplicatelist(&ctx->entries, &store->entries);
 
        return ctx;
@@ -195,20 +196,21 @@ void CTX_store_free_list(ListBase *contexts)
 {
        bContextStore *ctx;
 
-       while ((ctx= contexts->first)) {
+       while ((ctx = contexts->first)) {
                BLI_remlink(contexts, ctx);
                CTX_store_free(ctx);
        }
 }
 
 /* is python initialied? */
+
 int CTX_py_init_get(bContext *C)
 {
        return C->data.py_init;
 }
 void CTX_py_init_set(bContext *C, int value)
 {
-       C->data.py_init= value;
+       C->data.py_init = value;
 }
 
 void *CTX_py_dict_get(const bContext *C)
@@ -217,238 +219,7 @@ void *CTX_py_dict_get(const bContext *C)
 }
 void CTX_py_dict_set(bContext *C, void *value)
 {
-       C->data.py_context= value;
-}
-
-/* window manager context */
-
-wmWindowManager *CTX_wm_manager(const bContext *C)
-{
-       return C->wm.manager;
-}
-
-wmWindow *CTX_wm_window(const bContext *C)
-{
-       return C->wm.window;
-}
-
-bScreen *CTX_wm_screen(const bContext *C)
-{
-       return C->wm.screen;
-}
-
-ScrArea *CTX_wm_area(const bContext *C)
-{
-       return C->wm.area;
-}
-
-SpaceLink *CTX_wm_space_data(const bContext *C)
-{
-       return (C->wm.area)? C->wm.area->spacedata.first: NULL;
-}
-
-ARegion *CTX_wm_region(const bContext *C)
-{
-       return C->wm.region;
-}
-
-void *CTX_wm_region_data(const bContext *C)
-{
-       return (C->wm.region)? C->wm.region->regiondata: NULL;
-}
-
-struct ARegion *CTX_wm_menu(const bContext *C)
-{
-       return C->wm.menu;
-}
-
-struct ReportList *CTX_wm_reports(const bContext *C)
-{
-       if (C->wm.manager)
-               return &(C->wm.manager->reports);
-
-       return NULL;
-}
-
-View3D *CTX_wm_view3d(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-RegionView3D *CTX_wm_region_view3d(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
-               if (C->wm.region)
-                       return C->wm.region->regiondata;
-       return NULL;
-}
-
-struct SpaceText *CTX_wm_space_text(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_TEXT)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceConsole *CTX_wm_space_console(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_CONSOLE)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceImage *CTX_wm_space_image(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_IMAGE)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceButs *CTX_wm_space_buts(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_BUTS)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceFile *CTX_wm_space_file(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_FILE)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceSeq *CTX_wm_space_seq(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_SEQ)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceOops *CTX_wm_space_outliner(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_OUTLINER)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceNla *CTX_wm_space_nla(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_NLA)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceTime *CTX_wm_space_time(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_TIME)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceNode *CTX_wm_space_node(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_NODE)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceLogic *CTX_wm_space_logic(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_LOGIC)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceIpo *CTX_wm_space_graph(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_IPO)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceAction *CTX_wm_space_action(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_ACTION)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceInfo *CTX_wm_space_info(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_INFO)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceUserPref *CTX_wm_space_userpref(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_USERPREF)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-struct SpaceClip *CTX_wm_space_clip(const bContext *C)
-{
-       if (C->wm.area && C->wm.area->spacetype==SPACE_CLIP)
-               return C->wm.area->spacedata.first;
-       return NULL;
-}
-
-void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
-{
-       C->wm.manager= wm;
-       C->wm.window= NULL;
-       C->wm.screen= NULL;
-       C->wm.area= NULL;
-       C->wm.region= NULL;
-}
-
-void CTX_wm_window_set(bContext *C, wmWindow *win)
-{
-       C->wm.window= win;
-       C->wm.screen= (win)? win->screen: NULL;
-       if (C->wm.screen)
-               C->data.scene= C->wm.screen->scene;
-       C->wm.area= NULL;
-       C->wm.region= NULL;
-}
-
-void CTX_wm_screen_set(bContext *C, bScreen *screen)
-{
-       C->wm.screen= screen;
-       if (C->wm.screen)
-               C->data.scene= C->wm.screen->scene;
-       C->wm.area= NULL;
-       C->wm.region= NULL;
-}
-
-void CTX_wm_area_set(bContext *C, ScrArea *area)
-{
-       C->wm.area= area;
-       C->wm.region= NULL;
-}
-
-void CTX_wm_region_set(bContext *C, ARegion *region)
-{
-       C->wm.region= region;
-}
-
-void CTX_wm_menu_set(bContext *C, ARegion *menu)
-{
-       C->wm.menu= menu;
-}
-
-void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
-{
-       C->wm.operator_poll_msg= msg;
-}
-
-const char *CTX_wm_operator_poll_msg_get(bContext *C)
-{
-       return C->wm.operator_poll_msg;
+       C->data.py_context = value;
 }
 
 /* data context utility functions */
@@ -460,10 +231,31 @@ struct bContextDataResult {
        short type; /* 0: normal, 1: seq */
 };
 
+static void *ctx_wm_python_context_get(const bContext *C, const char *member, void *fall_through)
+{
+#ifdef WITH_PYTHON
+       bContextDataResult result;
+
+       if (C && CTX_py_dict_get(C)) {
+               memset(&result, 0, sizeof(bContextDataResult));
+               BPY_context_member_get((bContext *)C, member, &result);
+               if (result.ptr.data)
+                       return result.ptr.data;
+       }
+#else
+       (void)C, (void)member;
+#endif
+
+       return fall_through;
+}
+
 static int ctx_data_get(bContext *C, const char *member, bContextDataResult *result)
 {
-       int done= 0, recursion= C->data.recursion;
-       int ret= 0;
+       bScreen *sc;
+       ScrArea *sa;
+       ARegion *ar;
+       int done = FALSE, recursion = C->data.recursion;
+       int ret = 0;
 
        memset(result, 0, sizeof(bContextDataResult));
 #ifdef WITH_PYTHON
@@ -477,47 +269,47 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res
         * loops requesting data from ourselfs in a context callback */
 
        /* Ok, this looks evil...
-        * if (ret) done= -(-ret | -done);
+        * if (ret) done = -(-ret | -done);
         *
         * Values in order of importance
         * (0, -1, 1) - Where 1 is highest priority
         * */
-       if (done!=1 && recursion < 1 && C->wm.store) {
+       if (done != 1 && recursion < 1 && C->wm.store) {
                bContextStoreEntry *entry;
 
-               C->data.recursion= 1;
+               C->data.recursion = 1;
 
-               entry= BLI_rfindstring(&C->wm.store->entries, member, offsetof(bContextStoreEntry, name));
+               entry = BLI_rfindstring(&C->wm.store->entries, member, offsetof(bContextStoreEntry, name));
                if (entry) {
-                       result->ptr= entry->ptr;
-                       done= 1;
+                       result->ptr = entry->ptr;
+                       done = TRUE;
                }
        }
-       if (done!=1 && recursion < 2 && C->wm.region) {
-               C->data.recursion= 2;
-               if (C->wm.region->type && C->wm.region->type->context) {
-                       ret = C->wm.region->type->context(C, member, result);
-                       if (ret) done= -(-ret | -done);
+       if (done != 1 && recursion < 2 && (ar = CTX_wm_region(C))) {
+               C->data.recursion = 2;
+               if (ar->type && ar->type->context) {
+                       ret = ar->type->context(C, member, result);
+                       if (ret) done = -(-ret | -done);
 
                }
        }
-       if (done!=1 && recursion < 3 && C->wm.area) {
-               C->data.recursion= 3;
-               if (C->wm.area->type && C->wm.area->type->context) {
-                       ret = C->wm.area->type->context(C, member, result);
-                       if (ret) done= -(-ret | -done);
+       if (done != 1 && recursion < 3 && (sa = CTX_wm_area(C))) {
+               C->data.recursion = 3;
+               if (sa->type && sa->type->context) {
+                       ret = sa->type->context(C, member, result);
+                       if (ret) done = -(-ret | -done);
                }
        }
-       if (done!=1 && recursion < 4 && C->wm.screen) {
-               bContextDataCallback cb= C->wm.screen->context;
-               C->data.recursion= 4;
+       if (done != 1 && recursion < 4 && (sc = CTX_wm_screen(C))) {
+               bContextDataCallback cb = sc->context;
+               C->data.recursion = 4;
                if (cb) {
                        ret = cb(C, member, result);
-                       if (ret) done= -(-ret | -done);
+                       if (ret) done = -(-ret | -done);
                }
        }
 
-       C->data.recursion= recursion;
+       C->data.recursion = recursion;
 
        return done;
 }
@@ -526,7 +318,7 @@ static void *ctx_data_pointer_get(const bContext *C, const char *member)
 {
        bContextDataResult result;
 
-       if (C && ctx_data_get((bContext*)C, member, &result)==1)
+       if (C && ctx_data_get((bContext *)C, member, &result) == 1)
                return result.ptr.data;
 
        return NULL;
@@ -538,15 +330,15 @@ static int ctx_data_pointer_verify(const bContext *C, const char *member, void *
 
        /* if context is NULL, pointer must be NULL too and that is a valid return */
        if (C == NULL) {
-               *pointer= NULL;
+               *pointer = NULL;
                return 1;
        }
-       else if (ctx_data_get((bContext*)C, member, &result)==1) {
-               *pointer= result.ptr.data;
+       else if (ctx_data_get((bContext *)C, member, &result) == 1) {
+               *pointer = result.ptr.data;
                return 1;
        }
        else {
-               *pointer= NULL;
+               *pointer = NULL;
                return 0;
        }
 }
@@ -555,13 +347,13 @@ static int ctx_data_collection_get(const bContext *C, const char *member, ListBa
 {
        bContextDataResult result;
 
-       if (ctx_data_get((bContext*)C, member, &result)==1) {
-               *list= result.list;
+       if (ctx_data_get((bContext *)C, member, &result) == 1) {
+               *list = result.list;
                return 1;
        }
 
-       list->first= NULL;
-       list->last= NULL;
+       list->first = NULL;
+       list->last = NULL;
 
        return 0;
 }
@@ -570,7 +362,7 @@ PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
 {
        bContextDataResult result;
 
-       if (ctx_data_get((bContext*)C, member, &result)==1)
+       if (ctx_data_get((bContext *)C, member, &result) == 1)
                return result.ptr;
        else
                return PointerRNA_NULL;
@@ -580,8 +372,15 @@ PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, Stru
 {
        PointerRNA ptr = CTX_data_pointer_get(C, member);
 
-       if (ptr.data && RNA_struct_is_a(ptr.type, type))
-               return ptr;
+       if (ptr.data) {
+               if (RNA_struct_is_a(ptr.type, type)) {
+                       return ptr;
+               }
+               else {
+                       printf("%s: warning, member '%s' is '%s', not '%s'\n",
+                              __func__, member, RNA_struct_identifier(ptr.type), RNA_struct_identifier(type));
+               }
+       }
        
        return PointerRNA_NULL;
 }
@@ -590,11 +389,11 @@ ListBase CTX_data_collection_get(const bContext *C, const char *member)
 {
        bContextDataResult result;
 
-       if (ctx_data_get((bContext*)C, member, &result)==1) {
+       if (ctx_data_get((bContext *)C, member, &result) == 1) {
                return result.list;
        }
        else {
-               ListBase list= {NULL, NULL};
+               ListBase list = {NULL, NULL};
                return list;
        }
 }
@@ -603,17 +402,17 @@ ListBase CTX_data_collection_get(const bContext *C, const char *member)
 int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb, short *r_type)
 {
        bContextDataResult result;
-       int ret= ctx_data_get((bContext*)C, member, &result);
+       int ret = ctx_data_get((bContext *)C, member, &result);
 
-       if (ret==1) {
-               *r_ptr= result.ptr;
-               *r_lb= result.list;
-               *r_type= result.type;
+       if (ret == 1) {
+               *r_ptr = result.ptr;
+               *r_lb = result.list;
+               *r_type = result.type;
        }
        else {
                memset(r_ptr, 0, sizeof(*r_ptr));
                memset(r_lb, 0, sizeof(*r_lb));
-               *r_type= 0;
+               *r_type = 0;
        }
 
        return ret;
@@ -629,8 +428,8 @@ static void data_dir_add(ListBase *lb, const char *member)
        if (BLI_findstring(lb, member, offsetof(LinkData, data)))
                return;
        
-       link= MEM_callocN(sizeof(LinkData), "LinkData");
-       link->data= (void*)member;
+       link = MEM_callocN(sizeof(LinkData), "LinkData");
+       link->data = (void *)member;
        BLI_addtail(lb, link);
 }
 
@@ -638,6 +437,9 @@ ListBase CTX_data_dir_get(const bContext *C)
 {
        bContextDataResult result;
        ListBase lb;
+       bScreen *sc;
+       ScrArea *sa;
+       ARegion *ar;
        int a;
 
        memset(&lb, 0, sizeof(lb));
@@ -645,32 +447,32 @@ ListBase CTX_data_dir_get(const bContext *C)
        if (C->wm.store) {
                bContextStoreEntry *entry;
 
-               for (entry=C->wm.store->entries.first; entry; entry=entry->next)
+               for (entry = C->wm.store->entries.first; entry; entry = entry->next)
                        data_dir_add(&lb, entry->name);
        }
-       if (C->wm.region && C->wm.region->type && C->wm.region->type->context) {
+       if ((ar = CTX_wm_region(C)) && ar->type && ar->type->context) {
                memset(&result, 0, sizeof(result));
-               C->wm.region->type->context(C, "", &result);
+               ar->type->context(C, "", &result);
 
                if (result.dir)
-                       for (a=0; result.dir[a]; a++)
+                       for (a = 0; result.dir[a]; a++)
                                data_dir_add(&lb, result.dir[a]);
        }
-       if (C->wm.area && C->wm.area->type && C->wm.area->type->context) {
+       if ((sa = CTX_wm_area(C)) && sa->type && sa->type->context) {
                memset(&result, 0, sizeof(result));
-               C->wm.area->type->context(C, "", &result);
+               sa->type->context(C, "", &result);
 
                if (result.dir)
-                       for (a=0; result.dir[a]; a++)
+                       for (a = 0; result.dir[a]; a++)
                                data_dir_add(&lb, result.dir[a]);
        }
-       if (C->wm.screen && C->wm.screen->context) {
-               bContextDataCallback cb= C->wm.screen->context;
+       if ((sc = CTX_wm_screen(C)) && sc->context) {
+               bContextDataCallback cb = sc->context;
                memset(&result, 0, sizeof(result));
                cb(C, "", &result);
 
                if (result.dir)
-                       for (a=0; result.dir[a]; a++)
+                       for (a = 0; result.dir[a]; a++)
                                data_dir_add(&lb, result.dir[a]);
        }
 
@@ -701,7 +503,7 @@ void CTX_data_id_list_add(bContextDataResult *result, ID *id)
 {
        CollectionPointerLink *link;
 
-       link= MEM_callocN(sizeof(CollectionPointerLink), "CTX_data_id_list_add");
+       link = MEM_callocN(sizeof(CollectionPointerLink), "CTX_data_id_list_add");
        RNA_id_pointer_create(id, &link->ptr);
 
        BLI_addtail(&result->list, link);
@@ -711,18 +513,18 @@ void CTX_data_list_add(bContextDataResult *result, ID *id, StructRNA *type, void
 {
        CollectionPointerLink *link;
 
-       link= MEM_callocN(sizeof(CollectionPointerLink), "CTX_data_list_add");
+       link = MEM_callocN(sizeof(CollectionPointerLink), "CTX_data_list_add");
        RNA_pointer_create(id, type, data, &link->ptr);
 
        BLI_addtail(&result->list, link);
 }
 
-int ctx_data_list_count(const bContext *C, int (*func)(const bContext*, ListBase*))
+int ctx_data_list_count(const bContext *C, int (*func)(const bContext *, ListBase *))
 {
        ListBase list;
 
        if (func(C, &list)) {
-               int tot= BLI_countlist(&list);
+               int tot = BLI_countlist(&list);
                BLI_freelistN(&list);
                return tot;
        }
@@ -732,12 +534,12 @@ int ctx_data_list_count(const bContext *C, int (*func)(const bContext*, ListBase
 
 void CTX_data_dir_set(bContextDataResult *result, const char **dir)
 {
-       result->dir= dir;
+       result->dir = dir;
 }
 
 void CTX_data_type_set(bContextDataResult *result, short type)
 {
-       result->type= type;
+       result->type = type;
 }
 
 short CTX_data_type_get(bContextDataResult *result)
@@ -745,13 +547,268 @@ short CTX_data_type_get(bContextDataResult *result)
        return result->type;
 }
 
+
+
+/* window manager context */
+
+wmWindowManager *CTX_wm_manager(const bContext *C)
+{
+       return C->wm.manager;
+}
+
+wmWindow *CTX_wm_window(const bContext *C)
+{
+       return ctx_wm_python_context_get(C, "window", C->wm.window);
+}
+
+bScreen *CTX_wm_screen(const bContext *C)
+{
+       return ctx_wm_python_context_get(C, "screen", C->wm.screen);
+}
+
+ScrArea *CTX_wm_area(const bContext *C)
+{
+       return ctx_wm_python_context_get(C, "area", C->wm.area);
+}
+
+SpaceLink *CTX_wm_space_data(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       return (sa) ? sa->spacedata.first : NULL;
+}
+
+ARegion *CTX_wm_region(const bContext *C)
+{
+       return ctx_wm_python_context_get(C, "region", C->wm.region);
+}
+
+void *CTX_wm_region_data(const bContext *C)
+{
+       ARegion *ar = CTX_wm_region(C);
+       return (ar) ? ar->regiondata : NULL;
+}
+
+struct ARegion *CTX_wm_menu(const bContext *C)
+{
+       return C->wm.menu;
+}
+
+struct ReportList *CTX_wm_reports(const bContext *C)
+{
+       if (C->wm.manager)
+               return &(C->wm.manager->reports);
+
+       return NULL;
+}
+
+View3D *CTX_wm_view3d(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_VIEW3D)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+RegionView3D *CTX_wm_region_view3d(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       ARegion *ar = CTX_wm_region(C);
+
+       if (sa && sa->spacetype == SPACE_VIEW3D)
+               if (ar)
+                       return ar->regiondata;
+       return NULL;
+}
+
+struct SpaceText *CTX_wm_space_text(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_TEXT)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceConsole *CTX_wm_space_console(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_CONSOLE)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceImage *CTX_wm_space_image(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_IMAGE)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceButs *CTX_wm_space_buts(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_BUTS)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceFile *CTX_wm_space_file(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_FILE)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceSeq *CTX_wm_space_seq(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_SEQ)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceOops *CTX_wm_space_outliner(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_OUTLINER)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceNla *CTX_wm_space_nla(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_NLA)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceTime *CTX_wm_space_time(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_TIME)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceNode *CTX_wm_space_node(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_NODE)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceLogic *CTX_wm_space_logic(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_LOGIC)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceIpo *CTX_wm_space_graph(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_IPO)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceAction *CTX_wm_space_action(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_ACTION)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceInfo *CTX_wm_space_info(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_INFO)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceUserPref *CTX_wm_space_userpref(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_USERPREF)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+struct SpaceClip *CTX_wm_space_clip(const bContext *C)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       if (sa && sa->spacetype == SPACE_CLIP)
+               return sa->spacedata.first;
+       return NULL;
+}
+
+void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
+{
+       C->wm.manager = wm;
+       C->wm.window = NULL;
+       C->wm.screen = NULL;
+       C->wm.area = NULL;
+       C->wm.region = NULL;
+}
+
+void CTX_wm_window_set(bContext *C, wmWindow *win)
+{
+       C->wm.window = win;
+       C->wm.screen = (win) ? win->screen : NULL;
+       if (C->wm.screen)
+               C->data.scene = C->wm.screen->scene;
+       C->wm.area = NULL;
+       C->wm.region = NULL;
+}
+
+void CTX_wm_screen_set(bContext *C, bScreen *screen)
+{
+       C->wm.screen = screen;
+       if (C->wm.screen)
+               C->data.scene = C->wm.screen->scene;
+       C->wm.area = NULL;
+       C->wm.region = NULL;
+}
+
+void CTX_wm_area_set(bContext *C, ScrArea *area)
+{
+       C->wm.area = area;
+       C->wm.region = NULL;
+}
+
+void CTX_wm_region_set(bContext *C, ARegion *region)
+{
+       C->wm.region = region;
+}
+
+void CTX_wm_menu_set(bContext *C, ARegion *menu)
+{
+       C->wm.menu = menu;
+}
+
+void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
+{
+       C->wm.operator_poll_msg = msg;
+}
+
+const char *CTX_wm_operator_poll_msg_get(bContext *C)
+{
+       return C->wm.operator_poll_msg;
+}
+
 /* data context */
 
 Main *CTX_data_main(const bContext *C)
 {
        Main *bmain;
 
-       if (ctx_data_pointer_verify(C, "blend_data", (void*)&bmain))
+       if (ctx_data_pointer_verify(C, "blend_data", (void *)&bmain))
                return bmain;
        else
                return C->data.main;
@@ -759,14 +816,14 @@ Main *CTX_data_main(const bContext *C)
 
 void CTX_data_main_set(bContext *C, Main *bmain)
 {
-       C->data.main= bmain;
+       C->data.main = bmain;
 }
 
 Scene *CTX_data_scene(const bContext *C)
 {
        Scene *scene;
 
-       if (ctx_data_pointer_verify(C, "scene", (void*)&scene))
+       if (ctx_data_pointer_verify(C, "scene", (void *)&scene))
                return scene;
        else
                return C->data.scene;
@@ -774,7 +831,7 @@ Scene *CTX_data_scene(const bContext *C)
 
 int CTX_data_mode_enum(const bContext *C)
 {
-       Object *obedit= CTX_data_edit_object(C);
+       Object *obedit = CTX_data_edit_object(C);
 
        if (obedit) {
                switch (obedit->type) {
@@ -799,7 +856,7 @@ int CTX_data_mode_enum(const bContext *C)
 
                if (ob) {
                        if (ob->mode & OB_MODE_POSE) return CTX_MODE_POSE;
-                       else if (ob->mode & OB_MODE_SCULPT)  return CTX_MODE_SCULPT;
+                       else if (ob->mode & OB_MODE_SCULPT) return CTX_MODE_SCULPT;
                        else if (ob->mode & OB_MODE_WEIGHT_PAINT) return CTX_MODE_PAINT_WEIGHT;
                        else if (ob->mode & OB_MODE_VERTEX_PAINT) return CTX_MODE_PAINT_VERTEX;
                        else if (ob->mode & OB_MODE_TEXTURE_PAINT) return CTX_MODE_PAINT_TEXTURE;
@@ -837,7 +894,7 @@ const char *CTX_data_mode_string(const bContext *C)
 
 void CTX_data_scene_set(bContext *C, Scene *scene)
 {
-       C->data.scene= scene;
+       C->data.scene = scene;
 }
 
 ToolSettings *CTX_data_tool_settings(const bContext *C)
@@ -925,6 +982,11 @@ struct MovieClip *CTX_data_edit_movieclip(const bContext *C)
        return ctx_data_pointer_get(C, "edit_movieclip");
 }
 
+struct Mask *CTX_data_edit_mask(const bContext *C)
+{
+       return ctx_data_pointer_get(C, "edit_mask");
+}
+
 struct EditBone *CTX_data_active_bone(const bContext *C)
 {
        return ctx_data_pointer_get(C, "active_bone");