[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