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.
This commit is contained in:
parent
b50ef7af14
commit
128c8167af
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -33,20 +33,20 @@
|
|||
#include "BKE_context.h"
|
||||
#include "BKE_utildefines.h"
|
||||
|
||||
int ed_screen_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
|
||||
int ed_screen_context(const bContext *C, bContextDataMember member, bContextDataResult *result)
|
||||
{
|
||||
bScreen *sc= CTX_wm_screen(C);
|
||||
Scene *scene= sc->scene;
|
||||
Base *base;
|
||||
|
||||
if(member == CTX_data_scene) {
|
||||
if(member == CTX_DATA_SCENE) {
|
||||
CTX_data_pointer_set(result, scene);
|
||||
return 1;
|
||||
}
|
||||
else if(ELEM(member, CTX_data_selected_objects, &CTX_data_selected_bases)) {
|
||||
else if(ELEM(member, CTX_DATA_SELECTED_OBJECTS, CTX_DATA_SELECTED_BASES)) {
|
||||
for(base=scene->base.first; base; base=base->next) {
|
||||
if((base->flag & SELECT) && (base->lay & scene->lay)) {
|
||||
if(member == CTX_data_selected_objects)
|
||||
if(member == CTX_DATA_SELECTED_OBJECTS)
|
||||
CTX_data_list_add(result, base->object);
|
||||
else
|
||||
CTX_data_list_add(result, base);
|
||||
|
@ -55,19 +55,19 @@ int ed_screen_context(const bContext *C, const bContextDataMember *member, bCont
|
|||
|
||||
return 1;
|
||||
}
|
||||
else if(member == CTX_data_active_base) {
|
||||
else if(member == CTX_DATA_ACTIVE_BASE) {
|
||||
if(scene->basact)
|
||||
CTX_data_pointer_set(result, scene->basact);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if(member == CTX_data_active_object) {
|
||||
else if(member == CTX_DATA_ACTIVE_OBJECT) {
|
||||
if(scene->basact)
|
||||
CTX_data_pointer_set(result, scene->basact->object);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if(member == CTX_data_edit_object) {
|
||||
else if(member == CTX_DATA_EDIT_OBJECT) {
|
||||
/* convenience for now, 1 object per scene in editmode */
|
||||
if(scene->obedit)
|
||||
CTX_data_pointer_set(result, scene->obedit);
|
||||
|
|
|
@ -56,7 +56,7 @@ void ed_screen_set(bContext *C, bScreen *sc);
|
|||
void ed_screen_fullarea(bContext *C);
|
||||
|
||||
/* screen_context.c */
|
||||
void ed_screen_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result);
|
||||
void ed_screen_context(const bContext *C, bContextDataMember member, bContextDataResult *result);
|
||||
|
||||
#endif /* ED_SCREEN_INTERN_H */
|
||||
|
||||
|
|
|
@ -230,15 +230,15 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn)
|
|||
}
|
||||
}
|
||||
|
||||
static int image_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
|
||||
static int image_context(const bContext *C, bContextDataMember member, bContextDataResult *result)
|
||||
{
|
||||
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
|
||||
|
||||
if(member == CTX_data_edit_image) {
|
||||
if(member == CTX_DATA_EDIT_IMAGE) {
|
||||
CTX_data_pointer_set(result, get_space_image(sima));
|
||||
return 1;
|
||||
}
|
||||
else if(member == CTX_data_edit_image_buffer) {
|
||||
else if(member == CTX_DATA_EDIT_IMAGE_BUFFER) {
|
||||
CTX_data_pointer_set(result, get_space_image_buffer(sima));
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -273,11 +273,11 @@ static void node_region_listener(ARegion *ar, wmNotifier *wmn)
|
|||
}
|
||||
}
|
||||
|
||||
static int node_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
|
||||
static int node_context(const bContext *C, bContextDataMember member, bContextDataResult *result)
|
||||
{
|
||||
SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
|
||||
|
||||
if(member == CTX_data_selected_nodes) {
|
||||
if(member == CTX_DATA_SELECTED_NODES) {
|
||||
bNode *node;
|
||||
|
||||
for(next_node(snode->edittree); (node=next_node(NULL));) {
|
||||
|
|
|
@ -382,19 +382,19 @@ static int object_is_libdata(Object *ob)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int view3d_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
|
||||
static int view3d_context(const bContext *C, bContextDataMember member, bContextDataResult *result)
|
||||
{
|
||||
View3D *v3d= CTX_wm_view3d(C);
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Base *base;
|
||||
|
||||
if(v3d==NULL) return 0;
|
||||
|
||||
if(ELEM(member, CTX_data_selected_objects, CTX_data_selected_bases)) {
|
||||
|
||||
if(ELEM(member, CTX_DATA_SELECTED_OBJECTS, CTX_DATA_SELECTED_BASES)) {
|
||||
for(base=scene->base.first; base; base=base->next) {
|
||||
if((base->flag & SELECT) && (base->lay & v3d->lay)) {
|
||||
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
|
||||
if(member == CTX_data_selected_objects)
|
||||
if(member == CTX_DATA_SELECTED_OBJECTS)
|
||||
CTX_data_list_add(result, base->object);
|
||||
else
|
||||
CTX_data_list_add(result, base);
|
||||
|
@ -404,12 +404,12 @@ static int view3d_context(const bContext *C, const bContextDataMember *member, b
|
|||
|
||||
return 1;
|
||||
}
|
||||
else if(ELEM(member, CTX_data_selected_editable_objects, CTX_data_selected_editable_bases)) {
|
||||
else if(ELEM(member, CTX_DATA_SELECTED_EDITABLE_OBJECTS, CTX_DATA_SELECTED_EDITABLE_BASES)) {
|
||||
for(base=scene->base.first; base; base=base->next) {
|
||||
if((base->flag & SELECT) && (base->lay & v3d->lay)) {
|
||||
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
|
||||
if(0==object_is_libdata(base->object)) {
|
||||
if(member == CTX_data_selected_editable_objects)
|
||||
if(member == CTX_DATA_SELECTED_EDITABLE_OBJECTS)
|
||||
CTX_data_list_add(result, base->object);
|
||||
else
|
||||
CTX_data_list_add(result, base);
|
||||
|
@ -420,11 +420,11 @@ static int view3d_context(const bContext *C, const bContextDataMember *member, b
|
|||
|
||||
return 1;
|
||||
}
|
||||
else if(ELEM(member, CTX_data_visible_objects, CTX_data_visible_bases)) {
|
||||
else if(ELEM(member, CTX_DATA_VISIBLE_OBJECTS, CTX_DATA_VISIBLE_BASES)) {
|
||||
for(base=scene->base.first; base; base=base->next) {
|
||||
if(base->lay & v3d->lay) {
|
||||
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
|
||||
if(member == CTX_data_visible_objects)
|
||||
if(member == CTX_DATA_VISIBLE_OBJECTS)
|
||||
CTX_data_list_add(result, base->object);
|
||||
else
|
||||
CTX_data_list_add(result, base);
|
||||
|
@ -434,14 +434,14 @@ static int view3d_context(const bContext *C, const bContextDataMember *member, b
|
|||
|
||||
return 1;
|
||||
}
|
||||
else if(member == CTX_data_active_base) {
|
||||
else if(member == CTX_DATA_ACTIVE_BASE) {
|
||||
if(scene->basact && (scene->basact->lay & v3d->lay))
|
||||
if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
|
||||
CTX_data_pointer_set(result, scene->basact);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if(member == CTX_data_active_object) {
|
||||
else if(member == CTX_DATA_ACTIVE_OBJECT) {
|
||||
if(scene->basact && (scene->basact->lay & v3d->lay))
|
||||
if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
|
||||
CTX_data_pointer_set(result, scene->basact->object);
|
||||
|
|
|
@ -177,8 +177,7 @@ void view3d_keymap(wmWindowManager *wm)
|
|||
RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_wpaint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
|
||||
|
||||
/* TODO - this is just while we have no way to load a text datablock */
|
||||
km = WM_keymap_add_item(keymap, "SCRIPT_OT_run_pyfile", PKEY, KM_PRESS, 0, 0);
|
||||
RNA_string_set(km->ptr, "filename", "test.py");
|
||||
RNA_string_set(WM_keymap_add_item(keymap, "SCRIPT_OT_run_pyfile", PKEY, KM_PRESS, 0, 0)->ptr, "filename", "test.py");
|
||||
|
||||
transform_keymap_for_space(wm, keymap, SPACE_VIEW3D);
|
||||
|
||||
|
|
Loading…
Reference in New Issue