Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-01-30 19:45:25 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-01-30 19:45:25 +0300
commit128c8167afa003984b7446ad53915c79f872fdbf (patch)
tree383ddb7b187c35fb19669bb945c7430ac84d1dda /source/blender/blenkernel
parentb50ef7af146957c5c936f116ed5012db9e128c48 (diff)
2.5: Fix for windows editmode tab crashes. This was due to
use of function pointers in the context callbacks. Apparently MSVC decides that some of these functions are the same and makes them into a single function with the same address. I couldn't figure out if this was a compiler bug or according to the C spec. Regardless, that means this method can't be used, so now it uses separate CTX_DATA_DEFINES.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_context.h28
-rw-r--r--source/blender/blenkernel/BKE_screen.h4
-rw-r--r--source/blender/blenkernel/intern/context.c42
3 files changed, 45 insertions, 29 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 160736d4a94..c489aba3326 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -59,13 +59,35 @@ struct wmWindowManager;
struct bContext;
typedef struct bContext bContext;
-typedef void bContextDataMember;
-
struct bContextDataResult;
typedef struct bContextDataResult bContextDataResult;
+enum {
+ CTX_DATA_MAIN,
+ CTX_DATA_SCENE,
+ CTX_DATA_TOOL_SETTINGS,
+
+ CTX_DATA_SELECTED_OBJECTS,
+ CTX_DATA_SELECTED_BASES,
+ CTX_DATA_SELECTED_EDITABLE_OBJECTS,
+ CTX_DATA_SELECTED_EDITABLE_BASES,
+ CTX_DATA_VISIBLE_OBJECTS,
+ CTX_DATA_VISIBLE_BASES,
+
+ CTX_DATA_ACTIVE_OBJECT,
+ CTX_DATA_ACTIVE_BASE,
+ CTX_DATA_EDIT_OBJECT,
+
+ CTX_DATA_EDIT_IMAGE,
+ CTX_DATA_EDIT_IMAGE_BUFFER,
+
+ CTX_DATA_SELECTED_NODES
+};
+
+typedef int bContextDataMember;
+
typedef int (*bContextDataCallback)(const bContext *C,
- const bContextDataMember *member, bContextDataResult *result);
+ bContextDataMember member, bContextDataResult *result);
/* Context */
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index a2e9329a18a..250aaf7245a 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -77,7 +77,7 @@ typedef struct SpaceType {
void (*keymap)(struct wmWindowManager *);
/* return context data */
- int (*context)(const struct bContext *, const void *, struct bContextDataResult *);
+ int (*context)(const struct bContext *, int, struct bContextDataResult *);
/* region type definitions */
ListBase regiontypes;
@@ -117,7 +117,7 @@ typedef struct ARegionType {
void (*cursor)(struct wmWindow *, struct ScrArea *, struct ARegion *ar);
/* return context data */
- int (*context)(const struct bContext *, const void *, struct bContextDataResult *);
+ int (*context)(const struct bContext *, int, struct bContextDataResult *);
/* custom drawing callbacks */
ListBase drawcalls;
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 2a24e5a9d0f..ccdbea87d87 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -239,18 +239,12 @@ void CTX_wm_ui_block_set(bContext *C, struct uiBlock *block, bContextDataCallbac
/* data context utility functions */
-struct bContextDataMember {
- StructRNA *rna;
- const char *name;
- int collection;
-};
-
struct bContextDataResult {
void *pointer;
ListBase list;
};
-static int ctx_data_get(bContext *C, const bContextDataMember *member, bContextDataResult *result)
+static int ctx_data_get(bContext *C, bContextDataMember member, bContextDataResult *result)
{
int done= 0, recursion= C->data.recursion;
@@ -284,7 +278,7 @@ static int ctx_data_get(bContext *C, const bContextDataMember *member, bContextD
return done;
}
-static void *ctx_data_pointer_get(const bContext *C, const bContextDataMember *member)
+static void *ctx_data_pointer_get(const bContext *C, bContextDataMember member)
{
bContextDataResult result;
@@ -294,7 +288,7 @@ static void *ctx_data_pointer_get(const bContext *C, const bContextDataMember *m
return NULL;
}
-static int ctx_data_pointer_verify(const bContext *C, const bContextDataMember *member, void **pointer)
+static int ctx_data_pointer_verify(const bContext *C, bContextDataMember member, void **pointer)
{
bContextDataResult result;
@@ -308,7 +302,7 @@ static int ctx_data_pointer_verify(const bContext *C, const bContextDataMember *
}
}
-static int ctx_data_collection_get(const bContext *C, const bContextDataMember *member, ListBase *list)
+static int ctx_data_collection_get(const bContext *C, bContextDataMember member, ListBase *list)
{
bContextDataResult result;
@@ -351,7 +345,7 @@ Main *CTX_data_main(const bContext *C)
{
Main *bmain;
- if(ctx_data_pointer_verify(C, CTX_data_main, (void*)&bmain))
+ if(ctx_data_pointer_verify(C, CTX_DATA_MAIN, (void*)&bmain))
return bmain;
else
return C->data.main;
@@ -366,7 +360,7 @@ Scene *CTX_data_scene(const bContext *C)
{
Scene *scene;
- if(ctx_data_pointer_verify(C, CTX_data_scene, (void*)&scene))
+ if(ctx_data_pointer_verify(C, CTX_DATA_SCENE, (void*)&scene))
return scene;
else
return C->data.scene;
@@ -389,62 +383,62 @@ ToolSettings *CTX_data_tool_settings(const bContext *C)
int CTX_data_selected_nodes(const bContext *C, ListBase *list)
{
- return ctx_data_collection_get(C, CTX_data_selected_nodes, list);
+ return ctx_data_collection_get(C, CTX_DATA_SELECTED_NODES, list);
}
int CTX_data_selected_editable_objects(const bContext *C, ListBase *list)
{
- return ctx_data_collection_get(C, CTX_data_selected_editable_objects, list);
+ return ctx_data_collection_get(C, CTX_DATA_SELECTED_EDITABLE_OBJECTS, list);
}
int CTX_data_selected_editable_bases(const bContext *C, ListBase *list)
{
- return ctx_data_collection_get(C, CTX_data_selected_editable_bases, list);
+ return ctx_data_collection_get(C, CTX_DATA_SELECTED_EDITABLE_BASES, list);
}
int CTX_data_selected_objects(const bContext *C, ListBase *list)
{
- return ctx_data_collection_get(C, CTX_data_selected_objects, list);
+ return ctx_data_collection_get(C, CTX_DATA_SELECTED_OBJECTS, list);
}
int CTX_data_selected_bases(const bContext *C, ListBase *list)
{
- return ctx_data_collection_get(C, CTX_data_selected_bases, list);
+ return ctx_data_collection_get(C, CTX_DATA_SELECTED_BASES, list);
}
int CTX_data_visible_objects(const bContext *C, ListBase *list)
{
- return ctx_data_collection_get(C, CTX_data_visible_objects, list);
+ return ctx_data_collection_get(C, CTX_DATA_VISIBLE_OBJECTS, list);
}
int CTX_data_visible_bases(const bContext *C, ListBase *list)
{
- return ctx_data_collection_get(C, CTX_data_visible_bases, list);
+ return ctx_data_collection_get(C, CTX_DATA_VISIBLE_BASES, list);
}
struct Object *CTX_data_active_object(const bContext *C)
{
- return ctx_data_pointer_get(C, CTX_data_active_object);
+ return ctx_data_pointer_get(C, CTX_DATA_ACTIVE_OBJECT);
}
struct Base *CTX_data_active_base(const bContext *C)
{
- return ctx_data_pointer_get(C, CTX_data_active_base);
+ return ctx_data_pointer_get(C, CTX_DATA_ACTIVE_BASE);
}
struct Object *CTX_data_edit_object(const bContext *C)
{
- return ctx_data_pointer_get(C, CTX_data_edit_object);
+ return ctx_data_pointer_get(C, CTX_DATA_EDIT_OBJECT);
}
struct Image *CTX_data_edit_image(const bContext *C)
{
- return ctx_data_pointer_get(C, CTX_data_edit_image);
+ return ctx_data_pointer_get(C, CTX_DATA_EDIT_IMAGE);
}
struct ImBuf *CTX_data_edit_image_buffer(const bContext *C)
{
- return ctx_data_pointer_get(C, CTX_data_edit_image_buffer);
+ return ctx_data_pointer_get(C, CTX_DATA_EDIT_IMAGE_BUFFER);
}
/* data evaluation */