[Bf-blender-cvs] [13ec25cd330] temp-workspace-multi-window: Fix drawing glitch in inactive windows after addin layout

Julian Eisel noreply at git.blender.org
Thu Mar 9 13:42:04 CET 2017


Commit: 13ec25cd33096a423f472a8d95a1e03f4d20c6d9
Author: Julian Eisel
Date:   Thu Mar 9 13:39:42 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rB13ec25cd33096a423f472a8d95a1e03f4d20c6d9

Fix drawing glitch in inactive windows after addin layout

Was drawing area edges but not areas itself, had to manually trigger
redraws.
Also some cleanup, it doesn't make much sense to return some layout of
the bunch of ones that have been created.

===================================================================

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/workspace/screen_ops.c
M	source/blender/editors/workspace/workspace_layout_edit.c
M	source/blender/windowmanager/intern/wm_files.c

===================================================================

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 903a51a31ff..8233318b2c4 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -45,6 +45,7 @@ struct wmEvent;
 struct wmKeyConfig;
 struct WorkSpace;
 struct WorkSpaceHook;
+struct WorkSpaceLayout;
 struct bContext;
 struct Scene;
 struct bScreen;
@@ -132,9 +133,8 @@ bool ED_workspace_change(struct bContext *C, struct wmWindowManager *wm, struct
 struct WorkSpace *ED_workspace_duplicate(struct WorkSpace *workspace_old, struct Main *bmain, struct wmWindow *win);
 void ED_workspace_layout_add(struct WorkSpace *workspace, ListBase *windows, const char *name,
                              ScreenLayoutData layout_blueprint) ATTR_NONNULL();
-struct WorkSpaceLayout *ED_workspace_layout_duplicate(struct WorkSpace *workspace,
-                                                      const struct WorkSpaceLayout *layout_old,
-                                                      struct wmWindowManager *wm) ATTR_NONNULL();
+void ED_workspace_layout_duplicate(
+        struct WorkSpace *workspace, const struct WorkSpaceLayout *layout_old, struct wmWindowManager *wm) ATTR_NONNULL();
 bool ED_workspace_delete(struct Main *bmain, struct bContext *C,
                          struct wmWindowManager *wm, struct wmWindow *win,
                          struct WorkSpace *ws);
diff --git a/source/blender/editors/workspace/screen_ops.c b/source/blender/editors/workspace/screen_ops.c
index 2af8e5258ce..20c90962b67 100644
--- a/source/blender/editors/workspace/screen_ops.c
+++ b/source/blender/editors/workspace/screen_ops.c
@@ -3882,11 +3882,10 @@ static int screen_new_exec(bContext *C, wmOperator *UNUSED(op))
 	wmWindowManager *wm = CTX_wm_manager(C);
 	wmWindow *win = CTX_wm_window(C);
 	WorkSpace *workspace = WM_window_get_active_workspace(win);
-	WorkSpaceLayout *layout_old = BKE_workspace_hook_active_layout_get(win->workspace_hook);
-	WorkSpaceLayout *layout_new;
+	WorkSpaceLayout *layout_old = WM_window_get_active_layout(win);
 
-	layout_new = ED_workspace_layout_duplicate(workspace, layout_old, wm);
-	WM_event_add_notifier(C, NC_WORKSPACE | ND_SCREENBROWSE, layout_new);
+	ED_workspace_layout_duplicate(workspace, layout_old, wm);
+	WM_event_add_notifier(C, NC_WORKSPACE | ND_SCREENBROWSE, WM_window_get_active_layout(win));
 
 	return OPERATOR_FINISHED;
 }
diff --git a/source/blender/editors/workspace/workspace_layout_edit.c b/source/blender/editors/workspace/workspace_layout_edit.c
index 8db26515917..25678a7e0ed 100644
--- a/source/blender/editors/workspace/workspace_layout_edit.c
+++ b/source/blender/editors/workspace/workspace_layout_edit.c
@@ -38,6 +38,7 @@
 #include "ED_screen.h"
 
 #include "WM_api.h"
+#include "WM_types.h"
 
 #include "screen_intern.h"
 
@@ -61,28 +62,25 @@ void ED_workspace_layout_add(WorkSpace *workspace, ListBase *windows, const char
 	}
 }
 
-WorkSpaceLayout *ED_workspace_layout_duplicate(WorkSpace *workspace, const WorkSpaceLayout *layout_old,
-                                               wmWindowManager *wm)
+void ED_workspace_layout_duplicate(
+        WorkSpace *workspace, const WorkSpaceLayout *layout_old, wmWindowManager *wm)
 {
 	bScreen *screen_old = BKE_workspace_layout_screen_get(layout_old);
-	ScreenLayoutData layout_data = BKE_screen_layout_data_get(screen_old);
-	bScreen *screen_new;
-	WorkSpaceLayout *layout_new;
+	ScreenLayoutData layout_data = BKE_workspace_layout_type_blueprint_get(BKE_workspace_layout_type_get(layout_old));
 
 	if (BKE_screen_is_fullscreen_area(screen_old)) {
-		return NULL; /* XXX handle this case! */
+		return; /* XXX handle this case! */
 	}
 
 	ED_workspace_layout_add(workspace, &wm->windows, screen_old->id.name + 2, layout_data);
 	for (wmWindow *win = wm->windows.first; win; win = win->next) {
 		if (BKE_workspace_active_get(win->workspace_hook) == workspace) {
-			layout_new = BKE_workspace_hook_active_layout_get(win->workspace_hook);
-			screen_new = BKE_workspace_layout_screen_get(layout_new);
+			bScreen *screen_new = BKE_workspace_hook_active_screen_get(win->workspace_hook);
 			screen_data_copy(screen_new, screen_old);
 		}
 	}
-
-	return layout_new;
+	/* Not sure if calling WM function from here is so nice, we can also directly tag areas for redraw. */
+	WM_main_add_notifier(NC_WINDOW, NULL);
 }
 
 static bool workspace_layout_delete_doit(
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 61ef087caa3..ea5a87d48f0 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -256,9 +256,9 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist)
 						else {
 							WorkSpace *workspace = WM_window_get_active_workspace(win);
 							WorkSpaceLayout *layout_old = WM_window_get_active_layout(win);
-							WorkSpaceLayout *layout_new = ED_workspace_layout_duplicate(workspace, layout_old, wm);
 
-							WM_window_set_active_layout(win, layout_new);
+							ED_workspace_layout_duplicate(workspace, layout_old, wm);
+							WM_window_set_active_layout(win, WM_window_get_active_layout(win));
 						}
 
 						bScreen *win_screen = WM_window_get_active_screen(win);




More information about the Bf-blender-cvs mailing list