fix for reading outside allocated memory when switching to the 3D view.
This commit is contained in:
@@ -200,8 +200,8 @@ void CTX_data_dir_set(bContextDataResult *result, const char **member);
|
||||
void CTX_data_type_set(struct bContextDataResult *result, short type);
|
||||
short CTX_data_type_get(struct bContextDataResult *result);
|
||||
|
||||
int CTX_data_equals(const char *member, const char *str);
|
||||
int CTX_data_dir(const char *member);
|
||||
bool CTX_data_equals(const char *member, const char *str);
|
||||
bool CTX_data_dir(const char *member);
|
||||
|
||||
#if 0
|
||||
void CTX_data_pointer_set(bContextDataResult *result, void *data);
|
||||
|
@@ -531,12 +531,12 @@ ListBase CTX_data_dir_get(const bContext *C)
|
||||
return CTX_data_dir_get_ex(C, TRUE, FALSE, FALSE);
|
||||
}
|
||||
|
||||
int CTX_data_equals(const char *member, const char *str)
|
||||
bool CTX_data_equals(const char *member, const char *str)
|
||||
{
|
||||
return (strcmp(member, str) == 0);
|
||||
}
|
||||
|
||||
int CTX_data_dir(const char *member)
|
||||
bool CTX_data_dir(const char *member)
|
||||
{
|
||||
return member[0] == '\0';
|
||||
}
|
||||
|
@@ -1141,17 +1141,17 @@ const char *view3d_context_dir[] = {
|
||||
|
||||
static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
|
||||
{
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Base *base;
|
||||
/* fallback to the scene layer, allows duplicate and other object operators to run outside the 3d view */
|
||||
unsigned int lay = v3d ? v3d->lay : scene->lay;
|
||||
|
||||
if (CTX_data_dir(member)) {
|
||||
CTX_data_dir_set(result, view3d_context_dir);
|
||||
}
|
||||
else if (CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) {
|
||||
int selected_objects = CTX_data_equals(member, "selected_objects");
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const unsigned int lay = v3d ? v3d->lay : scene->lay;
|
||||
Base *base;
|
||||
const bool selected_objects = CTX_data_equals(member, "selected_objects");
|
||||
|
||||
for (base = scene->base.first; base; base = base->next) {
|
||||
if ((base->flag & SELECT) && (base->lay & lay)) {
|
||||
@@ -1167,7 +1167,11 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) {
|
||||
int selected_editable_objects = CTX_data_equals(member, "selected_editable_objects");
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const unsigned int lay = v3d ? v3d->lay : scene->lay;
|
||||
Base *base;
|
||||
const bool selected_editable_objects = CTX_data_equals(member, "selected_editable_objects");
|
||||
|
||||
for (base = scene->base.first; base; base = base->next) {
|
||||
if ((base->flag & SELECT) && (base->lay & lay)) {
|
||||
@@ -1185,7 +1189,11 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) {
|
||||
int visible_objects = CTX_data_equals(member, "visible_objects");
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const unsigned int lay = v3d ? v3d->lay : scene->lay;
|
||||
Base *base;
|
||||
const bool visible_objects = CTX_data_equals(member, "visible_objects");
|
||||
|
||||
for (base = scene->base.first; base; base = base->next) {
|
||||
if (base->lay & lay) {
|
||||
@@ -1201,7 +1209,11 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) {
|
||||
int selectable_objects = CTX_data_equals(member, "selectable_objects");
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const unsigned int lay = v3d ? v3d->lay : scene->lay;
|
||||
Base *base;
|
||||
const bool selectable_objects = CTX_data_equals(member, "selectable_objects");
|
||||
|
||||
for (base = scene->base.first; base; base = base->next) {
|
||||
if (base->lay & lay) {
|
||||
@@ -1217,6 +1229,9 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "active_base")) {
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const unsigned int lay = v3d ? v3d->lay : scene->lay;
|
||||
if (scene->basact && (scene->basact->lay & lay)) {
|
||||
Object *ob = scene->basact->object;
|
||||
/* if hidden but in edit mode, we still display, can happen with animation */
|
||||
@@ -1227,6 +1242,9 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "active_object")) {
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const unsigned int lay = v3d ? v3d->lay : scene->lay;
|
||||
if (scene->basact && (scene->basact->lay & lay)) {
|
||||
Object *ob = scene->basact->object;
|
||||
if ((ob->restrictflag & OB_RESTRICT_VIEW) == 0 || (ob->mode & OB_MODE_EDIT))
|
||||
|
Reference in New Issue
Block a user