Fix saving images from temp Image Editor failing

Steps to reproduce were:
* Ensure //Render//->//Display Mode// is //New Window//
* F12
* In the opened Image Editor, Alt+S to save the image
* Save the image
The saving would fail silently.

Issue was that wm_handler_op_context() would fail to find the correct
area to activate, as the wrong window was active in context. So allow
overriding this window and do so when creating the file-select handler.
This commit is contained in:
Julian Eisel 2019-09-07 16:00:19 +02:00
parent fa7ee622f0
commit ab823176d3
Notes: blender-bot 2023-02-14 02:27:51 +01:00
Referenced by commit a566b71333, Fix crash closing stacked file browser window
2 changed files with 13 additions and 2 deletions

View File

@ -1804,8 +1804,11 @@ void wm_event_free_handler(wmEventHandler *handler)
/* only set context when area/region is part of screen */
static void wm_handler_op_context(bContext *C, wmEventHandler_Op *handler, const wmEvent *event)
{
wmWindow *win = CTX_wm_window(C);
bScreen *screen = CTX_wm_screen(C);
wmWindow *win = handler->context.win ? handler->context.win : CTX_wm_window(C);
/* It's probably fine to always use WM_window_get_active_screen() to get the screen. But this
* code has been getting it through context since forever, so play safe and stick to that when
* possible. */
bScreen *screen = handler->context.win ? WM_window_get_active_screen(win) : CTX_wm_screen(C);
if (screen && handler->op) {
if (handler->context.area == NULL) {
@ -2401,6 +2404,9 @@ static int wm_handler_fileselect_do(bContext *C,
* opening (UI_BLOCK_MOVEMOUSE_QUIT) */
wm_get_cursor_position(ctx_win, &ctx_win->eventstate->x, &ctx_win->eventstate->y);
wm->winactive = ctx_win; /* Reports use this... */
if (handler->context.win == win) {
handler->context.win = NULL;
}
}
else if (file_sa->full) {
ED_screen_full_prevspace(C, file_sa);
@ -3538,6 +3544,7 @@ void WM_event_add_fileselect(bContext *C, wmOperator *op)
handler->is_fileselect = true;
handler->op = op;
handler->context.win = CTX_wm_window(C);
handler->context.area = CTX_wm_area(C);
handler->context.region = CTX_wm_region(C);

View File

@ -116,6 +116,10 @@ typedef struct wmEventHandler_Op {
/** Store context for this handler for derived/modal handlers. */
struct {
/* To override the window, and hence the screen. Set for few cases only, usually window/screen
* can be taken from current context. */
struct wmWindow *win;
struct ScrArea *area;
struct ARegion *region;
short region_type;