window: Add a meta_window_get_titlebar_rect
This commit is contained in:
parent
0890eaa3fe
commit
3a0af0faae
@ -637,13 +637,10 @@ update_onscreen_requirements (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->frame && window->decorated)
|
if (window->frame && window->decorated)
|
||||||
{
|
{
|
||||||
MetaFrameBorders borders;
|
|
||||||
MetaRectangle titlebar_rect;
|
MetaRectangle titlebar_rect;
|
||||||
|
|
||||||
meta_frame_calc_borders (window->frame, &borders);
|
meta_window_get_titlebar_rect (window, &titlebar_rect);
|
||||||
|
|
||||||
titlebar_rect = info->current;
|
|
||||||
titlebar_rect.height = borders.visible.top;
|
|
||||||
old = window->require_titlebar_visible;
|
old = window->require_titlebar_visible;
|
||||||
window->require_titlebar_visible =
|
window->require_titlebar_visible =
|
||||||
meta_rectangle_overlaps_with_region (info->usable_screen_region,
|
meta_rectangle_overlaps_with_region (info->usable_screen_region,
|
||||||
|
@ -82,6 +82,7 @@ find_next_cascade (MetaWindow *window,
|
|||||||
GList *tmp;
|
GList *tmp;
|
||||||
GList *sorted;
|
GList *sorted;
|
||||||
int cascade_x, cascade_y;
|
int cascade_x, cascade_y;
|
||||||
|
MetaRectangle titlebar_rect;
|
||||||
int x_threshold, y_threshold;
|
int x_threshold, y_threshold;
|
||||||
MetaRectangle frame_rect;
|
MetaRectangle frame_rect;
|
||||||
int window_width, window_height;
|
int window_width, window_height;
|
||||||
@ -102,19 +103,9 @@ find_next_cascade (MetaWindow *window,
|
|||||||
* manually cascade.
|
* manually cascade.
|
||||||
*/
|
*/
|
||||||
#define CASCADE_FUZZ 15
|
#define CASCADE_FUZZ 15
|
||||||
if (window->frame)
|
meta_window_get_titlebar_rect (window, &titlebar_rect);
|
||||||
{
|
x_threshold = MAX (titlebar_rect.x, CASCADE_FUZZ);
|
||||||
MetaFrameBorders borders;
|
y_threshold = MAX (titlebar_rect.y, CASCADE_FUZZ);
|
||||||
|
|
||||||
meta_frame_calc_borders (window->frame, &borders);
|
|
||||||
x_threshold = MAX (borders.visible.left, CASCADE_FUZZ);
|
|
||||||
y_threshold = MAX (borders.visible.top, 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
|
||||||
@ -151,13 +142,11 @@ find_next_cascade (MetaWindow *window,
|
|||||||
if (ABS (wx - cascade_x) < x_threshold &&
|
if (ABS (wx - cascade_x) < x_threshold &&
|
||||||
ABS (wy - cascade_y) < y_threshold)
|
ABS (wy - cascade_y) < y_threshold)
|
||||||
{
|
{
|
||||||
/* This window is "in the way", move to next cascade
|
meta_window_get_titlebar_rect (w, &titlebar_rect);
|
||||||
* point. The new window frame should go at the origin
|
|
||||||
* of the client window we're stacking above.
|
/* Cascade the window evenly by the titlebar height; this isn't a typo. */
|
||||||
*/
|
cascade_x = wx + titlebar_rect.height;
|
||||||
meta_window_get_position (w, &wx, &wy);
|
cascade_y = wy + titlebar_rect.height;
|
||||||
cascade_x = wx;
|
|
||||||
cascade_y = wy;
|
|
||||||
|
|
||||||
/* If we go off the screen, start over with a new cascade */
|
/* If we go off the screen, start over with a new cascade */
|
||||||
if (((cascade_x + window_width) >
|
if (((cascade_x + window_width) >
|
||||||
|
@ -703,6 +703,8 @@ Window meta_window_get_toplevel_xwindow (MetaWindow *window);
|
|||||||
|
|
||||||
void meta_window_get_client_area_rect (const MetaWindow *window,
|
void meta_window_get_client_area_rect (const MetaWindow *window,
|
||||||
cairo_rectangle_int_t *rect);
|
cairo_rectangle_int_t *rect);
|
||||||
|
void meta_window_get_titlebar_rect (MetaWindow *window,
|
||||||
|
MetaRectangle *titlebar_rect);
|
||||||
|
|
||||||
void meta_window_activate_full (MetaWindow *window,
|
void meta_window_activate_full (MetaWindow *window,
|
||||||
guint32 timestamp,
|
guint32 timestamp,
|
||||||
|
@ -4310,6 +4310,28 @@ meta_window_get_client_area_rect (const MetaWindow *window,
|
|||||||
rect->height = window->rect.height;
|
rect->height = window->rect.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_get_titlebar_rect (MetaWindow *window,
|
||||||
|
MetaRectangle *rect)
|
||||||
|
{
|
||||||
|
meta_window_get_frame_rect (window, rect);
|
||||||
|
|
||||||
|
/* The returned rectangle is relative to the frame rect. */
|
||||||
|
rect->x = 0;
|
||||||
|
rect->y = 0;
|
||||||
|
|
||||||
|
if (window->frame)
|
||||||
|
{
|
||||||
|
rect->height = window->frame->child_y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Pick an arbitrary height for a titlebar. We might want to
|
||||||
|
* eventually have CSD windows expose their borders to us. */
|
||||||
|
rect->height = 15;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const char*
|
const char*
|
||||||
meta_window_get_startup_id (MetaWindow *window)
|
meta_window_get_startup_id (MetaWindow *window)
|
||||||
{
|
{
|
||||||
@ -5381,8 +5403,7 @@ meta_window_titlebar_is_onscreen (MetaWindow *window)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* Get the rectangle corresponding to the titlebar */
|
/* Get the rectangle corresponding to the titlebar */
|
||||||
meta_window_get_frame_rect (window, &titlebar_rect);
|
meta_window_get_titlebar_rect (window, &titlebar_rect);
|
||||||
titlebar_rect.height = window->frame->child_y;
|
|
||||||
|
|
||||||
/* Run through the spanning rectangles for the screen and see if one of
|
/* Run through the spanning rectangles for the screen and see if one of
|
||||||
* them overlaps with the titlebar sufficiently to consider it onscreen.
|
* them overlaps with the titlebar sufficiently to consider it onscreen.
|
||||||
|
Loading…
Reference in New Issue
Block a user