Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/include/ED_screen.h2
-rw-r--r--source/blender/editors/screen/area.c10
-rw-r--r--source/blender/editors/screen/screen_edit.c17
-rw-r--r--source/blender/editors/screen/screen_ops.c4
-rw-r--r--source/blender/windowmanager/intern/wm_window.c29
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)