summaryrefslogtreecommitdiff
path: root/src/edge-resistance.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/edge-resistance.c')
-rw-r--r--src/edge-resistance.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/edge-resistance.c b/src/edge-resistance.c
index 68806648..d5c60112 100644
--- a/src/edge-resistance.c
+++ b/src/edge-resistance.c
@@ -62,6 +62,9 @@ struct MetaEdgeResistanceData
ResistanceDataForAnEdge bottom_data;
};
+/* !WARNING!: this function can return invalid indices (namely, either -1 or
+ * edges->len); this is by design, but you need to remember this.
+ */
static int
find_index_of_edge_near_position (const GArray *edges,
int position,
@@ -330,6 +333,7 @@ apply_edge_resistance (MetaWindow *window,
gboolean keyboard_op)
{
int i, begin, end;
+ int last_edge;
gboolean increasing = new_pos > old_pos;
int increment = increasing ? 1 : -1;
@@ -366,6 +370,13 @@ apply_edge_resistance (MetaWindow *window,
begin = find_index_of_edge_near_position (edges, old_pos, increasing, xdir);
end = find_index_of_edge_near_position (edges, new_pos, !increasing, xdir);
+ /* begin and end can be outside the array index, if the window is partially
+ * off the screen
+ */
+ last_edge = edges->len - 1;
+ begin = CLAMP (begin, 0, last_edge);
+ end = CLAMP (end, 0, last_edge);
+
/* Loop over all these edges we're moving past/to. */
i = begin;
while ((increasing && i <= end) ||