[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