[Bf-blender-cvs] [38ccbac482c] topbar: Fixes for topbar layout updating

Julian Eisel noreply at git.blender.org
Sat Jul 29 18:55:13 CEST 2017


Commit: 38ccbac482c75dacee72b269fa2cff327f56b99a
Author: Julian Eisel
Date:   Sat Jul 29 17:25:20 2017 +0200
Branches: topbar
https://developer.blender.org/rB38ccbac482c75dacee72b269fa2cff327f56b99a

Fixes for topbar layout updating

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

M	source/blender/editors/screen/area.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/makesdna/DNA_screen_types.h

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

diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 39020736911..8d2f4ca467f 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -1152,10 +1152,11 @@ static void region_rect_recursive(wmWindow *win, ScrArea *sa, ARegion *ar, rcti
 	/* user errors */
 	if (ar->next == NULL && alignment != RGN_ALIGN_QSPLIT)
 		alignment = RGN_ALIGN_NONE;
-	
+
 	/* prefsize, for header we stick to exception (prevent dpi rounding error) */
-	prefsizex = UI_DPI_FAC * (ar->sizex > 1 ? ar->sizex + 0.5f : ar->type->prefsizex);
-	
+	const float sizex_dpi_fac = (ar->flag & RGN_SIZEX_DPI_APPLIED) ? 1.0f : UI_DPI_FAC;
+	prefsizex = sizex_dpi_fac * ((ar->sizex > 1) ? ar->sizex + 0.5f : ar->type->prefsizex);
+
 	if (ar->regiontype == RGN_TYPE_HEADER) {
 		prefsizey = ED_area_headersize();
 	}
@@ -1482,10 +1483,16 @@ static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ListBase *hand
 
 void screen_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea *area)
 {
-	rcti rect = area->totrct;
+	const int size_x = WM_window_pixels_x(win);
+	const int size_y = WM_window_pixels_y(win);
+	rcti rect;
+
+	area_calc_totrct(area, size_x, size_y);
 
 	/* region rect sizes */
+	rect = area->totrct;
 	region_rect_recursive(win, area, area->regionbase.first, &rect, 0, false);
+
 	for (ARegion *ar = area->regionbase.first; ar; ar = ar->next) {
 		region_subwindow(win, ar, false);
 
@@ -1495,8 +1502,6 @@ void screen_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea
 		}
 	}
 
-	/* XXX hack to force drawing */
-	ED_area_tag_redraw(area);
 	area->flag &= ~AREA_FLAG_REGION_SIZE_UPDATE;
 }
 
@@ -2177,13 +2182,15 @@ void ED_region_header(const bContext *C, ARegion *ar)
 		if (xco > maxco)
 			maxco = xco;
 
-		if (region_layout_based) {
+		if (region_layout_based && (ar->sizex != (maxco + start_ofs))) {
+			/* region size is layout based and needs to be updated */
 			ScrArea *sa = CTX_wm_area(C);
 
 			ar->sizex = maxco + start_ofs;
 			UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->sizex, ar->winy);
 
 			sa->flag |= AREA_FLAG_REGION_SIZE_UPDATE;
+			ar->flag |= RGN_SIZEX_DPI_APPLIED;
 			ar->flag &= ~RGN_RESIZE_LAYOUT_BASED;
 		}
 		UI_block_end(C, block);
@@ -2191,7 +2198,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
 	}
 
 	/* always as last  */
-	UI_view2d_totRect_set(&ar->v2d, maxco + (region_layout_based ? UI_UNIT_X + 80 : 0), headery);
+	UI_view2d_totRect_set(&ar->v2d, maxco + (region_layout_based ? 0 : UI_UNIT_X + 80), headery);
 
 	/* restore view matrix? */
 	UI_view2d_view_restore(C);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 43c5270bd5b..0ec2e9c1d1a 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -828,12 +828,26 @@ void ED_screen_ensure_updated(wmWindowManager *wm, wmWindow *win, bScreen *scree
 		ED_screen_refresh(wm, win);
 	}
 	else {
+		const int screen_size_x = WM_window_screen_pixels_x(win);
+		const int screen_size_y = WM_window_screen_pixels_y(win);
+		bool has_updated = false;
+
+		screen_test_scale(win, screen, screen_size_x, screen_size_y);
+
 		ED_screen_areas_iter(win, screen, area) {
 			if (area->flag & AREA_FLAG_REGION_SIZE_UPDATE) {
-				screen_area_update_region_sizes(wm, win, area);
+				has_updated = true;
 				break;
 			}
 		}
+
+		if (has_updated) {
+			ED_screen_areas_iter(win, screen, area) {
+				screen_area_update_region_sizes(wm, win, area);
+				/* XXX hack to force drawing */
+				ED_area_tag_redraw(area);
+			}
+		}
 	}
 }
 
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 4ab94f30122..be41442c423 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -421,7 +421,10 @@ enum {
 	/* Force delayed reinit of region size data, so that region size is calculated
 	 * just big enough to show all its content (if enough space is available).
 	 * Note that only ED_region_header supports this right now. */
-	RGN_RESIZE_LAYOUT_BASED = (1 << 2),
+	RGN_RESIZE_LAYOUT_BASED     = (1 << 2),
+	/* The region width stored in ARegion.sizex already has the DPI
+	 * factor applied, skip applying it again (in region_rect_recursive) */
+	RGN_SIZEX_DPI_APPLIED       = (1 << 3),
 };
 
 /* region do_draw */




More information about the Bf-blender-cvs mailing list