Fix saving images from temp Image Editor failing
authorJulian Eisel <eiseljulian@gmail.com>
Sat, 7 Sep 2019 14:00:19 +0000 (16:00 +0200)
committerJulian Eisel <eiseljulian@gmail.com>
Sat, 7 Sep 2019 14:08:56 +0000 (16:08 +0200)
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.

source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/wm_event_system.h

index 828c337d64d91f053f82735b9e49f60e7a4c3844..ff22956e7235c0a3326006bbd5a5bde96b68b057 100644 (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);
 
index 53b25a80dced158fcbe2b98745e3df661d3ba094..c53ccda170a96ee0285b4e91724544fed8921b2b 100644 (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;