try extra cascades alongside the first, if the first fails; patch from

2002-10-01  Havoc Pennington  <hp@pobox.com>

	* src/place.c (find_next_cascade): try extra cascades alongside
	the first, if the first fails; patch from readams@hmc.edu
This commit is contained in:
Havoc Pennington 2002-10-02 02:42:24 +00:00 committed by Havoc Pennington
parent f4920a9249
commit ba9d2d1a71
2 changed files with 61 additions and 32 deletions

View File

@ -1,3 +1,8 @@
2002-10-01 Havoc Pennington <hp@pobox.com>
* src/place.c (find_next_cascade): try extra cascades alongside
the first, if the first fails; patch from readams@hmc.edu
2002-10-01 Havoc Pennington <hp@pobox.com> 2002-10-01 Havoc Pennington <hp@pobox.com>
* src/stack.c (get_standalone_layer): put ABOVE windows in same * src/stack.c (get_standalone_layer): put ABOVE windows in same

View File

@ -88,6 +88,8 @@ find_next_cascade (MetaWindow *window,
GList *sorted; GList *sorted;
int cascade_x, cascade_y; int cascade_x, cascade_y;
int x_threshold, y_threshold; int x_threshold, y_threshold;
int window_width, window_height;
int cascade_stage;
MetaRectangle work_area; MetaRectangle work_area;
sorted = g_list_copy (windows); sorted = g_list_copy (windows);
@ -99,10 +101,26 @@ find_next_cascade (MetaWindow *window,
* position, we move on. * position, we move on.
*/ */
/* arbitrary-ish threshold, honors user attempts to
* manually cascade.
*/
#define CASCADE_FUZZ 15
if (fgeom)
{
x_threshold = MAX (fgeom->left_width, CASCADE_FUZZ);
y_threshold = MAX (fgeom->top_height, CASCADE_FUZZ);
}
else
{
x_threshold = CASCADE_FUZZ;
y_threshold = CASCADE_FUZZ;
}
/* Find furthest-SE origin of all workspaces. /* Find furthest-SE origin of all workspaces.
* cascade_x, cascade_y are the target position * cascade_x, cascade_y are the target position
* of NW corner of window frame. * of NW corner of window frame.
*/ */
/* FIXME this is bogus because we get the current xinerama /* FIXME this is bogus because we get the current xinerama
* for the window based on its position, but we haven't * for the window based on its position, but we haven't
* placed it yet. * placed it yet.
@ -114,20 +132,10 @@ find_next_cascade (MetaWindow *window,
/* Find first cascade position that's not used. */ /* Find first cascade position that's not used. */
/* arbitrary-ish threshold, honors user attempts to window_width = window->frame ? window->frame->rect.width : window->rect.width;
* manually cascade. window_height = window->frame ? window->frame->rect.height : window->rect.height;
*/
if (fgeom)
{
x_threshold = MAX (fgeom->left_width, 15);
y_threshold = MAX (fgeom->top_height, 15);
}
else
{
x_threshold = 15;
y_threshold = 15;
}
cascade_stage = 0;
tmp = sorted; tmp = sorted;
while (tmp != NULL) while (tmp != NULL)
{ {
@ -158,6 +166,36 @@ find_next_cascade (MetaWindow *window,
meta_window_get_position (w, &wx, &wy); meta_window_get_position (w, &wx, &wy);
cascade_x = wx; cascade_x = wx;
cascade_y = wy; cascade_y = wy;
/* If we go off the screen, start over with a new cascade */
if (((cascade_x + window_width) >
(work_area.x + work_area.width)) ||
((cascade_y + window_height) >
(work_area.y + work_area.height)))
{
cascade_x = MAX (0, work_area.x);
cascade_y = MAX (0, work_area.y);
#define CASCADE_INTERVAL 50 /* space between top-left corners of cascades */
cascade_stage += 1;
cascade_x += CASCADE_INTERVAL * cascade_stage;
/* start over with a new cascade translated to the right, unless
* we are out of space
*/
if ((cascade_x + window_width) <
(work_area.x + work_area.width))
{
tmp = sorted;
continue;
}
else
{
/* All out of space, this cascade_x won't work */
cascade_x = MAX (0, work_area.x);
break;
}
}
} }
else else
{ {
@ -173,20 +211,6 @@ find_next_cascade (MetaWindow *window,
g_list_free (sorted); g_list_free (sorted);
/* don't place windows off the screen */
if (((cascade_x + (window->frame ? window->frame->rect.width : window->rect.width)) >
(work_area.x + work_area.width)) ||
((cascade_y + (window->frame ? window->frame->rect.height : window->rect.height)) >
(work_area.y + work_area.height)))
{
/* FIXME it would be better to try to start a new cascade to the
* right of the last one, probably. Instead of just falling back
* to "origin"
*/
cascade_x = MAX (0, work_area.x);
cascade_y = MAX (0, work_area.y);
}
/* Convert coords to position of window, not position of frame. */ /* Convert coords to position of window, not position of frame. */
if (fgeom == NULL) if (fgeom == NULL)
{ {