[Bf-blender-cvs] [4552b8e] workspaces: Fixes for changing layout with workspace

Julian Eisel noreply at git.blender.org
Sun Dec 4 21:51:34 CET 2016


Commit: 4552b8e1b536c2cf1f1ab6f844e6e6ac7cca3d64
Author: Julian Eisel
Date:   Sun Dec 4 21:47:26 2016 +0100
Branches: workspaces
https://developer.blender.org/rB4552b8e1b536c2cf1f1ab6f844e6e6ac7cca3d64

Fixes for changing layout with workspace

Changing workspace should now change to the active layout of the workspace just fine.
Screen/workspace changing is still a bit hacky since we can't do it during normal handlers. Not sure how we could do it instead, for now I'm just copying hacks from screen changing.

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

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/interface/interface_regions.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/screen/screen_intern.h
M	source/blender/editors/screen/workspace_edit.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_workspace.c
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 97a63c5..d9947d5 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -124,8 +124,8 @@ bool    ED_screen_stereo3d_required(const struct bScreen *screen);
 void    ED_screen_preview_render(const struct bScreen *screen, int size_x, int size_y, unsigned int *r_rect) ATTR_NONNULL();
 
 /* workspaces */
-void ED_workspace_change(struct bContext *C, struct wmWindow *win, WorkSpace *ws_new);
-bool ED_workspace_delete(struct Main *bmain, const struct bContext *C, struct wmWindow *win, WorkSpace *ws);
+bool ED_workspace_change(struct bContext *C, struct wmWindow *win, WorkSpace *ws_new) ATTR_NONNULL();
+bool ED_workspace_delete(struct Main *bmain, struct bContext *C, struct wmWindow *win, WorkSpace *ws);
 
 /* anim */
 void    ED_update_for_newframe(struct Main *bmain, struct Scene *scene, int mute);
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index ca0c603..15a606a 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -117,6 +117,9 @@ static ARegion *ui_region_temp_add(bScreen *sc)
 static void ui_region_temp_remove(bContext *C, bScreen *sc, ARegion *ar)
 {
 	wmWindow *win = CTX_wm_window(C);
+
+	BLI_assert(ar->regiontype == RGN_TYPE_TEMPORARY);
+	BLI_assert(BLI_findindex(&sc->regionbase, ar) != -1);
 	if (win)
 		wm_draw_region_clear(win, ar);
 
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 1e8d2b5..ecc09da 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1503,103 +1503,138 @@ int ED_screen_area_active(const bContext *C)
 	return 0;
 }
 
+
+/* -------------------------------------------------------------------- */
+/* Screen Activation (screen_set_xxx) */
+
+bScreen *screen_set_find_associated_fullscreen(const Main *bmain, bScreen *screen)
+{
+	for (bScreen *screen_iter = bmain->screen.first; screen_iter; screen_iter = screen_iter->id.next) {
+		ScrArea *sa = screen_iter->areabase.first;
+		if (sa->full == screen) {
+			return screen_iter;
+		}
+	}
+
+	return screen;
+}
+
 /**
- * operator call, WM + Window + screen already existed before
- *
- * \warning Do NOT call in area/region queues!
- * \returns success.
+ * Refresh data and make screen ready for drawing *after* activating it.
  */
-bool ED_screen_set(bContext *C, bScreen *sc)
+void screen_set_refresh(Main *bmain, bContext *C, wmWindow *win, bool scene_changed)
+{
+	bScreen *sc = WM_window_get_active_screen(win);
+
+	CTX_wm_window_set(C, win);  // stores C->wm.screen... hrmf
+
+	/* prevent multiwin errors */
+	sc->winid = win->winid;
+
+	ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
+	WM_event_add_notifier(C, NC_WINDOW, NULL);
+	WM_event_add_notifier(C, NC_SCREEN | ND_SCREENSET, sc);
+
+	/* makes button hilites work */
+	WM_event_add_mousemove(C);
+
+	/* Needed to make sure all the derivedMeshes are
+	 * up-to-date before viewport starts acquiring this.
+	 *
+	 * This is needed in cases when, for example, boolean
+	 * modifier uses operant from invisible layer.
+	 * Without this trick boolean wouldn't apply correct.
+	 *
+	 * Quite the same happens when setting screen's scene,
+	 * so perhaps this is in fact correct thing to do.
+	 */
+	if (scene_changed) {
+		BKE_scene_set_background(bmain, sc->scene);
+	}
+
+	/* Always do visible update since it's possible new screen will
+	 * have different layers visible in 3D view-ports.
+	 * This is possible because of view3d.lock_camera_and_layers option.
+	 */
+	DAG_on_visible_update(bmain, false);
+}
+
+/**
+ * Make sure the correct screen is used and that it's valid for display in \a win.
+ * \return the screen to activate (might differ from \a screen_new in case
+ *         of fullscreen) or NULL if no valid one found.
+ */
+bScreen *screen_set_ensure_valid(const Main *bmain, const wmWindow *win, bScreen *screen_new)
 {
-	Main *bmain = CTX_data_main(C);
-	wmWindowManager *wm = CTX_wm_manager(C);
-	wmWindow *win = CTX_wm_window(C);
-	bScreen *oldscreen = CTX_wm_screen(C);
-	
 	/* validate screen, it's called with notifier reference */
-	if (BLI_findindex(&bmain->screen, sc) == -1) {
-		return true;
+	if (BLI_findindex(&bmain->screen, screen_new) == -1) {
+		return NULL;
 	}
 
-	if (ELEM(sc->state, SCREENMAXIMIZED, SCREENFULL)) {
-		/* find associated full */
-		bScreen *sc1;
-		for (sc1 = bmain->screen.first; sc1; sc1 = sc1->id.next) {
-			ScrArea *sa = sc1->areabase.first;
-			if (sa->full == sc) {
-				sc = sc1;
-				break;
-			}
-		}
+	if (ELEM(screen_new->state, SCREENMAXIMIZED, SCREENFULL)) {
+		screen_new = screen_set_find_associated_fullscreen(bmain, screen_new);
 	}
 
 	/* check for valid winid */
-	if (sc->winid != 0 && sc->winid != win->winid) {
-		return false;
+	if (!(screen_new->winid == 0 || screen_new->winid == win->winid)) {
+		return NULL;
 	}
-	
-	if (oldscreen != sc) {
-		wmTimer *wt = oldscreen->animtimer;
-		ScrArea *sa;
-		Scene *oldscene = oldscreen->scene;
 
-		/* remove handlers referencing areas in old screen */
-		for (sa = oldscreen->areabase.first; sa; sa = sa->next) {
-			WM_event_remove_area_handler(&win->modalhandlers, sa);
-		}
+	return screen_new;
+}
 
-		/* we put timer to sleep, so screen_exit has to think there's no timer */
-		oldscreen->animtimer = NULL;
-		if (wt) {
-			WM_event_timer_sleep(wm, win, wt, true);
-		}
+void screen_set_prepare(bContext *C, wmWindow *win, bScreen *screen_new, bScreen *screen_old)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmTimer *wt = screen_old->animtimer;
+	ScrArea *sa;
+	Scene *scene_old = screen_old->scene;
 
-		ED_screen_exit(C, win, oldscreen);
+	/* remove handlers referencing areas in old screen */
+	for (sa = screen_old->areabase.first; sa; sa = sa->next) {
+		WM_event_remove_area_handler(&win->modalhandlers, sa);
+	}
 
-		/* Same scene, "transfer" playback to new screen. */
-		if (wt) {
-			if (oldscene == sc->scene) {
-				sc->animtimer = wt;
-			}
-			/* Else, stop playback. */
-			else {
-				oldscreen->animtimer = wt;
-				ED_screen_animation_play(C, 0, 0);
-			}
+	/* we put timer to sleep, so screen_exit has to think there's no timer */
+	screen_old->animtimer = NULL;
+	if (wt) {
+		WM_event_timer_sleep(wm, win, wt, true);
+	}
+	ED_screen_exit(C, win, screen_old);
+
+	/* Same scene, "transfer" playback to new screen. */
+	if (wt) {
+		if (scene_old == screen_new->scene) {
+			screen_new->animtimer = wt;
+		}
+		/* Else, stop playback. */
+		else {
+			screen_old->animtimer = wt;
+			ED_screen_animation_play(C, 0, 0);
 		}
+	}
+}
 
-		WM_window_set_active_screen(win, sc);
-		CTX_wm_window_set(C, win);  // stores C->wm.screen... hrmf
+/**
+ * operator call, WM + Window + screen already existed before
+ * \warning Do NOT call in area/region queues!
+ * \returns success.
+ */
+bool ED_screen_set(bContext *C, bScreen *sc)
+{
+	Main *bmain = CTX_data_main(C);
+	wmWindow *win = CTX_wm_window(C);
+	bScreen *screen_old = CTX_wm_screen(C);
+	bScreen *screen_new;
 
-		/* prevent multiwin errors */
-		sc->winid = win->winid;
-		
-		ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
-		WM_event_add_notifier(C, NC_WINDOW, NULL);
-		WM_event_add_notifier(C, NC_SCREEN | ND_SCREENSET, sc);
-		
-		/* makes button hilites work */
-		WM_event_add_mousemove(C);
-
-		/* Needed to make sure all the derivedMeshes are
-		 * up-to-date before viewport starts acquiring this.
-		 *
-		 * This is needed in cases when, for example, boolean
-		 * modifier uses operant from invisible layer.
-		 * Without this trick boolean wouldn't apply correct.
-		 *
-		 * Quite the same happens when setting screen's scene,
-		 * so perhaps this is in fact correct thing to do.
-		 */
-		if (oldscene != sc->scene) {
-			BKE_scene_set_background(bmain, sc->scene);
-		}
+	if (!(screen_new = screen_set_ensure_valid(bmain, win, sc))) {
+		return false;
+	}
 
-		/* Always do visible update since it's possible new screen will
-		 * have different layers visible in 3D view-ports.
-		 * This is possible because of view3d.lock_camera_and_layers option.
-		 */
-		DAG_on_visible_update(bmain, false);
+	if (screen_old != screen_new) {
+		screen_set_prepare(C, win, screen_new, screen_old);
+		WM_window_set_active_screen(win, sc);
+		screen_set_refresh(bmain, C, win, screen_old->scene != screen_new->scene);
 	}
 
 	return true;
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index b42890f..d4481bd 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -31,6 +31,8 @@
 #ifndef __SCREEN_INTERN_H__
 #define __SCREEN_INTERN_H__
 
+struct Main;
+
 /* internal exports only */
 
 #define AZONESPOT       (0.6f * U.widget_unit)
@@ -43,6 +45,10 @@ void        ED_area_data_swap(ScrArea *sa1, ScrArea *sa2);
 void		region_toggle_hidden(bContext *C, ARegion *ar, const bool do_fade);
 
 /* screen_edit.c */
+bScreen    *screen_set_find_associated_fullscreen(const struct Main *bmain, bScreen *screen);
+void        screen_set_refresh(struct Main *bmain, bContext *C, wmWindow *win, bool scene_changed);
+bScreen    *screen_set_ensure_valid(const struct Main *bmain, const wmWindow *win, bScreen *screen_new);
+void        screen_set_prepare(bContext *C, wmWindow *win, bScreen *screen_new, bScreen *screen_old);
 ScrEdge    *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2);
 ScrArea    *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge);
 int         screen_area_join(bContext *C, bScreen *scr, ScrArea *sa1, ScrArea *sa2);
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index efc969b..91466d3 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -37,6 +37,8 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "screen_intern.h"
+
 
 /** \name Workspace API
  *
@@ -44,16 +46,39 @@
  * \{ */
 
 
-void ED_workspace_change(bContext *C, wmWindow 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list