diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-10-06 16:27:27 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-10-06 16:36:39 +0300 |
commit | 84713629877d84d8c973d55e7e7cb0eca0f2ba49 (patch) | |
tree | db12b860677dd59f3e3ffddb71c670de7aeb36d3 /source/blender/editors | |
parent | 867c49b962fed324b41492e4cbaf586b5020e2dd (diff) |
WM: Fix crash when a new window can't be created
Report an error instead of crashing if a new window can't be created
(typically caused by bad drivers).
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/render/render_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_internal.c | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_view.c | 12 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 28 |
5 files changed, 33 insertions, 13 deletions
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h index 54429f9f066..26f313cb3fe 100644 --- a/source/blender/editors/render/render_intern.h +++ b/source/blender/editors/render/render_intern.h @@ -93,7 +93,7 @@ void render_view3d_update(struct RenderEngine *engine, const struct bContext *C) void render_view3d_draw(struct RenderEngine *engine, const struct bContext *C); /* render_view.c */ -struct ScrArea *render_view_open(struct bContext *C, int mx, int my); +struct ScrArea *render_view_open(struct bContext *C, int mx, int my, struct ReportList *reports); void RENDER_OT_view_show(struct wmOperatorType *ot); void RENDER_OT_view_cancel(struct wmOperatorType *ot); diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 10de2d667ea..4c10c07e189 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -877,7 +877,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even // store spare /* ensure at least 1 area shows result */ - sa = render_view_open(C, event->x, event->y); + sa = render_view_open(C, event->x, event->y, op->reports); jobflag = WM_JOB_EXCL_RENDER | WM_JOB_PRIORITY | WM_JOB_PROGRESS; diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index fe4022709de..954fcdef63e 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -911,7 +911,7 @@ static int screen_opengl_render_invoke(bContext *C, wmOperator *op, const wmEven } oglrender = op->customdata; - render_view_open(C, event->x, event->y); + render_view_open(C, event->x, event->y, op->reports); /* view may be changed above (R_OUTPUT_WINDOW) */ oglrender->win = CTX_wm_window(C); diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c index f6690296890..4e36303d829 100644 --- a/source/blender/editors/render/render_view.c +++ b/source/blender/editors/render/render_view.c @@ -38,6 +38,7 @@ #include "BKE_image.h" #include "BKE_global.h" #include "BKE_screen.h" +#include "BKE_report.h" #include "WM_api.h" #include "WM_types.h" @@ -125,7 +126,7 @@ static ScrArea *find_area_image_empty(bContext *C) /********************** open image editor for render *************************/ /* new window uses x,y to set position */ -ScrArea *render_view_open(bContext *C, int mx, int my) +ScrArea *render_view_open(bContext *C, int mx, int my, ReportList *reports) { wmWindow *win = CTX_wm_window(C); Scene *scene = CTX_data_scene(C); @@ -155,7 +156,10 @@ ScrArea *render_view_open(bContext *C, int mx, int my) rect.ymax = rect.ymin + sizey; /* changes context! */ - WM_window_open_temp(C, &rect, WM_WINDOW_RENDER); + if (WM_window_open_temp(C, &rect, WM_WINDOW_RENDER) == NULL) { + BKE_report(reports, RPT_ERROR, "Failed to open window!"); + return NULL; + } sa = CTX_wm_area(C); } @@ -292,7 +296,7 @@ void RENDER_OT_view_cancel(struct wmOperatorType *ot) /************************* show render viewer *****************/ -static int render_view_show_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event) +static int render_view_show_invoke(bContext *C, wmOperator *op, const wmEvent *event) { wmWindow *wincur = CTX_wm_window(C); @@ -341,7 +345,7 @@ static int render_view_show_invoke(bContext *C, wmOperator *UNUSED(op), const wm } } else { - render_view_open(C, event->x, event->y); + render_view_open(C, event->x, event->y, op->reports); } } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 4a1c1e34414..24653dc556c 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -992,6 +992,11 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event) rect.ymax = rect.ymin + BLI_rcti_size_y(&rect) / U.pixelsize; newwin = WM_window_open(C, &rect); + if (newwin == NULL) { + BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); + goto finally; + } + *newwin->stereo3d_format = *win->stereo3d_format; /* allocs new screen and adds to newly created window, using window size */ @@ -1005,11 +1010,18 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event) /* screen, areas init */ WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); - + + +finally: if (event->type == EVT_ACTIONZONE_AREA) actionzone_exit(op); - return OPERATOR_FINISHED; + if (newwin) { + return OPERATOR_FINISHED; + } + else { + return OPERATOR_CANCELLED; + } } static void SCREEN_OT_area_dupli(wmOperatorType *ot) @@ -3845,7 +3857,7 @@ static void SCREEN_OT_back_to_previous(struct wmOperatorType *ot) /* *********** show user pref window ****** */ -static int userpref_show_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event) +static int userpref_show_invoke(bContext *C, wmOperator *op, const wmEvent *event) { wmWindow *win = CTX_wm_window(C); rcti rect; @@ -3862,9 +3874,13 @@ static int userpref_show_invoke(bContext *C, wmOperator *UNUSED(op), const wmEve rect.ymax = rect.ymin + sizey; /* changes context! */ - WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS); - - return OPERATOR_FINISHED; + if (WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS) != NULL) { + return OPERATOR_FINISHED; + } + else { + BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); + return OPERATOR_CANCELLED; + } } |