summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2006-01-10 04:57:51 +0000
committerElijah Newren <newren@src.gnome.org>2006-01-10 04:57:51 +0000
commitd884f9ce8a254bbfb5ee7c7d91be5ae1dacd295e (patch)
tree81974c3dcb8e5adcdfa8ca4d038f60f66237fed1 /src
parentee54debd6aa1a081e8e08db464ed2a615d5bb045 (diff)
downloadmetacity-d884f9ce8a254bbfb5ee7c7d91be5ae1dacd295e.tar.gz
Be more strict about what is considered a valid region with partial
2006-01-09 Elijah Newren <newren@gmail.com> Be more strict about what is considered a valid region with partial struts. Fixes #322070. * src/boxes.[ch]: (meta_rectangle_expand_region_conditionally): new function behaving like meta_rectangle_expand_region() but which only does so when the width and height of the rectangles meet a certain threshold (replace_rect_with_list): Remove a compiling warning * src/constraints.c: (constrain_partially_onscreen): provide minimum thresholds in each direction for the size of the rectangles to avoid cases where only a single pixel thick layer of a window might be showing
Diffstat (limited to 'src')
-rw-r--r--src/boxes.c36
-rw-r--r--src/boxes.h12
-rw-r--r--src/constraints.c49
3 files changed, 70 insertions, 27 deletions
diff --git a/src/boxes.c b/src/boxes.c
index 33255337..d0d1c685 100644
--- a/src/boxes.c
+++ b/src/boxes.c
@@ -622,15 +622,38 @@ meta_rectangle_expand_region (GList *region,
const int top_expand,
const int bottom_expand)
{
- /* Now it's time to do the directional expansion */
+ return meta_rectangle_expand_region_conditionally (region,
+ left_expand,
+ right_expand,
+ top_expand,
+ bottom_expand,
+ 0,
+ 0);
+}
+
+GList*
+meta_rectangle_expand_region_conditionally (GList *region,
+ const int left_expand,
+ const int right_expand,
+ const int top_expand,
+ const int bottom_expand,
+ const int min_x,
+ const int min_y)
+{
GList *tmp_list = region;
while (tmp_list)
{
MetaRectangle *rect = (MetaRectangle*) tmp_list->data;
- rect->x -= left_expand;
- rect->width += (left_expand + right_expand);
- rect->y -= top_expand;
- rect->height += (top_expand + bottom_expand);
+ if (rect->width >= min_x)
+ {
+ rect->x -= left_expand;
+ rect->width += (left_expand + right_expand);
+ }
+ if (rect->height >= min_y)
+ {
+ rect->y -= top_expand;
+ rect->height += (top_expand + bottom_expand);
+ }
tmp_list = tmp_list->next;
}
@@ -1091,8 +1114,7 @@ replace_rect_with_list (GList *old_element,
if (!new_list)
{
/* If there is no new list, just remove the old_element */
- ret = old_element->next;
- g_list_remove_link (old_element, old_element);
+ ret = g_list_remove_link (old_element, old_element);
}
else
{
diff --git a/src/boxes.h b/src/boxes.h
index d60358ec..86a2b1dc 100644
--- a/src/boxes.h
+++ b/src/boxes.h
@@ -146,11 +146,23 @@ GList* meta_rectangle_get_minimal_spanning_set_for_region (
const MetaRectangle *basic_rect,
const GSList *all_struts);
+/* Expand all rectangles in region by the given amount on each side */
GList* meta_rectangle_expand_region (GList *region,
const int left_expand,
const int right_expand,
const int top_expand,
const int bottom_expand);
+/* Same as for meta_rectangle_expand_region except that rectangles not at
+ * least min_x or min_y in size are not expanded in that direction
+ */
+GList* meta_rectangle_expand_region_conditionally (
+ GList *region,
+ const int left_expand,
+ const int right_expand,
+ const int top_expand,
+ const int bottom_expand,
+ const int min_x,
+ const int min_y);
/* Free the list created by
* meta_rectangle_get_minimal_spanning_set_for_region()
diff --git a/src/constraints.c b/src/constraints.c
index 22af9e2f..be04bcb1 100644
--- a/src/constraints.c
+++ b/src/constraints.c
@@ -1046,7 +1046,9 @@ constrain_partially_onscreen (MetaWindow *window,
gboolean check_only)
{
gboolean retval;
- int top_amount, bottom_amount, horiz_amount, vert_amount;
+ int top_amount, bottom_amount;
+ int horiz_amount_offscreen, vert_amount_offscreen;
+ int horiz_amount_onscreen, vert_amount_onscreen;
if (priority > PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA)
return TRUE;
@@ -1066,39 +1068,46 @@ constrain_partially_onscreen (MetaWindow *window,
* Then, the amount that is allowed off is just the window size minus
* this amount.
*/
- horiz_amount = info->current.width / 4;
- vert_amount = info->current.height / 4;
- horiz_amount = CLAMP (horiz_amount, 10, 75);
- vert_amount = CLAMP (vert_amount, 10, 75);
- horiz_amount = info->current.width - horiz_amount;
- vert_amount = info->current.height - vert_amount;
- top_amount = vert_amount;
+ horiz_amount_onscreen = info->current.width / 4;
+ vert_amount_onscreen = info->current.height / 4;
+ horiz_amount_onscreen = CLAMP (horiz_amount_onscreen, 10, 75);
+ vert_amount_onscreen = CLAMP (vert_amount_onscreen, 10, 75);
+ horiz_amount_offscreen = info->current.width - horiz_amount_onscreen;
+ vert_amount_offscreen = info->current.height - vert_amount_onscreen;
+ top_amount = vert_amount_offscreen;
/* Allow the titlebar to touch the bottom panel; If there is no titlebar,
* require vert_amount to remain on the screen.
*/
if (window->frame)
- bottom_amount = info->current.height + info->fgeom->bottom_height;
+ {
+ bottom_amount = info->current.height + info->fgeom->bottom_height;
+ vert_amount_onscreen = info->fgeom->top_height;
+ }
else
- bottom_amount = vert_amount;
+ bottom_amount = vert_amount_offscreen;
/* Extend the region, have a helper function handle the constraint,
* then return the region to its original size.
*/
- meta_rectangle_expand_region (info->usable_screen_region,
- horiz_amount,
- horiz_amount,
- top_amount,
- bottom_amount);
+ meta_rectangle_expand_region_conditionally (info->usable_screen_region,
+ horiz_amount_offscreen,
+ horiz_amount_offscreen,
+ top_amount,
+ bottom_amount,
+ horiz_amount_onscreen,
+ vert_amount_onscreen);
retval =
do_screen_and_xinerama_relative_constraints (window,
info->usable_screen_region,
info,
check_only);
- meta_rectangle_expand_region (info->usable_screen_region,
- -horiz_amount,
- -horiz_amount,
- -top_amount,
- -bottom_amount);
+ meta_rectangle_expand_region_conditionally (info->usable_screen_region,
+ -horiz_amount_offscreen,
+ -horiz_amount_offscreen,
+ -top_amount,
+ -bottom_amount,
+ horiz_amount_onscreen,
+ vert_amount_onscreen);
return retval;
}