From e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Apr 2019 06:17:24 +0200 Subject: ClangFormat: apply to source, most of intern Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat --- source/blender/editors/screen/screen_edit.c | 2422 ++++++++++++++------------- 1 file changed, 1217 insertions(+), 1205 deletions(-) (limited to 'source/blender/editors/screen/screen_edit.c') diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 031eee3c9a4..8caa960bb9a 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -21,11 +21,9 @@ * \ingroup edscr */ - #include #include - #include "MEM_guardedalloc.h" #include "DNA_object_types.h" @@ -64,136 +62,140 @@ #include "DEG_depsgraph_query.h" -#include "screen_intern.h" /* own module include */ - +#include "screen_intern.h" /* own module include */ /* adds no space data */ -static ScrArea *screen_addarea_ex( - ScrAreaMap *area_map, - ScrVert *bottom_left, ScrVert *top_left, ScrVert *top_right, ScrVert *bottom_right, - short spacetype) +static ScrArea *screen_addarea_ex(ScrAreaMap *area_map, + ScrVert *bottom_left, + ScrVert *top_left, + ScrVert *top_right, + ScrVert *bottom_right, + short spacetype) { - ScrArea *sa = MEM_callocN(sizeof(ScrArea), "addscrarea"); + ScrArea *sa = MEM_callocN(sizeof(ScrArea), "addscrarea"); - sa->v1 = bottom_left; - sa->v2 = top_left; - sa->v3 = top_right; - sa->v4 = bottom_right; - sa->spacetype = spacetype; + sa->v1 = bottom_left; + sa->v2 = top_left; + sa->v3 = top_right; + sa->v4 = bottom_right; + sa->spacetype = spacetype; - BLI_addtail(&area_map->areabase, sa); + BLI_addtail(&area_map->areabase, sa); - return sa; + return sa; } -static ScrArea *screen_addarea( - bScreen *sc, - ScrVert *left_bottom, ScrVert *left_top, ScrVert *right_top, ScrVert *right_bottom, - short spacetype) +static ScrArea *screen_addarea(bScreen *sc, + ScrVert *left_bottom, + ScrVert *left_top, + ScrVert *right_top, + ScrVert *right_bottom, + short spacetype) { - return screen_addarea_ex(AREAMAP_FROM_SCREEN(sc), left_bottom, left_top, right_top, right_bottom, - spacetype); + return screen_addarea_ex( + AREAMAP_FROM_SCREEN(sc), left_bottom, left_top, right_top, right_bottom, spacetype); } static void screen_delarea(bContext *C, bScreen *sc, ScrArea *sa) { - ED_area_exit(C, sa); + ED_area_exit(C, sa); - BKE_screen_area_free(sa); + BKE_screen_area_free(sa); - BLI_remlink(&sc->areabase, sa); - MEM_freeN(sa); + BLI_remlink(&sc->areabase, sa); + MEM_freeN(sa); } ScrArea *area_split(const wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac, int merge) { - ScrArea *newa = NULL; - ScrVert *sv1, *sv2; - short split; - rcti window_rect; - - if (sa == NULL) return NULL; - - WM_window_rect_calc(win, &window_rect); - - split = screen_geom_find_area_split_point(sa, &window_rect, dir, fac); - if (split == 0) return NULL; - - /* note regarding (fac > 0.5f) checks below. - * normally it shouldn't matter which is used since the copy should match the original - * however with viewport rendering and python console this isn't the case. - campbell */ - - if (dir == 'h') { - /* new vertices */ - sv1 = screen_geom_vertex_add(sc, sa->v1->vec.x, split); - sv2 = screen_geom_vertex_add(sc, sa->v4->vec.x, split); - - /* new edges */ - screen_geom_edge_add(sc, sa->v1, sv1); - screen_geom_edge_add(sc, sv1, sa->v2); - screen_geom_edge_add(sc, sa->v3, sv2); - screen_geom_edge_add(sc, sv2, sa->v4); - screen_geom_edge_add(sc, sv1, sv2); - - if (fac > 0.5f) { - /* new areas: top */ - newa = screen_addarea(sc, sv1, sa->v2, sa->v3, sv2, sa->spacetype); - - /* area below */ - sa->v2 = sv1; - sa->v3 = sv2; - } - else { - /* new areas: bottom */ - newa = screen_addarea(sc, sa->v1, sv1, sv2, sa->v4, sa->spacetype); - - /* area above */ - sa->v1 = sv1; - sa->v4 = sv2; - } - - ED_area_data_copy(newa, sa, true); - - } - else { - /* new vertices */ - sv1 = screen_geom_vertex_add(sc, split, sa->v1->vec.y); - sv2 = screen_geom_vertex_add(sc, split, sa->v2->vec.y); - - /* new edges */ - screen_geom_edge_add(sc, sa->v1, sv1); - screen_geom_edge_add(sc, sv1, sa->v4); - screen_geom_edge_add(sc, sa->v2, sv2); - screen_geom_edge_add(sc, sv2, sa->v3); - screen_geom_edge_add(sc, sv1, sv2); - - if (fac > 0.5f) { - /* new areas: right */ - newa = screen_addarea(sc, sv1, sv2, sa->v3, sa->v4, sa->spacetype); - - /* area left */ - sa->v3 = sv2; - sa->v4 = sv1; - } - else { - /* new areas: left */ - newa = screen_addarea(sc, sa->v1, sa->v2, sv2, sv1, sa->spacetype); - - /* area right */ - sa->v1 = sv1; - sa->v2 = sv2; - } - - ED_area_data_copy(newa, sa, true); - } - - /* remove double vertices en edges */ - if (merge) - BKE_screen_remove_double_scrverts(sc); - BKE_screen_remove_double_scredges(sc); - BKE_screen_remove_unused_scredges(sc); - - return newa; + ScrArea *newa = NULL; + ScrVert *sv1, *sv2; + short split; + rcti window_rect; + + if (sa == NULL) + return NULL; + + WM_window_rect_calc(win, &window_rect); + + split = screen_geom_find_area_split_point(sa, &window_rect, dir, fac); + if (split == 0) + return NULL; + + /* note regarding (fac > 0.5f) checks below. + * normally it shouldn't matter which is used since the copy should match the original + * however with viewport rendering and python console this isn't the case. - campbell */ + + if (dir == 'h') { + /* new vertices */ + sv1 = screen_geom_vertex_add(sc, sa->v1->vec.x, split); + sv2 = screen_geom_vertex_add(sc, sa->v4->vec.x, split); + + /* new edges */ + screen_geom_edge_add(sc, sa->v1, sv1); + screen_geom_edge_add(sc, sv1, sa->v2); + screen_geom_edge_add(sc, sa->v3, sv2); + screen_geom_edge_add(sc, sv2, sa->v4); + screen_geom_edge_add(sc, sv1, sv2); + + if (fac > 0.5f) { + /* new areas: top */ + newa = screen_addarea(sc, sv1, sa->v2, sa->v3, sv2, sa->spacetype); + + /* area below */ + sa->v2 = sv1; + sa->v3 = sv2; + } + else { + /* new areas: bottom */ + newa = screen_addarea(sc, sa->v1, sv1, sv2, sa->v4, sa->spacetype); + + /* area above */ + sa->v1 = sv1; + sa->v4 = sv2; + } + + ED_area_data_copy(newa, sa, true); + } + else { + /* new vertices */ + sv1 = screen_geom_vertex_add(sc, split, sa->v1->vec.y); + sv2 = screen_geom_vertex_add(sc, split, sa->v2->vec.y); + + /* new edges */ + screen_geom_edge_add(sc, sa->v1, sv1); + screen_geom_edge_add(sc, sv1, sa->v4); + screen_geom_edge_add(sc, sa->v2, sv2); + screen_geom_edge_add(sc, sv2, sa->v3); + screen_geom_edge_add(sc, sv1, sv2); + + if (fac > 0.5f) { + /* new areas: right */ + newa = screen_addarea(sc, sv1, sv2, sa->v3, sa->v4, sa->spacetype); + + /* area left */ + sa->v3 = sv2; + sa->v4 = sv1; + } + else { + /* new areas: left */ + newa = screen_addarea(sc, sa->v1, sa->v2, sv2, sv1, sa->spacetype); + + /* area right */ + sa->v1 = sv1; + sa->v2 = sv2; + } + + ED_area_data_copy(newa, sa, true); + } + + /* remove double vertices en edges */ + if (merge) + BKE_screen_remove_double_scrverts(sc); + BKE_screen_remove_double_scredges(sc); + BKE_screen_remove_unused_scredges(sc); + + return newa; } /** @@ -201,74 +203,74 @@ ScrArea *area_split(const wmWindow *win, bScreen *sc, ScrArea *sa, char dir, flo */ bScreen *screen_add(Main *bmain, const char *name, const rcti *rect) { - bScreen *sc; - ScrVert *sv1, *sv2, *sv3, *sv4; + bScreen *sc; + ScrVert *sv1, *sv2, *sv3, *sv4; - sc = BKE_libblock_alloc(bmain, ID_SCR, name, 0); - sc->do_refresh = true; - sc->redraws_flag = TIME_ALL_3D_WIN | TIME_ALL_ANIM_WIN; + sc = BKE_libblock_alloc(bmain, ID_SCR, name, 0); + sc->do_refresh = true; + sc->redraws_flag = TIME_ALL_3D_WIN | TIME_ALL_ANIM_WIN; - sv1 = screen_geom_vertex_add(sc, rect->xmin, rect->ymin); - sv2 = screen_geom_vertex_add(sc, rect->xmin, rect->ymax - 1); - sv3 = screen_geom_vertex_add(sc, rect->xmax - 1, rect->ymax - 1); - sv4 = screen_geom_vertex_add(sc, rect->xmax - 1, rect->ymin); + sv1 = screen_geom_vertex_add(sc, rect->xmin, rect->ymin); + sv2 = screen_geom_vertex_add(sc, rect->xmin, rect->ymax - 1); + sv3 = screen_geom_vertex_add(sc, rect->xmax - 1, rect->ymax - 1); + sv4 = screen_geom_vertex_add(sc, rect->xmax - 1, rect->ymin); - screen_geom_edge_add(sc, sv1, sv2); - screen_geom_edge_add(sc, sv2, sv3); - screen_geom_edge_add(sc, sv3, sv4); - screen_geom_edge_add(sc, sv4, sv1); + screen_geom_edge_add(sc, sv1, sv2); + screen_geom_edge_add(sc, sv2, sv3); + screen_geom_edge_add(sc, sv3, sv4); + screen_geom_edge_add(sc, sv4, sv1); - /* dummy type, no spacedata */ - screen_addarea(sc, sv1, sv2, sv3, sv4, SPACE_EMPTY); + /* dummy type, no spacedata */ + screen_addarea(sc, sv1, sv2, sv3, sv4, SPACE_EMPTY); - return sc; + return sc; } void screen_data_copy(bScreen *to, bScreen *from) { - ScrVert *s1, *s2; - ScrEdge *se; - ScrArea *sa, *saf; - - /* free contents of 'to', is from blenkernel screen.c */ - BKE_screen_free(to); - - to->flag = from->flag; - - BLI_duplicatelist(&to->vertbase, &from->vertbase); - BLI_duplicatelist(&to->edgebase, &from->edgebase); - BLI_duplicatelist(&to->areabase, &from->areabase); - BLI_listbase_clear(&to->regionbase); - - s2 = to->vertbase.first; - for (s1 = from->vertbase.first; s1; s1 = s1->next, s2 = s2->next) { - s1->newv = s2; - } - - for (se = to->edgebase.first; se; se = se->next) { - se->v1 = se->v1->newv; - se->v2 = se->v2->newv; - BKE_screen_sort_scrvert(&(se->v1), &(se->v2)); - } - - saf = from->areabase.first; - for (sa = to->areabase.first; sa; sa = sa->next, saf = saf->next) { - sa->v1 = sa->v1->newv; - sa->v2 = sa->v2->newv; - sa->v3 = sa->v3->newv; - sa->v4 = sa->v4->newv; - - BLI_listbase_clear(&sa->spacedata); - BLI_listbase_clear(&sa->regionbase); - BLI_listbase_clear(&sa->actionzones); - BLI_listbase_clear(&sa->handlers); - - ED_area_data_copy(sa, saf, true); - } - - /* put at zero (needed?) */ - for (s1 = from->vertbase.first; s1; s1 = s1->next) - s1->newv = NULL; + ScrVert *s1, *s2; + ScrEdge *se; + ScrArea *sa, *saf; + + /* free contents of 'to', is from blenkernel screen.c */ + BKE_screen_free(to); + + to->flag = from->flag; + + BLI_duplicatelist(&to->vertbase, &from->vertbase); + BLI_duplicatelist(&to->edgebase, &from->edgebase); + BLI_duplicatelist(&to->areabase, &from->areabase); + BLI_listbase_clear(&to->regionbase); + + s2 = to->vertbase.first; + for (s1 = from->vertbase.first; s1; s1 = s1->next, s2 = s2->next) { + s1->newv = s2; + } + + for (se = to->edgebase.first; se; se = se->next) { + se->v1 = se->v1->newv; + se->v2 = se->v2->newv; + BKE_screen_sort_scrvert(&(se->v1), &(se->v2)); + } + + saf = from->areabase.first; + for (sa = to->areabase.first; sa; sa = sa->next, saf = saf->next) { + sa->v1 = sa->v1->newv; + sa->v2 = sa->v2->newv; + sa->v3 = sa->v3->newv; + sa->v4 = sa->v4->newv; + + BLI_listbase_clear(&sa->spacedata); + BLI_listbase_clear(&sa->regionbase); + BLI_listbase_clear(&sa->actionzones); + BLI_listbase_clear(&sa->handlers); + + ED_area_data_copy(sa, saf, true); + } + + /* put at zero (needed?) */ + for (s1 = from->vertbase.first; s1; s1 = s1->next) + s1->newv = NULL; } /** @@ -276,45 +278,45 @@ void screen_data_copy(bScreen *to, bScreen *from) */ void screen_new_activate_prepare(const wmWindow *win, bScreen *screen_new) { - screen_new->winid = win->winid; - screen_new->do_refresh = true; - screen_new->do_draw = true; + screen_new->winid = win->winid; + screen_new->do_refresh = true; + screen_new->do_draw = true; } - /* with sa as center, sb is located at: 0=W, 1=N, 2=E, 3=S */ /* -1 = not valid check */ /* used with join operator */ int area_getorientation(ScrArea *sa, ScrArea *sb) { - ScrVert *sav1, *sav2, *sav3, *sav4; - ScrVert *sbv1, *sbv2, *sbv3, *sbv4; - - if (sa == NULL || sb == NULL) return -1; - - sav1 = sa->v1; - sav2 = sa->v2; - sav3 = sa->v3; - sav4 = sa->v4; - sbv1 = sb->v1; - sbv2 = sb->v2; - sbv3 = sb->v3; - sbv4 = sb->v4; - - if (sav1 == sbv4 && sav2 == sbv3) { /* sa to right of sb = W */ - return 0; - } - else if (sav2 == sbv1 && sav3 == sbv4) { /* sa to bottom of sb = N */ - return 1; - } - else if (sav3 == sbv2 && sav4 == sbv1) { /* sa to left of sb = E */ - return 2; - } - else if (sav1 == sbv2 && sav4 == sbv3) { /* sa on top of sb = S*/ - return 3; - } - - return -1; + ScrVert *sav1, *sav2, *sav3, *sav4; + ScrVert *sbv1, *sbv2, *sbv3, *sbv4; + + if (sa == NULL || sb == NULL) + return -1; + + sav1 = sa->v1; + sav2 = sa->v2; + sav3 = sa->v3; + sav4 = sa->v4; + sbv1 = sb->v1; + sbv2 = sb->v2; + sbv3 = sb->v3; + sbv4 = sb->v4; + + if (sav1 == sbv4 && sav2 == sbv3) { /* sa to right of sb = W */ + return 0; + } + else if (sav2 == sbv1 && sav3 == sbv4) { /* sa to bottom of sb = N */ + return 1; + } + else if (sav3 == sbv2 && sav4 == sbv1) { /* sa to left of sb = E */ + return 2; + } + else if (sav1 == sbv2 && sav4 == sbv3) { /* sa on top of sb = S*/ + return 3; + } + + return -1; } /* Helper function to join 2 areas, it has a return value, 0=failed 1=success @@ -322,272 +324,273 @@ int area_getorientation(ScrArea *sa, ScrArea *sb) */ int screen_area_join(bContext *C, bScreen *scr, ScrArea *sa1, ScrArea *sa2) { - int dir; - - dir = area_getorientation(sa1, sa2); - /*printf("dir is : %i\n", dir);*/ - - if (dir == -1) { - return 0; - } - - if (dir == 0) { - sa1->v1 = sa2->v1; - sa1->v2 = sa2->v2; - screen_geom_edge_add(scr, sa1->v2, sa1->v3); - screen_geom_edge_add(scr, sa1->v1, sa1->v4); - } - else if (dir == 1) { - sa1->v2 = sa2->v2; - sa1->v3 = sa2->v3; - screen_geom_edge_add(scr, sa1->v1, sa1->v2); - screen_geom_edge_add(scr, sa1->v3, sa1->v4); - } - else if (dir == 2) { - sa1->v3 = sa2->v3; - sa1->v4 = sa2->v4; - screen_geom_edge_add(scr, sa1->v2, sa1->v3); - screen_geom_edge_add(scr, sa1->v1, sa1->v4); - } - else if (dir == 3) { - sa1->v1 = sa2->v1; - sa1->v4 = sa2->v4; - screen_geom_edge_add(scr, sa1->v1, sa1->v2); - screen_geom_edge_add(scr, sa1->v3, sa1->v4); - } - - screen_delarea(C, scr, sa2); - BKE_screen_remove_double_scrverts(scr); - /* Update preview thumbnail */ - BKE_icon_changed(scr->id.icon_id); - - return 1; + int dir; + + dir = area_getorientation(sa1, sa2); + /*printf("dir is : %i\n", dir);*/ + + if (dir == -1) { + return 0; + } + + if (dir == 0) { + sa1->v1 = sa2->v1; + sa1->v2 = sa2->v2; + screen_geom_edge_add(scr, sa1->v2, sa1->v3); + screen_geom_edge_add(scr, sa1->v1, sa1->v4); + } + else if (dir == 1) { + sa1->v2 = sa2->v2; + sa1->v3 = sa2->v3; + screen_geom_edge_add(scr, sa1->v1, sa1->v2); + screen_geom_edge_add(scr, sa1->v3, sa1->v4); + } + else if (dir == 2) { + sa1->v3 = sa2->v3; + sa1->v4 = sa2->v4; + screen_geom_edge_add(scr, sa1->v2, sa1->v3); + screen_geom_edge_add(scr, sa1->v1, sa1->v4); + } + else if (dir == 3) { + sa1->v1 = sa2->v1; + sa1->v4 = sa2->v4; + screen_geom_edge_add(scr, sa1->v1, sa1->v2); + screen_geom_edge_add(scr, sa1->v3, sa1->v4); + } + + screen_delarea(C, scr, sa2); + BKE_screen_remove_double_scrverts(scr); + /* Update preview thumbnail */ + BKE_icon_changed(scr->id.icon_id); + + return 1; } - /* ****************** EXPORTED API TO OTHER MODULES *************************** */ /* screen sets cursor based on active region */ static void region_cursor_set(wmWindow *win, bool swin_changed) { - bScreen *screen = WM_window_get_active_screen(win); - - ED_screen_areas_iter(win, screen, sa) { - for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { - if (ar == screen->active_region) { - if (swin_changed || (ar->type && ar->type->event_cursor)) { - if (ar->gizmo_map != NULL) { - if (WM_gizmomap_cursor_set(ar->gizmo_map, win)) { - return; - } - } - ED_region_cursor_set(win, sa, ar); - } - return; - } - } - } + bScreen *screen = WM_window_get_active_screen(win); + + ED_screen_areas_iter(win, screen, sa) + { + for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar == screen->active_region) { + if (swin_changed || (ar->type && ar->type->event_cursor)) { + if (ar->gizmo_map != NULL) { + if (WM_gizmomap_cursor_set(ar->gizmo_map, win)) { + return; + } + } + ED_region_cursor_set(win, sa, ar); + } + return; + } + } + } } void ED_screen_do_listen(bContext *C, wmNotifier *note) { - wmWindow *win = CTX_wm_window(C); - bScreen *screen = CTX_wm_screen(C); - - /* generic notes */ - switch (note->category) { - case NC_WM: - if (note->data == ND_FILEREAD) - screen->do_draw = true; - break; - case NC_WINDOW: - screen->do_draw = true; - break; - case NC_SCREEN: - if (note->action == NA_EDITED) - screen->do_draw = screen->do_refresh = true; - break; - case NC_SCENE: - if (note->data == ND_MODE) - region_cursor_set(win, true); - break; - } + wmWindow *win = CTX_wm_window(C); + bScreen *screen = CTX_wm_screen(C); + + /* generic notes */ + switch (note->category) { + case NC_WM: + if (note->data == ND_FILEREAD) + screen->do_draw = true; + break; + case NC_WINDOW: + screen->do_draw = true; + break; + case NC_SCREEN: + if (note->action == NA_EDITED) + screen->do_draw = screen->do_refresh = true; + break; + case NC_SCENE: + if (note->data == ND_MODE) + region_cursor_set(win, true); + break; + } } /* helper call for below, dpi changes headers */ static void screen_refresh_headersizes(void) { - const ListBase *lb = BKE_spacetypes_list(); - SpaceType *st; - - for (st = lb->first; st; st = st->next) { - ARegionType *art; - art = BKE_regiontype_from_id(st, RGN_TYPE_HEADER); - if (art) art->prefsizey = ED_area_headersize(); - - art = BKE_regiontype_from_id(st, RGN_TYPE_FOOTER); - if (art) art->prefsizey = ED_area_headersize(); - } + const ListBase *lb = BKE_spacetypes_list(); + SpaceType *st; + + for (st = lb->first; st; st = st->next) { + ARegionType *art; + art = BKE_regiontype_from_id(st, RGN_TYPE_HEADER); + if (art) + art->prefsizey = ED_area_headersize(); + + art = BKE_regiontype_from_id(st, RGN_TYPE_FOOTER); + if (art) + art->prefsizey = ED_area_headersize(); + } } /* make this screen usable */ /* for file read and first use, for scaling window, area moves */ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win) { - bScreen *screen = WM_window_get_active_screen(win); - - /* exception for bg mode, we only need the screen context */ - if (!G.background) { - /* header size depends on DPI, let's verify */ - WM_window_set_dpi(win); - - ED_screen_global_areas_refresh(win); - screen_refresh_headersizes(); - - screen_geom_vertices_scale(win, screen); - - ED_screen_areas_iter(win, screen, area) { - /* set spacetype and region callbacks, calls init() */ - /* sets subwindows for regions, adds handlers */ - ED_area_initialize(wm, win, area); - } - - /* wake up animtimer */ - if (screen->animtimer) - WM_event_timer_sleep(wm, win, screen->animtimer, false); - } - - if (G.debug & G_DEBUG_EVENTS) { - printf("%s: set screen\n", __func__); - } - screen->do_refresh = false; - /* prevent multiwin errors */ - screen->winid = win->winid; - - screen->context = ed_screen_context; + bScreen *screen = WM_window_get_active_screen(win); + + /* exception for bg mode, we only need the screen context */ + if (!G.background) { + /* header size depends on DPI, let's verify */ + WM_window_set_dpi(win); + + ED_screen_global_areas_refresh(win); + screen_refresh_headersizes(); + + screen_geom_vertices_scale(win, screen); + + ED_screen_areas_iter(win, screen, area) + { + /* set spacetype and region callbacks, calls init() */ + /* sets subwindows for regions, adds handlers */ + ED_area_initialize(wm, win, area); + } + + /* wake up animtimer */ + if (screen->animtimer) + WM_event_timer_sleep(wm, win, screen->animtimer, false); + } + + if (G.debug & G_DEBUG_EVENTS) { + printf("%s: set screen\n", __func__); + } + screen->do_refresh = false; + /* prevent multiwin errors */ + screen->winid = win->winid; + + screen->context = ed_screen_context; } /* file read, set all screens, ... */ void ED_screens_initialize(Main *bmain, wmWindowManager *wm) { - wmWindow *win; - - for (win = wm->windows.first; win; win = win->next) { - if (BKE_workspace_active_get(win->workspace_hook) == NULL) { - BKE_workspace_active_set(win->workspace_hook, bmain->workspaces.first); - } - - ED_screen_refresh(wm, win); - if (win->eventstate) { - ED_screen_set_active_region(NULL, win, &win->eventstate->x); - } - } - - if (U.uiflag & USER_HEADER_FROM_PREF) { - for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { - BKE_screen_header_alignment_reset(screen); - } - } + wmWindow *win; + + for (win = wm->windows.first; win; win = win->next) { + if (BKE_workspace_active_get(win->workspace_hook) == NULL) { + BKE_workspace_active_set(win->workspace_hook, bmain->workspaces.first); + } + + ED_screen_refresh(wm, win); + if (win->eventstate) { + ED_screen_set_active_region(NULL, win, &win->eventstate->x); + } + } + + if (U.uiflag & USER_HEADER_FROM_PREF) { + for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { + BKE_screen_header_alignment_reset(screen); + } + } } void ED_screen_ensure_updated(wmWindowManager *wm, wmWindow *win, bScreen *screen) { - if (screen->do_refresh) { - ED_screen_refresh(wm, win); - } + if (screen->do_refresh) { + ED_screen_refresh(wm, win); + } } - /* *********** exit calls are for closing running stuff ******** */ void ED_region_exit(bContext *C, ARegion *ar) { - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win = CTX_wm_window(C); - ARegion *prevar = CTX_wm_region(C); + wmWindowManager *wm = CTX_wm_manager(C); + wmWindow *win = CTX_wm_window(C); + ARegion *prevar = CTX_wm_region(C); - if (ar->type && ar->type->exit) - ar->type->exit(wm, ar); + if (ar->type && ar->type->exit) + ar->type->exit(wm, ar); - CTX_wm_region_set(C, ar); + CTX_wm_region_set(C, ar); - WM_event_remove_handlers(C, &ar->handlers); - WM_event_modal_handler_region_replace(win, ar, NULL); - WM_draw_region_free(ar); + WM_event_remove_handlers(C, &ar->handlers); + WM_event_modal_handler_region_replace(win, ar, NULL); + WM_draw_region_free(ar); - if (ar->headerstr) { - MEM_freeN(ar->headerstr); - ar->headerstr = NULL; - } + if (ar->headerstr) { + MEM_freeN(ar->headerstr); + ar->headerstr = NULL; + } - if (ar->regiontimer) { - WM_event_remove_timer(wm, win, ar->regiontimer); - ar->regiontimer = NULL; - } + if (ar->regiontimer) { + WM_event_remove_timer(wm, win, ar->regiontimer); + ar->regiontimer = NULL; + } - WM_msgbus_clear_by_owner(wm->message_bus, ar); + WM_msgbus_clear_by_owner(wm->message_bus, ar); - CTX_wm_region_set(C, prevar); + CTX_wm_region_set(C, prevar); } void ED_area_exit(bContext *C, ScrArea *sa) { - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win = CTX_wm_window(C); - ScrArea *prevsa = CTX_wm_area(C); - ARegion *ar; + wmWindowManager *wm = CTX_wm_manager(C); + wmWindow *win = CTX_wm_window(C); + ScrArea *prevsa = CTX_wm_area(C); + ARegion *ar; - if (sa->type && sa->type->exit) - sa->type->exit(wm, sa); + if (sa->type && sa->type->exit) + sa->type->exit(wm, sa); - CTX_wm_area_set(C, sa); + CTX_wm_area_set(C, sa); - for (ar = sa->regionbase.first; ar; ar = ar->next) - ED_region_exit(C, ar); + for (ar = sa->regionbase.first; ar; ar = ar->next) + ED_region_exit(C, ar); - WM_event_remove_handlers(C, &sa->handlers); - WM_event_modal_handler_area_replace(win, sa, NULL); + WM_event_remove_handlers(C, &sa->handlers); + WM_event_modal_handler_area_replace(win, sa, NULL); - CTX_wm_area_set(C, prevsa); + CTX_wm_area_set(C, prevsa); } void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen) { - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *prevwin = CTX_wm_window(C); - - CTX_wm_window_set(C, window); - - if (screen->animtimer) - WM_event_remove_timer(wm, window, screen->animtimer); - screen->animtimer = NULL; - screen->scrubbing = false; - - screen->active_region = NULL; - - for (ARegion *ar = screen->regionbase.first; ar; ar = ar->next) { - ED_region_exit(C, ar); - } - for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { - ED_area_exit(C, sa); - } - /* Don't use ED_screen_areas_iter here, it skips hidden areas. */ - for (ScrArea *sa = window->global_areas.areabase.first; sa; sa = sa->next) { - ED_area_exit(C, sa); - } - - /* mark it available for use for other windows */ - screen->winid = 0; - - if (!WM_window_is_temp_screen(prevwin)) { - /* use previous window if possible */ - CTX_wm_window_set(C, prevwin); - } - else { - /* none otherwise */ - CTX_wm_window_set(C, NULL); - } - + wmWindowManager *wm = CTX_wm_manager(C); + wmWindow *prevwin = CTX_wm_window(C); + + CTX_wm_window_set(C, window); + + if (screen->animtimer) + WM_event_remove_timer(wm, window, screen->animtimer); + screen->animtimer = NULL; + screen->scrubbing = false; + + screen->active_region = NULL; + + for (ARegion *ar = screen->regionbase.first; ar; ar = ar->next) { + ED_region_exit(C, ar); + } + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + ED_area_exit(C, sa); + } + /* Don't use ED_screen_areas_iter here, it skips hidden areas. */ + for (ScrArea *sa = window->global_areas.areabase.first; sa; sa = sa->next) { + ED_area_exit(C, sa); + } + + /* mark it available for use for other windows */ + screen->winid = 0; + + if (!WM_window_is_temp_screen(prevwin)) { + /* use previous window if possible */ + CTX_wm_window_set(C, prevwin); + } + else { + /* none otherwise */ + CTX_wm_window_set(C, NULL); + } } /* *********************************** */ @@ -595,357 +598,364 @@ void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen) /* case when on area-edge or in azones, or outside window */ static void screen_cursor_set(wmWindow *win, const int xy[2]) { - const bScreen *screen = WM_window_get_active_screen(win); - AZone *az = NULL; - ScrArea *sa; - - for (sa = screen->areabase.first; sa; sa = sa->next) - if ((az = ED_area_actionzone_find_xy(sa, xy))) - break; - - if (sa) { - if (az->type == AZONE_AREA) - WM_cursor_set(win, CURSOR_EDIT); - else if (az->type == AZONE_REGION) { - if (az->edge == AE_LEFT_TO_TOPRIGHT || az->edge == AE_RIGHT_TO_TOPLEFT) - WM_cursor_set(win, CURSOR_X_MOVE); - else - WM_cursor_set(win, CURSOR_Y_MOVE); - } - } - else { - ScrEdge *actedge = screen_geom_find_active_scredge(win, screen, xy[0], xy[1]); - - if (actedge) { - if (screen_geom_edge_is_horizontal(actedge)) - WM_cursor_set(win, CURSOR_Y_MOVE); - else - WM_cursor_set(win, CURSOR_X_MOVE); - } - else - WM_cursor_set(win, CURSOR_STD); - } + const bScreen *screen = WM_window_get_active_screen(win); + AZone *az = NULL; + ScrArea *sa; + + for (sa = screen->areabase.first; sa; sa = sa->next) + if ((az = ED_area_actionzone_find_xy(sa, xy))) + break; + + if (sa) { + if (az->type == AZONE_AREA) + WM_cursor_set(win, CURSOR_EDIT); + else if (az->type == AZONE_REGION) { + if (az->edge == AE_LEFT_TO_TOPRIGHT || az->edge == AE_RIGHT_TO_TOPLEFT) + WM_cursor_set(win, CURSOR_X_MOVE); + else + WM_cursor_set(win, CURSOR_Y_MOVE); + } + } + else { + ScrEdge *actedge = screen_geom_find_active_scredge(win, screen, xy[0], xy[1]); + + if (actedge) { + if (screen_geom_edge_is_horizontal(actedge)) + WM_cursor_set(win, CURSOR_Y_MOVE); + else + WM_cursor_set(win, CURSOR_X_MOVE); + } + else + WM_cursor_set(win, CURSOR_STD); + } } - /* called in wm_event_system.c. sets state vars in screen, cursors */ /* event type is mouse move */ void ED_screen_set_active_region(bContext *C, wmWindow *win, const int xy[2]) { - bScreen *scr = WM_window_get_active_screen(win); - - if (scr) { - ScrArea *sa = NULL; - ARegion *ar; - ARegion *old_ar = scr->active_region; - - ED_screen_areas_iter(win, scr, area_iter) { - if (xy[0] > area_iter->totrct.xmin && xy[0] < area_iter->totrct.xmax) { - if (xy[1] > area_iter->totrct.ymin && xy[1] < area_iter->totrct.ymax) { - if (ED_area_azones_update(area_iter, xy) == NULL) { - sa = area_iter; - break; - } - } - } - } - if (sa) { - /* make overlap active when mouse over */ - for (ar = sa->regionbase.first; ar; ar = ar->next) { - if (BLI_rcti_isect_pt_v(&ar->winrct, xy)) { - scr->active_region = ar; - break; - } - } - } - else - scr->active_region = NULL; - - /* check for redraw headers */ - if (old_ar != scr->active_region) { - - ED_screen_areas_iter(win, scr, area_iter) { - bool do_draw = false; - - for (ar = area_iter->regionbase.first; ar; ar = ar->next) { - if (ar == old_ar || ar == scr->active_region) { - do_draw = true; - } - } - - if (do_draw) { - for (ar = area_iter->regionbase.first; ar; ar = ar->next) { - if (ar->regiontype == RGN_TYPE_HEADER) { - ED_region_tag_redraw_no_rebuild(ar); - } - } - } - } - } - - /* cursors, for time being set always on edges, otherwise aregion doesn't switch */ - if (scr->active_region == NULL) { - screen_cursor_set(win, xy); - } - else { - /* notifier invokes freeing the buttons... causing a bit too much redraws */ - if (old_ar != scr->active_region) { - region_cursor_set(win, true); - - /* this used to be a notifier, but needs to be done immediate - * because it can undo setting the right button as active due - * to delayed notifier handling */ - if (C) { - UI_screen_free_active_but(C, scr); - } - } - else - region_cursor_set(win, false); - } - } + bScreen *scr = WM_window_get_active_screen(win); + + if (scr) { + ScrArea *sa = NULL; + ARegion *ar; + ARegion *old_ar = scr->active_region; + + ED_screen_areas_iter(win, scr, area_iter) + { + if (xy[0] > area_iter->totrct.xmin && xy[0] < area_iter->totrct.xmax) { + if (xy[1] > area_iter->totrct.ymin && xy[1] < area_iter->totrct.ymax) { + if (ED_area_azones_update(area_iter, xy) == NULL) { + sa = area_iter; + break; + } + } + } + } + if (sa) { + /* make overlap active when mouse over */ + for (ar = sa->regionbase.first; ar; ar = ar->next) { + if (BLI_rcti_isect_pt_v(&ar->winrct, xy)) { + scr->active_region = ar; + break; + } + } + } + else + scr->active_region = NULL; + + /* check for redraw headers */ + if (old_ar != scr->active_region) { + + ED_screen_areas_iter(win, scr, area_iter) + { + bool do_draw = false; + + for (ar = area_iter->regionbase.first; ar; ar = ar->next) { + if (ar == old_ar || ar == scr->active_region) { + do_draw = true; + } + } + + if (do_draw) { + for (ar = area_iter->regionbase.first; ar; ar = ar->next) { + if (ar->regiontype == RGN_TYPE_HEADER) { + ED_region_tag_redraw_no_rebuild(ar); + } + } + } + } + } + + /* cursors, for time being set always on edges, otherwise aregion doesn't switch */ + if (scr->active_region == NULL) { + screen_cursor_set(win, xy); + } + else { + /* notifier invokes freeing the buttons... causing a bit too much redraws */ + if (old_ar != scr->active_region) { + region_cursor_set(win, true); + + /* this used to be a notifier, but needs to be done immediate + * because it can undo setting the right button as active due + * to delayed notifier handling */ + if (C) { + UI_screen_free_active_but(C, scr); + } + } + else + region_cursor_set(win, false); + } + } } int ED_screen_area_active(const bContext *C) { - wmWindow *win = CTX_wm_window(C); - bScreen *sc = CTX_wm_screen(C); - ScrArea *sa = CTX_wm_area(C); - - if (win && sc && sa) { - AZone *az = ED_area_actionzone_find_xy(sa, &win->eventstate->x); - ARegion *ar; - - if (az && az->type == AZONE_REGION) - return 1; - - for (ar = sa->regionbase.first; ar; ar = ar->next) - if (ar == sc->active_region) - return 1; - } - return 0; + wmWindow *win = CTX_wm_window(C); + bScreen *sc = CTX_wm_screen(C); + ScrArea *sa = CTX_wm_area(C); + + if (win && sc && sa) { + AZone *az = ED_area_actionzone_find_xy(sa, &win->eventstate->x); + ARegion *ar; + + if (az && az->type == AZONE_REGION) + return 1; + + for (ar = sa->regionbase.first; ar; ar = ar->next) + if (ar == sc->active_region) + return 1; + } + return 0; } /** * Add an area and geometry (screen-edges and -vertices) for it to \a area_map, * with coordinates/dimensions matching \a rect. */ -static ScrArea *screen_area_create_with_geometry( - ScrAreaMap *area_map, const rcti *rect, - short spacetype) +static ScrArea *screen_area_create_with_geometry(ScrAreaMap *area_map, + const rcti *rect, + short spacetype) { - ScrVert *bottom_left = screen_geom_vertex_add_ex(area_map, rect->xmin, rect->ymin); - ScrVert *top_left = screen_geom_vertex_add_ex(area_map, rect->xmin, rect->ymax); - ScrVert *top_right = screen_geom_vertex_add_ex(area_map, rect->xmax, rect->ymax); - ScrVert *bottom_right = screen_geom_vertex_add_ex(area_map, rect->xmax, rect->ymin); + ScrVert *bottom_left = screen_geom_vertex_add_ex(area_map, rect->xmin, rect->ymin); + ScrVert *top_left = screen_geom_vertex_add_ex(area_map, rect->xmin, rect->ymax); + ScrVert *top_right = screen_geom_vertex_add_ex(area_map, rect->xmax, rect->ymax); + ScrVert *bottom_right = screen_geom_vertex_add_ex(area_map, rect->xmax, rect->ymin); - screen_geom_edge_add_ex(area_map, bottom_left, top_left); - screen_geom_edge_add_ex(area_map, top_left, top_right); - screen_geom_edge_add_ex(area_map, top_right, bottom_right); - screen_geom_edge_add_ex(area_map, bottom_right, bottom_left); + screen_geom_edge_add_ex(area_map, bottom_left, top_left); + screen_geom_edge_add_ex(area_map, top_left, top_right); + screen_geom_edge_add_ex(area_map, top_right, bottom_right); + screen_geom_edge_add_ex(area_map, bottom_right, bottom_left); - return screen_addarea_ex(area_map, bottom_left, top_left, top_right, bottom_right, spacetype); + return screen_addarea_ex(area_map, bottom_left, top_left, top_right, bottom_right, spacetype); } static void screen_area_set_geometry_rect(ScrArea *sa, const rcti *rect) { - sa->v1->vec.x = rect->xmin; - sa->v1->vec.y = rect->ymin; - sa->v2->vec.x = rect->xmin; - sa->v2->vec.y = rect->ymax; - sa->v3->vec.x = rect->xmax; - sa->v3->vec.y = rect->ymax; - sa->v4->vec.x = rect->xmax; - sa->v4->vec.y = rect->ymin; + sa->v1->vec.x = rect->xmin; + sa->v1->vec.y = rect->ymin; + sa->v2->vec.x = rect->xmin; + sa->v2->vec.y = rect->ymax; + sa->v3->vec.x = rect->xmax; + sa->v3->vec.y = rect->ymax; + sa->v4->vec.x = rect->xmax; + sa->v4->vec.y = rect->ymin; } -static void screen_global_area_refresh( - wmWindow *win, bScreen *screen, - eSpace_Type space_type, GlobalAreaAlign align, const rcti *rect, - const short height_cur, const short height_min, const short height_max) +static void screen_global_area_refresh(wmWindow *win, + bScreen *screen, + eSpace_Type space_type, + GlobalAreaAlign align, + const rcti *rect, + const short height_cur, + const short height_min, + const short height_max) { - ScrArea *area; - - for (area = win->global_areas.areabase.first; area; area = area->next) { - if (area->spacetype == space_type) { - break; - } - } - - if (area) { - screen_area_set_geometry_rect(area, rect); - } - else { - area = screen_area_create_with_geometry(&win->global_areas, rect, space_type); - SpaceType *stype = BKE_spacetype_from_id(space_type); - SpaceLink *slink = stype->new(area, WM_window_get_active_scene(win)); - - area->regionbase = slink->regionbase; - - BLI_addhead(&area->spacedata, slink); - BLI_listbase_clear(&slink->regionbase); - - /* Data specific to global areas. */ - area->global = MEM_callocN(sizeof(*area->global), __func__); - area->global->size_max = height_max; - area->global->size_min = height_min; - area->global->align = align; - } - - if (area->global->cur_fixed_height != height_cur) { - /* Refresh layout if size changes. */ - area->global->cur_fixed_height = height_cur; - screen->do_refresh = true; - } + ScrArea *area; + + for (area = win->global_areas.areabase.first; area; area = area->next) { + if (area->spacetype == space_type) { + break; + } + } + + if (area) { + screen_area_set_geometry_rect(area, rect); + } + else { + area = screen_area_create_with_geometry(&win->global_areas, rect, space_type); + SpaceType *stype = BKE_spacetype_from_id(space_type); + SpaceLink *slink = stype->new (area, WM_window_get_active_scene(win)); + + area->regionbase = slink->regionbase; + + BLI_addhead(&area->spacedata, slink); + BLI_listbase_clear(&slink->regionbase); + + /* Data specific to global areas. */ + area->global = MEM_callocN(sizeof(*area->global), __func__); + area->global->size_max = height_max; + area->global->size_min = height_min; + area->global->align = align; + } + + if (area->global->cur_fixed_height != height_cur) { + /* Refresh layout if size changes. */ + area->global->cur_fixed_height = height_cur; + screen->do_refresh = true; + } } static int screen_global_header_size(void) { - return (int)ceilf(ED_area_headersize() / UI_DPI_FAC); + return (int)ceilf(ED_area_headersize() / UI_DPI_FAC); } static void screen_global_topbar_area_refresh(wmWindow *win, bScreen *screen) { - const short size_min = screen_global_header_size(); - const short size_max = 2.25 * screen_global_header_size(); - const short size = (screen->flag & SCREEN_COLLAPSE_TOPBAR) ? size_min : size_max; - rcti rect; + const short size_min = screen_global_header_size(); + const short size_max = 2.25 * screen_global_header_size(); + const short size = (screen->flag & SCREEN_COLLAPSE_TOPBAR) ? size_min : size_max; + rcti rect; - BLI_rcti_init(&rect, 0, WM_window_pixels_x(win) - 1, 0, WM_window_pixels_y(win) - 1); - rect.ymin = rect.ymax - size_max; + BLI_rcti_init(&rect, 0, WM_window_pixels_x(win) - 1, 0, WM_window_pixels_y(win) - 1); + rect.ymin = rect.ymax - size_max; - screen_global_area_refresh(win, screen, SPACE_TOPBAR, GLOBAL_AREA_ALIGN_TOP, &rect, size, size_min, size_max); + screen_global_area_refresh( + win, screen, SPACE_TOPBAR, GLOBAL_AREA_ALIGN_TOP, &rect, size, size_min, size_max); } static void screen_global_statusbar_area_refresh(wmWindow *win, bScreen *screen) { - const short size_min = 1; - const short size_max = 0.8f * screen_global_header_size(); - const short size = (screen->flag & SCREEN_COLLAPSE_STATUSBAR) ? size_min : size_max; - rcti rect; + const short size_min = 1; + const short size_max = 0.8f * screen_global_header_size(); + const short size = (screen->flag & SCREEN_COLLAPSE_STATUSBAR) ? size_min : size_max; + rcti rect; - BLI_rcti_init(&rect, 0, WM_window_pixels_x(win) - 1, 0, WM_window_pixels_y(win) - 1); - rect.ymax = rect.ymin + size_max; + BLI_rcti_init(&rect, 0, WM_window_pixels_x(win) - 1, 0, WM_window_pixels_y(win) - 1); + rect.ymax = rect.ymin + size_max; - screen_global_area_refresh(win, screen, SPACE_STATUSBAR, GLOBAL_AREA_ALIGN_BOTTOM, &rect, size, size_min, size_max); + screen_global_area_refresh( + win, screen, SPACE_STATUSBAR, GLOBAL_AREA_ALIGN_BOTTOM, &rect, size, size_min, size_max); } void ED_screen_global_areas_sync(wmWindow *win) { - /* Update screen flags from height in window, this is weak and perhaps - * global areas should just become part of the screen instead. */ - bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook); - - screen->flag &= ~(SCREEN_COLLAPSE_STATUSBAR | SCREEN_COLLAPSE_TOPBAR); - - for (ScrArea *area = win->global_areas.areabase.first; area; area = area->next) { - if (area->global->cur_fixed_height == area->global->size_min) { - if (area->spacetype == SPACE_TOPBAR) { - screen->flag |= SCREEN_COLLAPSE_TOPBAR; - } - else if (area->spacetype == SPACE_STATUSBAR) { - screen->flag |= SCREEN_COLLAPSE_STATUSBAR; - } - } - } + /* Update screen flags from height in window, this is weak and perhaps + * global areas should just become part of the screen instead. */ + bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook); + + screen->flag &= ~(SCREEN_COLLAPSE_STATUSBAR | SCREEN_COLLAPSE_TOPBAR); + + for (ScrArea *area = win->global_areas.areabase.first; area; area = area->next) { + if (area->global->cur_fixed_height == area->global->size_min) { + if (area->spacetype == SPACE_TOPBAR) { + screen->flag |= SCREEN_COLLAPSE_TOPBAR; + } + else if (area->spacetype == SPACE_STATUSBAR) { + screen->flag |= SCREEN_COLLAPSE_STATUSBAR; + } + } + } } void ED_screen_global_areas_refresh(wmWindow *win) { - /* Don't create global area for child and temporary windows. */ - bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook); - if ((win->parent != NULL) || screen->temp) { - if (win->global_areas.areabase.first) { - screen->do_refresh = true; - BKE_screen_area_map_free(&win->global_areas); - } - return; - } - - screen_global_topbar_area_refresh(win, screen); - screen_global_statusbar_area_refresh(win, screen); + /* Don't create global area for child and temporary windows. */ + bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook); + if ((win->parent != NULL) || screen->temp) { + if (win->global_areas.areabase.first) { + screen->do_refresh = true; + BKE_screen_area_map_free(&win->global_areas); + } + return; + } + + screen_global_topbar_area_refresh(win, screen); + screen_global_statusbar_area_refresh(win, screen); } - /* -------------------------------------------------------------------- */ /* Screen changing */ static bScreen *screen_fullscreen_find_associated_normal_screen(const Main *bmain, bScreen *screen) { - for (bScreen *screen_iter = bmain->screens.first; screen_iter; screen_iter = screen_iter->id.next) { - ScrArea *sa = screen_iter->areabase.first; - if (sa && sa->full == screen) { - return screen_iter; - } - } - - return screen; + for (bScreen *screen_iter = bmain->screens.first; screen_iter; + screen_iter = screen_iter->id.next) { + ScrArea *sa = screen_iter->areabase.first; + if (sa && sa->full == screen) { + return screen_iter; + } + } + + return screen; } /** * \return the screen to activate. * \warning The returned screen may not always equal \a screen_new! */ -bScreen *screen_change_prepare(bScreen *screen_old, bScreen *screen_new, Main *bmain, bContext *C, wmWindow *win) +bScreen *screen_change_prepare( + bScreen *screen_old, bScreen *screen_new, Main *bmain, bContext *C, wmWindow *win) { - /* validate screen, it's called with notifier reference */ - if (BLI_findindex(&bmain->screens, screen_new) == -1) { - return NULL; - } - - if (ELEM(screen_new->state, SCREENMAXIMIZED, SCREENFULL)) { - screen_new = screen_fullscreen_find_associated_normal_screen(bmain, screen_new); - } - - /* check for valid winid */ - if (!(screen_new->winid == 0 || screen_new->winid == win->winid)) { - return NULL; - } - - if (screen_old != screen_new) { - wmTimer *wt = screen_old->animtimer; - - /* remove handlers referencing areas in old screen */ - for (ScrArea *sa = screen_old->areabase.first; sa; sa = sa->next) { - WM_event_remove_area_handler(&win->modalhandlers, sa); - } - - /* 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(CTX_wm_manager(C), win, wt, true); - } - ED_screen_exit(C, win, screen_old); - - /* Same scene, "transfer" playback to new screen. */ - if (wt) { - screen_new->animtimer = wt; - } - - return screen_new; - } - - return NULL; + /* validate screen, it's called with notifier reference */ + if (BLI_findindex(&bmain->screens, screen_new) == -1) { + return NULL; + } + + if (ELEM(screen_new->state, SCREENMAXIMIZED, SCREENFULL)) { + screen_new = screen_fullscreen_find_associated_normal_screen(bmain, screen_new); + } + + /* check for valid winid */ + if (!(screen_new->winid == 0 || screen_new->winid == win->winid)) { + return NULL; + } + + if (screen_old != screen_new) { + wmTimer *wt = screen_old->animtimer; + + /* remove handlers referencing areas in old screen */ + for (ScrArea *sa = screen_old->areabase.first; sa; sa = sa->next) { + WM_event_remove_area_handler(&win->modalhandlers, sa); + } + + /* 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(CTX_wm_manager(C), win, wt, true); + } + ED_screen_exit(C, win, screen_old); + + /* Same scene, "transfer" playback to new screen. */ + if (wt) { + screen_new->animtimer = wt; + } + + return screen_new; + } + + return NULL; } void screen_change_update(bContext *C, wmWindow *win, bScreen *sc) { - Scene *scene = WM_window_get_active_scene(win); - WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); - WorkSpaceLayout *layout = BKE_workspace_layout_find(workspace, sc); + Scene *scene = WM_window_get_active_scene(win); + WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); + WorkSpaceLayout *layout = BKE_workspace_layout_find(workspace, sc); - CTX_wm_window_set(C, win); /* stores C->wm.screen... hrmf */ + CTX_wm_window_set(C, win); /* stores C->wm.screen... hrmf */ - ED_screen_refresh(CTX_wm_manager(C), win); + ED_screen_refresh(CTX_wm_manager(C), win); - BKE_screen_view3d_scene_sync(sc, scene); /* sync new screen with scene data */ - WM_event_add_notifier(C, NC_WINDOW, NULL); - WM_event_add_notifier(C, NC_SCREEN | ND_LAYOUTSET, layout); + BKE_screen_view3d_scene_sync(sc, scene); /* sync new screen with scene data */ + WM_event_add_notifier(C, NC_WINDOW, NULL); + WM_event_add_notifier(C, NC_SCREEN | ND_LAYOUTSET, layout); - /* makes button hilites work */ - WM_event_add_mousemove(C); + /* makes button hilites work */ + WM_event_add_mousemove(C); } - /** * \brief Change the active screen. * @@ -956,117 +966,117 @@ void screen_change_update(bContext *C, wmWindow *win, bScreen *sc) */ bool ED_screen_change(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 = screen_change_prepare(screen_old, sc, bmain, C, win); + Main *bmain = CTX_data_main(C); + wmWindow *win = CTX_wm_window(C); + bScreen *screen_old = CTX_wm_screen(C); + bScreen *screen_new = screen_change_prepare(screen_old, sc, bmain, C, win); - if (screen_new) { - WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); - WM_window_set_active_screen(win, workspace, sc); - screen_change_update(C, win, screen_new); + if (screen_new) { + WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); + WM_window_set_active_screen(win, workspace, sc); + screen_change_update(C, win, screen_new); - return true; - } + return true; + } - return false; + return false; } static void screen_set_3dview_camera(Scene *scene, ViewLayer *view_layer, ScrArea *sa, View3D *v3d) { - /* fix any cameras that are used in the 3d view but not in the scene */ - BKE_screen_view3d_sync(v3d, scene); - - if (!v3d->camera || !BKE_view_layer_base_find(view_layer, v3d->camera)) { - v3d->camera = BKE_view_layer_camera_find(view_layer); - // XXX if (sc == curscreen) handle_view3d_lock(); - if (!v3d->camera) { - ARegion *ar; - ListBase *regionbase; - - /* regionbase is in different place depending if space is active */ - if (v3d == sa->spacedata.first) - regionbase = &sa->regionbase; - else - regionbase = &v3d->regionbase; - - for (ar = regionbase->first; ar; ar = ar->next) { - if (ar->regiontype == RGN_TYPE_WINDOW) { - RegionView3D *rv3d = ar->regiondata; - if (rv3d->persp == RV3D_CAMOB) { - rv3d->persp = RV3D_PERSP; - } - } - } - } - } + /* fix any cameras that are used in the 3d view but not in the scene */ + BKE_screen_view3d_sync(v3d, scene); + + if (!v3d->camera || !BKE_view_layer_base_find(view_layer, v3d->camera)) { + v3d->camera = BKE_view_layer_camera_find(view_layer); + // XXX if (sc == curscreen) handle_view3d_lock(); + if (!v3d->camera) { + ARegion *ar; + ListBase *regionbase; + + /* regionbase is in different place depending if space is active */ + if (v3d == sa->spacedata.first) + regionbase = &sa->regionbase; + else + regionbase = &v3d->regionbase; + + for (ar = regionbase->first; ar; ar = ar->next) { + if (ar->regiontype == RGN_TYPE_WINDOW) { + RegionView3D *rv3d = ar->regiondata; + if (rv3d->persp == RV3D_CAMOB) { + rv3d->persp = RV3D_PERSP; + } + } + } + } + } } void ED_screen_scene_change(bContext *C, wmWindow *win, Scene *scene) { #if 0 - ViewLayer *view_layer_old = WM_window_get_active_view_layer(win); + ViewLayer *view_layer_old = WM_window_get_active_view_layer(win); #endif - /* Switch scene. */ - win->scene = scene; - if (CTX_wm_window(C) == win) { - CTX_data_scene_set(C, scene); - } + /* Switch scene. */ + win->scene = scene; + if (CTX_wm_window(C) == win) { + CTX_data_scene_set(C, scene); + } - /* Ensure the view layer name is updated. */ - WM_window_ensure_active_view_layer(win); - ViewLayer *view_layer = WM_window_get_active_view_layer(win); + /* Ensure the view layer name is updated. */ + WM_window_ensure_active_view_layer(win); + ViewLayer *view_layer = WM_window_get_active_view_layer(win); #if 0 - /* Mode Syncing. */ - if (view_layer_old) { - WorkSpace *workspace = CTX_wm_workspace(C); - Object *obact_new = OBACT(view_layer); - UNUSED_VARS(obact_new); - eObjectMode object_mode_old = workspace->object_mode; - Object *obact_old = OBACT(view_layer_old); - UNUSED_VARS(obact_old, object_mode_old); - } + /* Mode Syncing. */ + if (view_layer_old) { + WorkSpace *workspace = CTX_wm_workspace(C); + Object *obact_new = OBACT(view_layer); + UNUSED_VARS(obact_new); + eObjectMode object_mode_old = workspace->object_mode; + Object *obact_old = OBACT(view_layer_old); + UNUSED_VARS(obact_old, object_mode_old); + } #endif - /* Update 3D view cameras. */ - const bScreen *screen = WM_window_get_active_screen(win); - for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { - for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { - if (sl->spacetype == SPACE_VIEW3D) { - View3D *v3d = (View3D *)sl; - screen_set_3dview_camera(scene, view_layer, sa, v3d); - } - } - } + /* Update 3D view cameras. */ + const bScreen *screen = WM_window_get_active_screen(win); + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + screen_set_3dview_camera(scene, view_layer, sa, v3d); + } + } + } } ScrArea *ED_screen_full_newspace(bContext *C, ScrArea *sa, int type) { - wmWindow *win = CTX_wm_window(C); - ScrArea *newsa = NULL; + wmWindow *win = CTX_wm_window(C); + ScrArea *newsa = NULL; - if (!sa || sa->full == NULL) { - newsa = ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED); - } + if (!sa || sa->full == NULL) { + newsa = ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED); + } - if (!newsa) { - newsa = sa; - } + if (!newsa) { + newsa = sa; + } - BLI_assert(newsa); + BLI_assert(newsa); - if (sa && (sa->spacetype != type)) { - newsa->flag |= AREA_FLAG_TEMP_TYPE; - } - else { - newsa->flag &= ~AREA_FLAG_TEMP_TYPE; - } + if (sa && (sa->spacetype != type)) { + newsa->flag |= AREA_FLAG_TEMP_TYPE; + } + else { + newsa->flag &= ~AREA_FLAG_TEMP_TYPE; + } - ED_area_newspace(C, newsa, type, (newsa->flag & AREA_FLAG_TEMP_TYPE)); + ED_area_newspace(C, newsa, type, (newsa->flag & AREA_FLAG_TEMP_TYPE)); - return newsa; + return newsa; } /** @@ -1074,57 +1084,57 @@ ScrArea *ED_screen_full_newspace(bContext *C, ScrArea *sa, int type) */ void ED_screen_full_prevspace(bContext *C, ScrArea *sa) { - BLI_assert(sa->full); - - if (sa->flag & AREA_FLAG_STACKED_FULLSCREEN) { - /* stacked fullscreen -> only go back to previous screen and don't toggle out of fullscreen */ - ED_area_prevspace(C, sa); - } - else { - ED_screen_restore_temp_type(C, sa); - } + BLI_assert(sa->full); + + if (sa->flag & AREA_FLAG_STACKED_FULLSCREEN) { + /* stacked fullscreen -> only go back to previous screen and don't toggle out of fullscreen */ + ED_area_prevspace(C, sa); + } + else { + ED_screen_restore_temp_type(C, sa); + } } void ED_screen_restore_temp_type(bContext *C, ScrArea *sa) { - /* incase nether functions below run */ - ED_area_tag_redraw(sa); - - if (sa->flag & AREA_FLAG_TEMP_TYPE) { - ED_area_prevspace(C, sa); - /* Flag should be cleared now. */ - BLI_assert((sa->flag & AREA_FLAG_TEMP_TYPE) == 0); - } - - if (sa->full) { - ED_screen_state_toggle(C, CTX_wm_window(C), sa, SCREENMAXIMIZED); - } + /* incase nether functions below run */ + ED_area_tag_redraw(sa); + + if (sa->flag & AREA_FLAG_TEMP_TYPE) { + ED_area_prevspace(C, sa); + /* Flag should be cleared now. */ + BLI_assert((sa->flag & AREA_FLAG_TEMP_TYPE) == 0); + } + + if (sa->full) { + ED_screen_state_toggle(C, CTX_wm_window(C), sa, SCREENMAXIMIZED); + } } /* restore a screen / area back to default operation, after temp fullscreen modes */ void ED_screen_full_restore(bContext *C, ScrArea *sa) { - wmWindow *win = CTX_wm_window(C); - SpaceLink *sl = sa->spacedata.first; - bScreen *screen = CTX_wm_screen(C); - short state = (screen ? screen->state : SCREENMAXIMIZED); - - /* if fullscreen area has a temporary space (such as a file browser or fullscreen render - * overlaid on top of an existing setup) then return to the previous space */ - - if (sl->next) { - if (sa->flag & AREA_FLAG_TEMP_TYPE) { - ED_screen_full_prevspace(C, sa); - } - else { - ED_screen_state_toggle(C, win, sa, state); - } - /* warning: 'sa' may be freed */ - } - /* otherwise just tile the area again */ - else { - ED_screen_state_toggle(C, win, sa, state); - } + wmWindow *win = CTX_wm_window(C); + SpaceLink *sl = sa->spacedata.first; + bScreen *screen = CTX_wm_screen(C); + short state = (screen ? screen->state : SCREENMAXIMIZED); + + /* if fullscreen area has a temporary space (such as a file browser or fullscreen render + * overlaid on top of an existing setup) then return to the previous space */ + + if (sl->next) { + if (sa->flag & AREA_FLAG_TEMP_TYPE) { + ED_screen_full_prevspace(C, sa); + } + else { + ED_screen_state_toggle(C, win, sa, state); + } + /* warning: 'sa' may be freed */ + } + /* otherwise just tile the area again */ + else { + ED_screen_state_toggle(C, win, sa, state); + } } /** @@ -1134,180 +1144,186 @@ void ED_screen_full_restore(bContext *C, ScrArea *sa) */ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const short state) { - Main *bmain = CTX_data_main(C); - wmWindowManager *wm = CTX_wm_manager(C); - WorkSpace *workspace = WM_window_get_active_workspace(win); - bScreen *sc, *oldscreen; - ARegion *ar; - - if (sa) { - /* ensure we don't have a button active anymore, can crash when - * switching screens with tooltip open because region and tooltip - * are no longer in the same screen */ - for (ar = sa->regionbase.first; ar; ar = ar->next) { - UI_blocklist_free(C, &ar->uiblocks); - - if (ar->regiontimer) { - WM_event_remove_timer(wm, NULL, ar->regiontimer); - ar->regiontimer = NULL; - } - } - - /* prevent hanging status prints */ - ED_area_status_text(sa, NULL); - ED_workspace_status_text(C, NULL); - } - - if (sa && sa->full) { - WorkSpaceLayout *layout_old = WM_window_get_active_layout(win); - /* restoring back to SCREENNORMAL */ - sc = sa->full; /* the old screen to restore */ - oldscreen = WM_window_get_active_screen(win); /* the one disappearing */ - - BLI_assert(BKE_workspace_layout_screen_get(layout_old) != sc); - BLI_assert(BKE_workspace_layout_screen_get(layout_old)->state != SCREENNORMAL); - - sc->state = SCREENNORMAL; - sc->flag = oldscreen->flag; - - /* find old area to restore from */ - ScrArea *fullsa = NULL; - for (ScrArea *old = sc->areabase.first; old; old = old->next) { - /* area to restore from is always first */ - if (old->full && !fullsa) { - fullsa = old; - } - - /* clear full screen state */ - old->full = NULL; - } - - sa->full = NULL; - - if (fullsa == NULL) { - if (G.debug & G_DEBUG) - printf("%s: something wrong in areafullscreen\n", __func__); - return NULL; - } - - if (state == SCREENFULL) { - /* unhide global areas */ - for (ScrArea *glob_area = win->global_areas.areabase.first; glob_area; glob_area = glob_area->next) { - glob_area->global->flag &= ~GLOBAL_AREA_IS_HIDDEN; - } - /* restore the old side panels/header visibility */ - for (ar = sa->regionbase.first; ar; ar = ar->next) { - ar->flag = ar->flagfullscreen; - } - } - - ED_area_data_swap(fullsa, sa); - - /* animtimer back */ - sc->animtimer = oldscreen->animtimer; - oldscreen->animtimer = NULL; - - ED_screen_change(C, sc); - - BKE_workspace_layout_remove(CTX_data_main(C), workspace, layout_old); - - /* After we've restored back to SCREENNORMAL, we have to wait with - * screen handling as it uses the area coords which aren't updated yet. - * Without doing so, the screen handling gets wrong area coords, - * which in worst case can lead to crashes (see T43139) */ - sc->skip_handling = true; - } - else { - /* change from SCREENNORMAL to new state */ - WorkSpaceLayout *layout_new; - ScrArea *newa; - char newname[MAX_ID_NAME - 2]; - - BLI_assert(ELEM(state, SCREENMAXIMIZED, SCREENFULL)); - - oldscreen = WM_window_get_active_screen(win); - - oldscreen->state = state; - BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name + 2, "nonnormal"); - - layout_new = ED_workspace_layout_add(bmain, workspace, win, newname); - - sc = BKE_workspace_layout_screen_get(layout_new); - sc->state = state; - sc->redraws_flag = oldscreen->redraws_flag; - sc->temp = oldscreen->temp; - sc->flag = oldscreen->flag; - - /* timer */ - sc->animtimer = oldscreen->animtimer; - oldscreen->animtimer = NULL; - - /* use random area when we have no active one, e.g. when the - * mouse is outside of the window and we open a file browser */ - if (!sa || sa->global) { - sa = oldscreen->areabase.first; - } - - newa = (ScrArea *)sc->areabase.first; - - /* copy area */ - ED_area_data_swap(newa, sa); - newa->flag = sa->flag; /* mostly for AREA_FLAG_WASFULLSCREEN */ - - if (state == SCREENFULL) { - /* temporarily hide global areas */ - for (ScrArea *glob_area = win->global_areas.areabase.first; glob_area; glob_area = glob_area->next) { - glob_area->global->flag |= GLOBAL_AREA_IS_HIDDEN; - } - /* temporarily hide the side panels/header */ - for (ar = newa->regionbase.first; ar; ar = ar->next) { - ar->flagfullscreen = ar->flag; - - if (ELEM(ar->regiontype, - RGN_TYPE_UI, RGN_TYPE_HEADER, RGN_TYPE_FOOTER, - RGN_TYPE_TOOLS, RGN_TYPE_NAV_BAR, RGN_TYPE_EXECUTE)) - { - ar->flag |= RGN_FLAG_HIDDEN; - } - } - } - - sa->full = oldscreen; - newa->full = oldscreen; - - ED_screen_change(C, sc); - } - - /* XXX bad code: setscreen() ends with first area active. fullscreen render assumes this too */ - CTX_wm_area_set(C, sc->areabase.first); - - return sc->areabase.first; + Main *bmain = CTX_data_main(C); + wmWindowManager *wm = CTX_wm_manager(C); + WorkSpace *workspace = WM_window_get_active_workspace(win); + bScreen *sc, *oldscreen; + ARegion *ar; + + if (sa) { + /* ensure we don't have a button active anymore, can crash when + * switching screens with tooltip open because region and tooltip + * are no longer in the same screen */ + for (ar = sa->regionbase.first; ar; ar = ar->next) { + UI_blocklist_free(C, &ar->uiblocks); + + if (ar->regiontimer) { + WM_event_remove_timer(wm, NULL, ar->regiontimer); + ar->regiontimer = NULL; + } + } + + /* prevent hanging status prints */ + ED_area_status_text(sa, NULL); + ED_workspace_status_text(C, NULL); + } + + if (sa && sa->full) { + WorkSpaceLayout *layout_old = WM_window_get_active_layout(win); + /* restoring back to SCREENNORMAL */ + sc = sa->full; /* the old screen to restore */ + oldscreen = WM_window_get_active_screen(win); /* the one disappearing */ + + BLI_assert(BKE_workspace_layout_screen_get(layout_old) != sc); + BLI_assert(BKE_workspace_layout_screen_get(layout_old)->state != SCREENNORMAL); + + sc->state = SCREENNORMAL; + sc->flag = oldscreen->flag; + + /* find old area to restore from */ + ScrArea *fullsa = NULL; + for (ScrArea *old = sc->areabase.first; old; old = old->next) { + /* area to restore from is always first */ + if (old->full && !fullsa) { + fullsa = old; + } + + /* clear full screen state */ + old->full = NULL; + } + + sa->full = NULL; + + if (fullsa == NULL) { + if (G.debug & G_DEBUG) + printf("%s: something wrong in areafullscreen\n", __func__); + return NULL; + } + + if (state == SCREENFULL) { + /* unhide global areas */ + for (ScrArea *glob_area = win->global_areas.areabase.first; glob_area; + glob_area = glob_area->next) { + glob_area->global->flag &= ~GLOBAL_AREA_IS_HIDDEN; + } + /* restore the old side panels/header visibility */ + for (ar = sa->regionbase.first; ar; ar = ar->next) { + ar->flag = ar->flagfullscreen; + } + } + + ED_area_data_swap(fullsa, sa); + + /* animtimer back */ + sc->animtimer = oldscreen->animtimer; + oldscreen->animtimer = NULL; + + ED_screen_change(C, sc); + + BKE_workspace_layout_remove(CTX_data_main(C), workspace, layout_old); + + /* After we've restored back to SCREENNORMAL, we have to wait with + * screen handling as it uses the area coords which aren't updated yet. + * Without doing so, the screen handling gets wrong area coords, + * which in worst case can lead to crashes (see T43139) */ + sc->skip_handling = true; + } + else { + /* change from SCREENNORMAL to new state */ + WorkSpaceLayout *layout_new; + ScrArea *newa; + char newname[MAX_ID_NAME - 2]; + + BLI_assert(ELEM(state, SCREENMAXIMIZED, SCREENFULL)); + + oldscreen = WM_window_get_active_screen(win); + + oldscreen->state = state; + BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name + 2, "nonnormal"); + + layout_new = ED_workspace_layout_add(bmain, workspace, win, newname); + + sc = BKE_workspace_layout_screen_get(layout_new); + sc->state = state; + sc->redraws_flag = oldscreen->redraws_flag; + sc->temp = oldscreen->temp; + sc->flag = oldscreen->flag; + + /* timer */ + sc->animtimer = oldscreen->animtimer; + oldscreen->animtimer = NULL; + + /* use random area when we have no active one, e.g. when the + * mouse is outside of the window and we open a file browser */ + if (!sa || sa->global) { + sa = oldscreen->areabase.first; + } + + newa = (ScrArea *)sc->areabase.first; + + /* copy area */ + ED_area_data_swap(newa, sa); + newa->flag = sa->flag; /* mostly for AREA_FLAG_WASFULLSCREEN */ + + if (state == SCREENFULL) { + /* temporarily hide global areas */ + for (ScrArea *glob_area = win->global_areas.areabase.first; glob_area; + glob_area = glob_area->next) { + glob_area->global->flag |= GLOBAL_AREA_IS_HIDDEN; + } + /* temporarily hide the side panels/header */ + for (ar = newa->regionbase.first; ar; ar = ar->next) { + ar->flagfullscreen = ar->flag; + + if (ELEM(ar->regiontype, + RGN_TYPE_UI, + RGN_TYPE_HEADER, + RGN_TYPE_FOOTER, + RGN_TYPE_TOOLS, + RGN_TYPE_NAV_BAR, + RGN_TYPE_EXECUTE)) { + ar->flag |= RGN_FLAG_HIDDEN; + } + } + } + + sa->full = oldscreen; + newa->full = oldscreen; + + ED_screen_change(C, sc); + } + + /* XXX bad code: setscreen() ends with first area active. fullscreen render assumes this too */ + CTX_wm_area_set(C, sc->areabase.first); + + return sc->areabase.first; } /* update frame rate info for viewport drawing */ void ED_refresh_viewport_fps(bContext *C) { - wmTimer *animtimer = CTX_wm_screen(C)->animtimer; - Scene *scene = CTX_data_scene(C); - - /* is anim playback running? */ - if (animtimer && (U.uiflag & USER_SHOW_FPS)) { - ScreenFrameRateInfo *fpsi = scene->fps_info; - - /* if there isn't any info, init it first */ - if (fpsi == NULL) - fpsi = scene->fps_info = MEM_callocN(sizeof(ScreenFrameRateInfo), "refresh_viewport_fps fps_info"); - - /* update the values */ - fpsi->redrawtime = fpsi->lredrawtime; - fpsi->lredrawtime = animtimer->ltime; - } - else { - /* playback stopped or shouldn't be running */ - if (scene->fps_info) - MEM_freeN(scene->fps_info); - scene->fps_info = NULL; - } + wmTimer *animtimer = CTX_wm_screen(C)->animtimer; + Scene *scene = CTX_data_scene(C); + + /* is anim playback running? */ + if (animtimer && (U.uiflag & USER_SHOW_FPS)) { + ScreenFrameRateInfo *fpsi = scene->fps_info; + + /* if there isn't any info, init it first */ + if (fpsi == NULL) + fpsi = scene->fps_info = MEM_callocN(sizeof(ScreenFrameRateInfo), + "refresh_viewport_fps fps_info"); + + /* update the values */ + fpsi->redrawtime = fpsi->lredrawtime; + fpsi->lredrawtime = animtimer->ltime; + } + else { + /* playback stopped or shouldn't be running */ + if (scene->fps_info) + MEM_freeN(scene->fps_info); + scene->fps_info = NULL; + } } /* redraws: uses defines from stime->redraws @@ -1315,138 +1331,136 @@ void ED_refresh_viewport_fps(bContext *C) */ void ED_screen_animation_timer(bContext *C, int redraws, int refresh, int sync, int enable) { - bScreen *screen = CTX_wm_screen(C); - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win = CTX_wm_window(C); - Scene *scene = CTX_data_scene(C); - bScreen *stopscreen = ED_screen_animation_playing(wm); - - if (stopscreen) { - WM_event_remove_timer(wm, win, stopscreen->animtimer); - stopscreen->animtimer = NULL; - } - - if (enable) { - ScreenAnimData *sad = MEM_callocN(sizeof(ScreenAnimData), "ScreenAnimData"); - - screen->animtimer = WM_event_add_timer(wm, win, TIMER0, (1.0 / FPS)); - - sad->ar = CTX_wm_region(C); - /* if startframe is larger than current frame, we put currentframe on startframe. - * note: first frame then is not drawn! (ton) */ - if (PRVRANGEON) { - if (scene->r.psfra > scene->r.cfra) { - sad->sfra = scene->r.cfra; - scene->r.cfra = scene->r.psfra; - } - else - sad->sfra = scene->r.cfra; - } - else { - if (scene->r.sfra > scene->r.cfra) { - sad->sfra = scene->r.cfra; - scene->r.cfra = scene->r.sfra; - } - else - sad->sfra = scene->r.cfra; - } - sad->redraws = redraws; - sad->refresh = refresh; - sad->flag |= (enable < 0) ? ANIMPLAY_FLAG_REVERSE : 0; - sad->flag |= (sync == 0) ? ANIMPLAY_FLAG_NO_SYNC : (sync == 1) ? ANIMPLAY_FLAG_SYNC : 0; - - ScrArea *sa = CTX_wm_area(C); - - char spacetype = -1; - - if (sa) - spacetype = sa->spacetype; - - sad->from_anim_edit = (ELEM(spacetype, SPACE_GRAPH, SPACE_ACTION, SPACE_NLA)); - - screen->animtimer->customdata = sad; - - } - - /* notifier catched by top header, for button */ - WM_event_add_notifier(C, NC_SCREEN | ND_ANIMPLAY, NULL); + bScreen *screen = CTX_wm_screen(C); + wmWindowManager *wm = CTX_wm_manager(C); + wmWindow *win = CTX_wm_window(C); + Scene *scene = CTX_data_scene(C); + bScreen *stopscreen = ED_screen_animation_playing(wm); + + if (stopscreen) { + WM_event_remove_timer(wm, win, stopscreen->animtimer); + stopscreen->animtimer = NULL; + } + + if (enable) { + ScreenAnimData *sad = MEM_callocN(sizeof(ScreenAnimData), "ScreenAnimData"); + + screen->animtimer = WM_event_add_timer(wm, win, TIMER0, (1.0 / FPS)); + + sad->ar = CTX_wm_region(C); + /* if startframe is larger than current frame, we put currentframe on startframe. + * note: first frame then is not drawn! (ton) */ + if (PRVRANGEON) { + if (scene->r.psfra > scene->r.cfra) { + sad->sfra = scene->r.cfra; + scene->r.cfra = scene->r.psfra; + } + else + sad->sfra = scene->r.cfra; + } + else { + if (scene->r.sfra > scene->r.cfra) { + sad->sfra = scene->r.cfra; + scene->r.cfra = scene->r.sfra; + } + else + sad->sfra = scene->r.cfra; + } + sad->redraws = redraws; + sad->refresh = refresh; + sad->flag |= (enable < 0) ? ANIMPLAY_FLAG_REVERSE : 0; + sad->flag |= (sync == 0) ? ANIMPLAY_FLAG_NO_SYNC : (sync == 1) ? ANIMPLAY_FLAG_SYNC : 0; + + ScrArea *sa = CTX_wm_area(C); + + char spacetype = -1; + + if (sa) + spacetype = sa->spacetype; + + sad->from_anim_edit = (ELEM(spacetype, SPACE_GRAPH, SPACE_ACTION, SPACE_NLA)); + + screen->animtimer->customdata = sad; + } + + /* notifier catched by top header, for button */ + WM_event_add_notifier(C, NC_SCREEN | ND_ANIMPLAY, NULL); } /* helper for screen_animation_play() - only to be used for TimeLine */ static ARegion *time_top_left_3dwindow(bScreen *screen) { - ARegion *aret = NULL; - ScrArea *sa; - int min = 10000; - - for (sa = screen->areabase.first; sa; sa = sa->next) { - if (sa->spacetype == SPACE_VIEW3D) { - ARegion *ar; - for (ar = sa->regionbase.first; ar; ar = ar->next) { - if (ar->regiontype == RGN_TYPE_WINDOW) { - if (ar->winrct.xmin - ar->winrct.ymin < min) { - aret = ar; - min = ar->winrct.xmin - ar->winrct.ymin; - } - } - } - } - } - - return aret; + ARegion *aret = NULL; + ScrArea *sa; + int min = 10000; + + for (sa = screen->areabase.first; sa; sa = sa->next) { + if (sa->spacetype == SPACE_VIEW3D) { + ARegion *ar; + for (ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar->regiontype == RGN_TYPE_WINDOW) { + if (ar->winrct.xmin - ar->winrct.ymin < min) { + aret = ar; + min = ar->winrct.xmin - ar->winrct.ymin; + } + } + } + } + } + + return aret; } void ED_screen_animation_timer_update(bScreen *screen, int redraws, int refresh) { - if (screen && screen->animtimer) { - wmTimer *wt = screen->animtimer; - ScreenAnimData *sad = wt->customdata; - - sad->redraws = redraws; - sad->refresh = refresh; - sad->ar = NULL; - if (redraws & TIME_REGION) - sad->ar = time_top_left_3dwindow(screen); - } + if (screen && screen->animtimer) { + wmTimer *wt = screen->animtimer; + ScreenAnimData *sad = wt->customdata; + + sad->redraws = redraws; + sad->refresh = refresh; + sad->ar = NULL; + if (redraws & TIME_REGION) + sad->ar = time_top_left_3dwindow(screen); + } } /* results in fully updated anim system */ void ED_update_for_newframe(Main *bmain, Depsgraph *depsgraph) { - Scene *scene = DEG_get_input_scene(depsgraph); + Scene *scene = DEG_get_input_scene(depsgraph); #ifdef DURIAN_CAMERA_SWITCH - void *camera = BKE_scene_camera_switch_find(scene); - if (camera && scene->camera != camera) { - bScreen *sc; - scene->camera = camera; - /* are there cameras in the views that are not in the scene? */ - for (sc = bmain->screens.first; sc; sc = sc->id.next) { - BKE_screen_view3d_scene_sync(sc, scene); - } - DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); - } + void *camera = BKE_scene_camera_switch_find(scene); + if (camera && scene->camera != camera) { + bScreen *sc; + scene->camera = camera; + /* are there cameras in the views that are not in the scene? */ + for (sc = bmain->screens.first; sc; sc = sc->id.next) { + BKE_screen_view3d_scene_sync(sc, scene); + } + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); + } #endif - ED_clip_update_frame(bmain, scene->r.cfra); + ED_clip_update_frame(bmain, scene->r.cfra); - /* this function applies the changes too */ - BKE_scene_graph_update_for_newframe(depsgraph, bmain); + /* this function applies the changes too */ + BKE_scene_graph_update_for_newframe(depsgraph, bmain); - /* composite */ - if (scene->use_nodes && scene->nodetree) - ntreeCompositTagAnimated(scene->nodetree); - - /* update animated texture nodes */ - { - Tex *tex; - for (tex = bmain->textures.first; tex; tex = tex->id.next) { - if (tex->use_nodes && tex->nodetree) { - ntreeTexTagAnimated(tex->nodetree); - } - } - } + /* composite */ + if (scene->use_nodes && scene->nodetree) + ntreeCompositTagAnimated(scene->nodetree); + /* update animated texture nodes */ + { + Tex *tex; + for (tex = bmain->textures.first; tex; tex = tex->id.next) { + if (tex->use_nodes && tex->nodetree) { + ntreeTexTagAnimated(tex->nodetree); + } + } + } } /* @@ -1454,81 +1468,76 @@ void ED_update_for_newframe(Main *bmain, Depsgraph *depsgraph) */ bool ED_screen_stereo3d_required(const bScreen *screen, const Scene *scene) { - ScrArea *sa; - const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0; - - for (sa = screen->areabase.first; sa; sa = sa->next) { - switch (sa->spacetype) { - case SPACE_VIEW3D: - { - View3D *v3d; - - if (!is_multiview) - continue; - - v3d = sa->spacedata.first; - if (v3d->camera && v3d->stereo3d_camera == STEREO_3D_ID) { - ARegion *ar; - for (ar = sa->regionbase.first; ar; ar = ar->next) { - if (ar->regiondata && ar->regiontype == RGN_TYPE_WINDOW) { - RegionView3D *rv3d = ar->regiondata; - if (rv3d->persp == RV3D_CAMOB) { - return true; - } - } - } - } - break; - } - case SPACE_IMAGE: - { - SpaceImage *sima; - - /* images should always show in stereo, even if - * the file doesn't have views enabled */ - sima = sa->spacedata.first; - if (sima->image && BKE_image_is_stereo(sima->image) && - (sima->iuser.flag & IMA_SHOW_STEREO)) - { - return true; - } - break; - } - case SPACE_NODE: - { - SpaceNode *snode; - - if (!is_multiview) - continue; - - snode = sa->spacedata.first; - if ((snode->flag & SNODE_BACKDRAW) && ED_node_is_compositor(snode)) { - return true; - } - break; - } - case SPACE_SEQ: - { - SpaceSeq *sseq; - - if (!is_multiview) - continue; - - sseq = sa->spacedata.first; - if (ELEM(sseq->view, SEQ_VIEW_PREVIEW, SEQ_VIEW_SEQUENCE_PREVIEW)) { - return true; - } - - if (sseq->draw_flag & SEQ_DRAW_BACKDROP) { - return true; - } - - break; - } - } - } - - return false; + ScrArea *sa; + const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0; + + for (sa = screen->areabase.first; sa; sa = sa->next) { + switch (sa->spacetype) { + case SPACE_VIEW3D: { + View3D *v3d; + + if (!is_multiview) + continue; + + v3d = sa->spacedata.first; + if (v3d->camera && v3d->stereo3d_camera == STEREO_3D_ID) { + ARegion *ar; + for (ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar->regiondata && ar->regiontype == RGN_TYPE_WINDOW) { + RegionView3D *rv3d = ar->regiondata; + if (rv3d->persp == RV3D_CAMOB) { + return true; + } + } + } + } + break; + } + case SPACE_IMAGE: { + SpaceImage *sima; + + /* images should always show in stereo, even if + * the file doesn't have views enabled */ + sima = sa->spacedata.first; + if (sima->image && BKE_image_is_stereo(sima->image) && + (sima->iuser.flag & IMA_SHOW_STEREO)) { + return true; + } + break; + } + case SPACE_NODE: { + SpaceNode *snode; + + if (!is_multiview) + continue; + + snode = sa->spacedata.first; + if ((snode->flag & SNODE_BACKDRAW) && ED_node_is_compositor(snode)) { + return true; + } + break; + } + case SPACE_SEQ: { + SpaceSeq *sseq; + + if (!is_multiview) + continue; + + sseq = sa->spacedata.first; + if (ELEM(sseq->view, SEQ_VIEW_PREVIEW, SEQ_VIEW_SEQUENCE_PREVIEW)) { + return true; + } + + if (sseq->draw_flag & SEQ_DRAW_BACKDROP) { + return true; + } + + break; + } + } + } + + return false; } /** @@ -1536,52 +1545,55 @@ bool ED_screen_stereo3d_required(const bScreen *screen, const Scene *scene) * \note Assumes \a screen to be visible/active! */ -Scene *ED_screen_scene_find_with_window(const bScreen *screen, const wmWindowManager *wm, struct wmWindow **r_window) +Scene *ED_screen_scene_find_with_window(const bScreen *screen, + const wmWindowManager *wm, + struct wmWindow **r_window) { - for (wmWindow *win = wm->windows.first; win; win = win->next) { - if (WM_window_get_active_screen(win) == screen) { - if (r_window) { - *r_window = win; - } - return WM_window_get_active_scene(win); - } - } - - BLI_assert(0); - return NULL; + for (wmWindow *win = wm->windows.first; win; win = win->next) { + if (WM_window_get_active_screen(win) == screen) { + if (r_window) { + *r_window = win; + } + return WM_window_get_active_scene(win); + } + } + + BLI_assert(0); + return NULL; } -ScrArea *ED_screen_area_find_with_spacedata(const bScreen *screen, const SpaceLink *sl, const bool only_visible) +ScrArea *ED_screen_area_find_with_spacedata(const bScreen *screen, + const SpaceLink *sl, + const bool only_visible) { - if (only_visible) { - for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { - if (sa->spacedata.first == sl) { - return sa; - } - } - } - else { - for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { - if (BLI_findindex(&sa->spacedata, sl) != -1) { - return sa; - } - } - } - return NULL; + if (only_visible) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + if (sa->spacedata.first == sl) { + return sa; + } + } + } + else { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + if (BLI_findindex(&sa->spacedata, sl) != -1) { + return sa; + } + } + } + return NULL; } Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm) { - return ED_screen_scene_find_with_window(screen, wm, NULL); + return ED_screen_scene_find_with_window(screen, wm, NULL); } - wmWindow *ED_screen_window_find(const bScreen *screen, const wmWindowManager *wm) { - for (wmWindow *win = wm->windows.first; win; win = win->next) { - if (WM_window_get_active_screen(win) == screen) { - return win; - } - } - return NULL; + for (wmWindow *win = wm->windows.first; win; win = win->next) { + if (WM_window_get_active_screen(win) == screen) { + return win; + } + } + return NULL; } -- cgit v1.2.3