diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index f6d41190c5a..9f38c5833a2 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -163,6 +163,8 @@ void CTX_wm_screen_set(bContext *C, struct bScreen *screen); /* to be removed */ void CTX_wm_area_set(bContext *C, struct ScrArea *sa); void CTX_wm_region_set(bContext *C, struct ARegion *region); void CTX_wm_menu_set(bContext *C, struct ARegion *menu); +const char *CTX_wm_operator_poll_msg_get(struct bContext *C); +void CTX_wm_operator_poll_msg_set(struct bContext *C, const char *msg); /* Data Context diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 7928424e47c..a5d96baf049 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -64,6 +64,7 @@ struct bContext { struct ARegion *region; struct ARegion *menu; struct bContextStore *store; + const char *operator_poll_msg; /* reason for poll failing */ } wm; /* data context */ @@ -399,6 +400,16 @@ 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 utility functions */ struct bContextDataResult { diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 9c14be1bd9a..a77e1990c04 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -131,7 +131,11 @@ int ED_operator_view3d_active(bContext *C) int ED_operator_region_view3d_active(bContext *C) { - return CTX_wm_region_view3d(C) != NULL; + if(CTX_wm_region_view3d(C)) + return TRUE; + + CTX_wm_operator_poll_msg_set(C, "expected a view3d region"); + return FALSE; } int ED_operator_timeline_active(bContext *C) diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 13e5d7bbc96..06d93f01e02 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1811,7 +1811,6 @@ static int view3d_zoom_border_invoke(bContext *C, wmOperator *op, wmEvent *event void VIEW3D_OT_zoom_border(wmOperatorType *ot) { - /* identifiers */ ot->name= "Border Zoom"; ot->description = "Zoom in the view to the nearest object contained in the border"; diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index eeab1fce4b2..2b475a57de6 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -127,7 +127,9 @@ static PyObject *pyop_call( PyObject * self, PyObject * args) Py_XINCREF(context_dict); /* so we done loose it */ if(WM_operator_poll((bContext*)C, ot) == FALSE) { - PyErr_Format( PyExc_SystemError, "Operator bpy.ops.%.200s.poll() failed, context is incorrect", opname); + const char *msg= CTX_wm_operator_poll_msg_get(C); + PyErr_Format( PyExc_SystemError, "Operator bpy.ops.%.200s.poll() %s", opname, msg ? msg : "failed, context is incorrect"); + CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */ error_val= -1; } else { diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 45c56164a30..590d28012f9 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -466,6 +466,8 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat) wmWindowManager *wm= CTX_wm_manager(C); int retval= OPERATOR_CANCELLED; + CTX_wm_operator_poll_msg_set(C, NULL); + if(op==NULL || op->type==NULL) return retval; @@ -698,6 +700,8 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex int retval; + CTX_wm_operator_poll_msg_set(C, NULL); + /* dummie test */ if(ot && C) { switch(context) {