mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
Avoid some crashes when dragging windows partially offscreen. Possible (or
2007-04-03 Elijah Newren <newren gmail com> Avoid some crashes when dragging windows partially offscreen. Possible (or at least partial) fix for #353513. * src/edge-resistance.c (apply_edge_resistance): be more careful about calls to find_index_of_edge_near_position() returning possibly invalid indices. Also, add a warning comment to find_index_of_edge_near_position(). svn path=/trunk/; revision=3147
This commit is contained in:
parent
930c7ea270
commit
350225ea37
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
||||
2007-04-03 Elijah Newren <newren gmail com>
|
||||
|
||||
Avoid some crashes when dragging windows partially offscreen.
|
||||
Possible (or at least partial) fix for #353513.
|
||||
|
||||
* src/edge-resistance.c (apply_edge_resistance): be more careful
|
||||
about calls to find_index_of_edge_near_position() returning
|
||||
possibly invalid indices. Also, add a warning comment to
|
||||
find_index_of_edge_near_position().
|
||||
|
||||
2007-04-03 Elijah Newren <newren gmail com>
|
||||
|
||||
Patch from Carlo Wood to do some miscellaneous code cleanups found
|
||||
|
@ -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) ||
|
||||
|
Loading…
Reference in New Issue
Block a user