diff options
-rw-r--r-- | source/blender/editors/include/ED_screen.h | 2 | ||||
-rw-r--r-- | source/blender/editors/screen/area.c | 10 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_edit.c | 17 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 29 |
5 files changed, 50 insertions, 12 deletions
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 1b5425b54c8..a2a619209db 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -150,6 +150,8 @@ void ED_area_swapspace(struct bContext *C, ScrArea *sa1, ScrArea *sa2); int ED_area_headersize(void); int ED_area_header_alignment(const ScrArea *area); int ED_area_global_size_y(const ScrArea *area); +int ED_area_global_min_size_y(const ScrArea *area); +int ED_area_global_max_size_y(const ScrArea *area); bool ED_area_is_global(const ScrArea *area); int ED_region_global_size_y(void); void ED_area_update_region_sizes(struct wmWindowManager *wm, struct wmWindow *win, struct ScrArea *area); diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 16eeff01e58..e96580855d3 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -2362,6 +2362,16 @@ int ED_area_global_size_y(const ScrArea *area) BLI_assert(ED_area_is_global(area)); return round_fl_to_int(area->global->cur_fixed_height * UI_DPI_FAC); } +int ED_area_global_min_size_y(const ScrArea *area) +{ + BLI_assert(ED_area_is_global(area)); + return round_fl_to_int(area->global->size_min * UI_DPI_FAC); +} +int ED_area_global_max_size_y(const ScrArea *area) +{ + BLI_assert(ED_area_is_global(area)); + return round_fl_to_int(area->global->size_max * UI_DPI_FAC); +} bool ED_area_is_global(const ScrArea *area) { diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index c3d18abc2cf..b3424ae3fb4 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -718,7 +718,7 @@ static void screen_vertices_scale( /* adjust headery if verts are along the edge of window */ if (sa->v1->vec.y > window_rect->ymin) headery += U.pixelsize; - if (sa->v2->vec.y < window_rect->ymax) + if (sa->v2->vec.y < (window_rect->ymax - 1)) headery += U.pixelsize; if (area_geometry_height(sa) < headery) { @@ -744,21 +744,32 @@ static void screen_vertices_scale( /* Global areas have a fixed size that only changes with the DPI. Here we ensure that exactly this size is set. */ for (ScrArea *area = win->global_areas.areabase.first; area; area = area->next) { + int height = ED_area_global_size_y(area) - 1; + if (area->global->flag & GLOBAL_AREA_IS_HIDDEN) { continue; } + + if (area->v1->vec.y > window_rect->ymin) { + height += U.pixelsize; + } + if (area->v2->vec.y < (window_rect->ymax - 1)) { + height += U.pixelsize; + } + /* width */ area->v1->vec.x = area->v2->vec.x = window_rect->xmin; area->v3->vec.x = area->v4->vec.x = window_rect->xmax - 1; /* height */ area->v1->vec.y = area->v4->vec.y = window_rect->ymin; area->v2->vec.y = area->v3->vec.y = window_rect->ymax - 1; + switch (area->global->align) { case GLOBAL_AREA_ALIGN_TOP: - area->v1->vec.y = area->v4->vec.y = area->v2->vec.y - ED_area_global_size_y(area); + area->v1->vec.y = area->v4->vec.y = area->v2->vec.y - height; break; case GLOBAL_AREA_ALIGN_BOTTOM: - area->v2->vec.y = area->v3->vec.y = area->v1->vec.y + ED_area_global_size_y(area); + area->v2->vec.y = area->v3->vec.y = area->v1->vec.y + height; break; } } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index e4de87e0b46..9c27bda5ec8 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1235,8 +1235,8 @@ static void area_move_set_limits( if (use_bigger_smaller_snap != NULL) { *use_bigger_smaller_snap = false; for (ScrArea *area = win->global_areas.areabase.first; area; area = area->next) { - const int size_min = round_fl_to_int(area->global->size_min * UI_DPI_FAC); - const int size_max = round_fl_to_int(area->global->size_max * UI_DPI_FAC); + const int size_min = ED_area_global_min_size_y(area) - 1; + const int size_max = ED_area_global_max_size_y(area) - 1; /* logic here is only tested for lower edge :) */ /* left edge */ diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 7ca51724268..43231855162 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -2013,22 +2013,37 @@ void WM_window_rect_calc(const wmWindow *win, rcti *r_rect) */ void WM_window_screen_rect_calc(const wmWindow *win, rcti *r_rect) { - rcti rect; + rcti window_rect, screen_rect; - BLI_rcti_init(&rect, 0, WM_window_pixels_x(win), 0, WM_window_pixels_y(win)); + WM_window_rect_calc(win, &window_rect); + screen_rect = window_rect; /* Substract global areas from screen rectangle. */ for (ScrArea *global_area = win->global_areas.areabase.first; global_area; global_area = global_area->next) { + int height = ED_area_global_size_y(global_area) - 1; + if (global_area->global->flag & GLOBAL_AREA_IS_HIDDEN) { continue; } switch (global_area->global->align) { case GLOBAL_AREA_ALIGN_TOP: - rect.ymax -= ED_area_global_size_y(global_area); + if ((screen_rect.ymax - height) > window_rect.ymin) { + height += U.pixelsize; + } + if (screen_rect.ymax < (window_rect.ymax - 1)) { + height += U.pixelsize; + } + screen_rect.ymax -= height; break; case GLOBAL_AREA_ALIGN_BOTTOM: - rect.ymin += ED_area_global_size_y(global_area); + if (screen_rect.ymin > window_rect.ymin) { + height += U.pixelsize; + } + if ((screen_rect.ymin + height) < (window_rect.ymax - 1)) { + height += U.pixelsize; + } + screen_rect.ymin += height; break; default: BLI_assert(0); @@ -2036,9 +2051,9 @@ void WM_window_screen_rect_calc(const wmWindow *win, rcti *r_rect) } } - BLI_assert(rect.xmin < rect.xmax); - BLI_assert(rect.ymin < rect.ymax); - *r_rect = rect; + BLI_assert(screen_rect.xmin < screen_rect.xmax); + BLI_assert(screen_rect.ymin < screen_rect.ymax); + *r_rect = screen_rect; } bool WM_window_is_fullscreen(wmWindow *win) |