[Bf-blender-cvs] [36806f935f5] topbar: Make topbar scale correctly with DPI

Julian Eisel noreply at git.blender.org
Tue Jul 11 21:04:13 CEST 2017


Commit: 36806f935f54c03e94f7417a118504753deb706d
Author: Julian Eisel
Date:   Tue Jul 11 21:03:16 2017 +0200
Branches: topbar
https://developer.blender.org/rB36806f935f54c03e94f7417a118504753deb706d

Make topbar scale correctly with DPI

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

M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/include/ED_screen.h
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/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 47913bc3d86..e88c62ce274 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -325,14 +325,18 @@ void do_versions_after_linking_280(Main *main)
 	}
 
 	{
+		const float dpi_fac = (U.pixelsize * (float)U.dpi / 72.0f); /* UI_DPI_FAC */
+		const short size_y = 2 * HEADERY;
+
 		for (wmWindowManager *wm = main->wm.first; wm; wm = wm->id.next) {
 			for (wmWindow *win = wm->windows.first; win; win = win->next) {
-				bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
-				const short size_y = 2 * HEADERY;
+				const bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
 
 				/* XXX duplicated from ED_screen_global_areas_create */
 				if (screen->temp == 0) {
 					ScrArea *sa = MEM_callocN(sizeof(*sa), "do version topbar area");
+					SpaceType *st = BKE_spacetype_from_id(SPACE_TOPBAR);
+					SpaceLink *sl = st->new(NULL); /* XXX passing NULL as context */
 
 					sa->v1 = MEM_callocN(sizeof(*sa->v1), "do_version topbar vert");
 					sa->v2 = MEM_callocN(sizeof(*sa->v2), "do_version topbar vert");
@@ -341,22 +345,18 @@ void do_versions_after_linking_280(Main *main)
 
 					sa->v1->vec.x = sa->v2->vec.x = 0;
 					sa->v3->vec.x = sa->v4->vec.x = win->sizex;
-					sa->v1->vec.y = sa->v4->vec.y = win->sizey - size_y;
+					sa->v1->vec.y = sa->v4->vec.y = win->sizey - size_y * dpi_fac;
 					sa->v2->vec.y = sa->v3->vec.y = win->sizey;
-					sa->headertype = HEADERTOP;
+
 					sa->spacetype = sa->butspacetype = SPACE_TOPBAR;
-					sa->winy = size_y;
+					sa->fixed_height = size_y;
+					sa->headertype = HEADERTOP;
 
 					BLI_addhead(&win->global_areas, sa);
 
-					{
-						SpaceType *st = BKE_spacetype_from_id(SPACE_TOPBAR);
-						SpaceLink *sl = st->new(NULL); /* XXX passing NULL as context */
-
-						BLI_addhead(&sa->spacedata, sl);
-						sa->regionbase = sl->regionbase;
-						BLI_listbase_clear(&sl->regionbase);
-					}
+					BLI_addhead(&sa->spacedata, sl);
+					sa->regionbase = sl->regionbase;
+					BLI_listbase_clear(&sl->regionbase);
 				}
 			}
 		}
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index b841d1d6b9e..e4ad8d2aa8d 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -105,6 +105,9 @@ void    ED_area_newspace(struct bContext *C, ScrArea *sa, int type, const bool s
 void    ED_area_prevspace(struct bContext *C, ScrArea *sa);
 void    ED_area_swapspace(struct bContext *C, ScrArea *sa1, ScrArea *sa2);
 int     ED_area_headersize(void);
+int     ED_area_global_size_y(const struct wmWindow *win, const ScrArea *area);
+bool    ED_area_is_global(const struct wmWindow *win, const ScrArea *area);
+int     ED_region_global_size_y(void);
 
 /** Iterate over all areas visible in the screen (screen as in everything visible in the window, not just bScreen) */
 #define ED_screen_areas_iter(win, screen, area_name)     \
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index b7cc392ce41..32c78bb9d0e 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -1159,6 +1159,9 @@ static void region_rect_recursive(wmWindow *win, ScrArea *sa, ARegion *ar, rcti
 	if (ar->regiontype == RGN_TYPE_HEADER) {
 		prefsizey = ED_area_headersize();
 	}
+	else if (ED_area_is_global(win, sa)) {
+		prefsizey = ED_region_global_size_y();
+	}
 	else if (ar->regiontype == RGN_TYPE_UI && sa->spacetype == SPACE_FILE) {
 		prefsizey = UI_UNIT_Y * 2 + (UI_UNIT_Y / 2);
 	}
@@ -1548,24 +1551,6 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 	}
 }
 
-static void area_global_calc_totrct(ScrArea *sa, int sizex, int sizey)
-{
-	short rt = (short)U.pixelsize;
-
-	sa->v1->vec.x = sa->v2->vec.x = 0;
-	sa->v3->vec.x = sa->v4->vec.x = sizex - rt;
-	sa->v1->vec.y = sa->v4->vec.y = sizey - (2 * HEADERY) + rt;
-	sa->v2->vec.y = sa->v3->vec.y = sizey - rt;
-	sa->totrct.xmin = sa->v1->vec.x;
-	sa->totrct.xmax = sa->v4->vec.x;
-	sa->totrct.ymin = sa->v1->vec.y;
-	sa->totrct.ymax = sa->v2->vec.y;
-
-	/* for speedup */
-	sa->winx = BLI_rcti_size_x(&sa->totrct) + 1;
-	sa->winy = BLI_rcti_size_y(&sa->totrct) + 1;
-}
-
 /* XXX code duplicated from ED_area_initialize */
 void ED_area_global_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 {
@@ -1579,7 +1564,7 @@ void ED_area_global_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 	}
 
 	/* area sizes */
-	area_global_calc_totrct(sa, size_x, size_y);
+	area_calc_totrct(sa, size_x, size_y);
 
 	/* region rect sizes */
 	rect = sa->totrct;
@@ -2217,6 +2202,33 @@ int ED_area_headersize(void)
 	return (int)(HEADERY * UI_DPI_FAC);
 }
 
+/**
+ * \return the final height of a global \a area, accounting for DPI.
+ */
+int ED_area_global_size_y(const wmWindow *win, const ScrArea *area)
+{
+	BLI_assert(ED_area_is_global(win, area));
+	UNUSED_VARS_NDEBUG(win);
+
+	return area->fixed_height * UI_DPI_FAC;
+}
+
+bool ED_area_is_global(const wmWindow *win, const ScrArea *area)
+{
+	return BLI_findindex(&win->global_areas, area) != -1;
+}
+
+/**
+ * For now we just assume all global areas are made up out of horizontal bars
+ * with the same size. A fixed size could be stored in ARegion instead if needed.
+ *
+ * \return the DPI aware height of a single bar/region in global areas.
+ */
+int ED_region_global_size_y(void)
+{
+	return ED_area_headersize(); /* same size as header */
+}
+
 void ED_region_info_draw_multiline(ARegion *ar, const char *text_array[], float fill_color[4], const bool full_redraw)
 {
 	const int header_height = UI_UNIT_Y;
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index ac2d7e0c32b..823ea2904f0 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -509,7 +509,7 @@ void select_connected_scredge(bScreen *sc, ScrEdge *edge)
 }
 
 /* test if screen vertices should be scaled */
-static void screen_test_scale(bScreen *sc, int winsize_x, int winsize_y)
+static void screen_test_scale(const wmWindow *win, bScreen *sc, int winsize_x, int winsize_y)
 {
 	/* clamp Y size of header sized areas when expanding windows
 	 * avoids annoying empty space around file menu */
@@ -678,7 +678,17 @@ static void screen_test_scale(bScreen *sc, int winsize_x, int winsize_y)
 			}
 		}
 	}
-	
+
+	for (ScrArea *area = win->global_areas.first; area; area = area->next) {
+		short px = (short)U.pixelsize;
+
+		/* width */
+		area->v1->vec.x = area->v2->vec.x = 0;
+		area->v3->vec.x = area->v4->vec.x = win->sizex;
+		/* height */
+		area->v1->vec.y = area->v4->vec.y = win->sizey - ED_area_global_size_y(win, area);
+		area->v2->vec.y = area->v3->vec.y = win->sizey - px;
+	}
 }
 
 
@@ -764,9 +774,9 @@ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
 		/* header size depends on DPI, let's verify */
 		WM_window_set_dpi(win);
 		screen_refresh_headersizes();
-		
-		screen_test_scale(screen, screen_size_x, screen_size_y);
-		
+
+		screen_test_scale(win, screen, screen_size_x, screen_size_y);
+
 		if (screen->mainwin == 0) {
 			screen->mainwin = wm_subwindow_open(win, &window_rect, false);
 		}
@@ -1065,9 +1075,12 @@ int ED_screen_area_active(const bContext *C)
 void ED_screen_global_areas_create(const bContext *C, wmWindow *win)
 {
 	const bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
+	const short size_y = 2 * HEADERY;
 
 	if (screen->temp == 0) {
 		ScrArea *sa = MEM_callocN(sizeof(*sa), "top bar area");
+		SpaceType *st = BKE_spacetype_from_id(SPACE_TOPBAR);
+		SpaceLink *sl = st->new(C);
 
 		sa->v1 = MEM_callocN(sizeof(*sa->v1), __func__);
 		sa->v2 = MEM_callocN(sizeof(*sa->v2), __func__);
@@ -1076,21 +1089,18 @@ void ED_screen_global_areas_create(const bContext *C, wmWindow *win)
 
 		sa->v1->vec.x = sa->v2->vec.x = 0;
 		sa->v3->vec.x = sa->v4->vec.x = win->sizex;
-		sa->v1->vec.y = sa->v4->vec.y = win->sizey - (2 * HEADERY);
+		sa->v1->vec.y = sa->v4->vec.y = win->sizey - size_y * UI_DPI_FAC;
 		sa->v2->vec.y = sa->v3->vec.y = win->sizey;
-		sa->headertype = HEADERTOP;
+
 		sa->spacetype = sa->butspacetype = SPACE_TOPBAR;
+		sa->fixed_height = size_y;
+		sa->headertype = HEADERTOP;
 
 		BLI_addhead(&win->global_areas, sa);
 
-		{
-			SpaceType *st = BKE_spacetype_from_id(SPACE_TOPBAR);
-			SpaceLink *sl = st->new(C);
-
-			BLI_addhead(&sa->spacedata, sl);
-			sa->regionbase = sl->regionbase;
-			BLI_listbase_clear(&sl->regionbase);
-		}
+		BLI_addhead(&sa->spacedata, sl);
+		sa->regionbase = sl->regionbase;
+		BLI_listbase_clear(&sl->regionbase);
 	}
 }
 
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 06922534e03..4ab94f30122 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -218,7 +218,10 @@ typedef struct ScrArea {
 
 	char spacetype, butspacetype;	/* SPACE_..., butspacetype is button arg  */
 	short winx, winy;				/* size */
-	
+	/* Fixed height for global areas. Ignores DPI (winy and ED_area_global_size_y don't) */
+	short fixed_height;
+	short pad2[3];
+
 	short headertype;				/* OLD! 0=no header, 1= down, 2= up */
 	short do_refresh;				/* private, for spacetype refresh callback */
 	short flag;




More information about the Bf-blender-cvs mailing list