short-circuit the "only one xinerama" case, and use outer rect of window

2002-06-08  Havoc Pennington  <hp@pobox.com>

	* src/screen.c (meta_screen_get_xinerama_for_window):
	short-circuit the "only one xinerama" case, and use outer rect of
	window instead of window->rect, so we get root window coords.

	* src/theme.c (meta_frame_layout_get_borders): if fullscreen all
	frame edges are zero-width.

	* src/frame.c (meta_frame_get_flags): init fullscreen flag.

	* src/common.h (enum): add META_FRAME_FULLSCREEN frame flag

	* src/place.c: fix up calls to meta_window_get_work_area

	* src/window.c (meta_window_get_work_area): add an arg for whether
	the work area is for the screen or the xinerama subscreen.
	(constrain_position): fix up calls to meta_window_get_work_area
	(constrain_size): ditto

	* src/screen.c (meta_screen_new): add METACITY_DEBUG_XINERAMA
	environment variable which simulates xinerama on a single head.
This commit is contained in:
Havoc Pennington 2002-06-08 06:07:21 +00:00 committed by Havoc Pennington
parent 9e8800561e
commit 2b780e5486
8 changed files with 117 additions and 33 deletions

View File

@ -1,3 +1,26 @@
2002-06-08 Havoc Pennington <hp@pobox.com>
* src/screen.c (meta_screen_get_xinerama_for_window):
short-circuit the "only one xinerama" case, and use outer rect of
window instead of window->rect, so we get root window coords.
* src/theme.c (meta_frame_layout_get_borders): if fullscreen all
frame edges are zero-width.
* src/frame.c (meta_frame_get_flags): init fullscreen flag.
* src/common.h (enum): add META_FRAME_FULLSCREEN frame flag
* src/place.c: fix up calls to meta_window_get_work_area
* src/window.c (meta_window_get_work_area): add an arg for whether
the work area is for the screen or the xinerama subscreen.
(constrain_position): fix up calls to meta_window_get_work_area
(constrain_size): ditto
* src/screen.c (meta_screen_new): add METACITY_DEBUG_XINERAMA
environment variable which simulates xinerama on a single head.
2002-06-08 Havoc Pennington <hp@pobox.com> 2002-06-08 Havoc Pennington <hp@pobox.com>
* src/window.c (update_struts): only invalidate things if the * src/window.c (update_struts): only invalidate things if the

View File

@ -41,7 +41,8 @@ typedef enum
META_FRAME_STUCK = 1 << 8, META_FRAME_STUCK = 1 << 8,
META_FRAME_MAXIMIZED = 1 << 9, META_FRAME_MAXIMIZED = 1 << 9,
META_FRAME_ALLOWS_SHADE = 1 << 10, META_FRAME_ALLOWS_SHADE = 1 << 10,
META_FRAME_ALLOWS_MOVE = 1 << 11 META_FRAME_ALLOWS_MOVE = 1 << 11,
META_FRAME_FULLSCREEN = 1 << 12
} MetaFrameFlags; } MetaFrameFlags;
typedef enum typedef enum

View File

@ -246,6 +246,9 @@ meta_frame_get_flags (MetaFrame *frame)
if (frame->window->maximized) if (frame->window->maximized)
flags |= META_FRAME_MAXIMIZED; flags |= META_FRAME_MAXIMIZED;
if (frame->window->fullscreen)
flags |= META_FRAME_FULLSCREEN;
return flags; return flags;
} }

View File

@ -103,7 +103,7 @@ find_next_cascade (MetaWindow *window,
* 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.
*/ */
meta_window_get_work_area (window, &work_area); meta_window_get_work_area (window, TRUE, &work_area);
cascade_x = MAX (0, work_area.x); cascade_x = MAX (0, work_area.x);
cascade_y = MAX (0, work_area.y); cascade_y = MAX (0, work_area.y);
@ -215,7 +215,7 @@ constrain_placement (MetaWindow *window,
MetaRectangle work_area; MetaRectangle work_area;
int nw_x, nw_y; int nw_x, nw_y;
meta_window_get_work_area (window, &work_area); meta_window_get_work_area (window, TRUE, &work_area);
nw_x = work_area.x; nw_x = work_area.x;
nw_y = work_area.y; nw_y = work_area.y;
@ -561,7 +561,7 @@ get_vertical_edges (MetaWindow *window,
edges = g_new (int, n_edges); edges = g_new (int, n_edges);
/* workspace/screen edges */ /* workspace/screen edges */
meta_window_get_work_area (window, &work_area); meta_window_get_work_area (window, FALSE, &work_area);
edges[i] = work_area.x; edges[i] = work_area.x;
++i; ++i;
@ -634,7 +634,7 @@ get_horizontal_edges (MetaWindow *window,
edges = g_new (int, n_edges); edges = g_new (int, n_edges);
/* workspace/screen edges */ /* workspace/screen edges */
meta_window_get_work_area (window, &work_area); meta_window_get_work_area (window, FALSE, &work_area);
edges[i] = work_area.y; edges[i] = work_area.y;
++i; ++i;

View File

@ -293,6 +293,28 @@ meta_screen_new (MetaDisplay *display,
* we can use the field unconditionally * we can use the field unconditionally
*/ */
if (screen->n_xinerama_infos == 0) if (screen->n_xinerama_infos == 0)
{
if (g_getenv ("METACITY_DEBUG_XINERAMA"))
{
meta_topic (META_DEBUG_XINERAMA,
"Pretending a single monitor has two Xinerama screens\n");
screen->xinerama_infos = g_new (MetaXineramaScreenInfo, 2);
screen->n_xinerama_infos = 2;
screen->xinerama_infos[0].number = 0;
screen->xinerama_infos[0].x_origin = 0;
screen->xinerama_infos[0].y_origin = 0;
screen->xinerama_infos[0].width = screen->width / 2;
screen->xinerama_infos[0].height = screen->height;
screen->xinerama_infos[1].number = 1;
screen->xinerama_infos[1].x_origin = screen->width / 2;
screen->xinerama_infos[1].y_origin = 0;
screen->xinerama_infos[1].width = screen->width / 2 + screen->width % 2;
screen->xinerama_infos[1].height = screen->height;
}
else
{ {
meta_topic (META_DEBUG_XINERAMA, meta_topic (META_DEBUG_XINERAMA,
"No Xinerama screens, using default screen info\n"); "No Xinerama screens, using default screen info\n");
@ -306,6 +328,7 @@ meta_screen_new (MetaDisplay *display,
screen->xinerama_infos[0].width = screen->width; screen->xinerama_infos[0].width = screen->width;
screen->xinerama_infos[0].height = screen->height; screen->xinerama_infos[0].height = screen->height;
} }
}
g_assert (screen->n_xinerama_infos > 0); g_assert (screen->n_xinerama_infos > 0);
g_assert (screen->xinerama_infos != NULL); g_assert (screen->xinerama_infos != NULL);
@ -812,6 +835,12 @@ meta_screen_get_xinerama_for_window (MetaScreen *screen,
{ {
int i; int i;
int best_xinerama, xinerama_score; int best_xinerama, xinerama_score;
MetaRectangle window_rect;
if (screen->n_xinerama_infos == 1)
return &screen->xinerama_infos[0];
meta_window_get_outer_rect (window, &window_rect);
best_xinerama = 0; best_xinerama = 0;
xinerama_score = 0; xinerama_score = 0;
@ -826,7 +855,7 @@ meta_screen_get_xinerama_for_window (MetaScreen *screen,
screen_info.width = screen->xinerama_infos[i].width; screen_info.width = screen->xinerama_infos[i].width;
screen_info.height = screen->xinerama_infos[i].height; screen_info.height = screen->xinerama_infos[i].height;
if (meta_rectangle_intersect (&screen_info, &window->rect, &dest)) if (meta_rectangle_intersect (&screen_info, &window_rect, &dest))
{ {
if (dest.width * dest.height > xinerama_score) if (dest.width * dest.height > xinerama_score)
{ {

View File

@ -376,6 +376,18 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
else else
*bottom_height = layout->bottom_height; *bottom_height = layout->bottom_height;
} }
if (flags & META_FRAME_FULLSCREEN)
{
if (top_height)
*top_height = 0;
if (bottom_height)
*bottom_height = 0;
if (left_width)
*left_width = 0;
if (right_width)
*right_width = 0;
}
} }
void void

View File

@ -4983,7 +4983,7 @@ constrain_size (MetaWindow *window,
#define FLOOR(value, base) ( ((int) ((value) / (base))) * (base) ) #define FLOOR(value, base) ( ((int) ((value) / (base))) * (base) )
meta_window_get_work_area (window, &work_area); meta_window_get_work_area (window, TRUE, &work_area);
/* Get the allowed size ranges, considering maximized, etc. */ /* Get the allowed size ranges, considering maximized, etc. */
if (window->fullscreen) if (window->fullscreen)
@ -5113,10 +5113,6 @@ constrain_position (MetaWindow *window,
int *new_x, int *new_x,
int *new_y) int *new_y)
{ {
MetaRectangle work_area;
meta_window_get_work_area (window, &work_area);
/* frame member variables should NEVER be used in here, only /* frame member variables should NEVER be used in here, only
* MetaFrameGeometry * MetaFrameGeometry
*/ */
@ -5160,6 +5156,10 @@ constrain_position (MetaWindow *window,
} }
else if (window->maximized) else if (window->maximized)
{ {
MetaRectangle work_area;
meta_window_get_work_area (window, TRUE, &work_area);
x = work_area.x; x = work_area.x;
y = work_area.y; y = work_area.y;
if (window->frame) if (window->frame)
@ -5183,6 +5183,9 @@ constrain_position (MetaWindow *window,
int nw_x, nw_y; int nw_x, nw_y;
int se_x, se_y; int se_x, se_y;
int offscreen_w, offscreen_h; int offscreen_w, offscreen_h;
MetaRectangle work_area;
meta_window_get_work_area (window, FALSE, &work_area);
/* (FIXME instead of TITLEBAR_LENGTH_ONSCREEN, get the actual /* (FIXME instead of TITLEBAR_LENGTH_ONSCREEN, get the actual
* size of the menu control?). * size of the menu control?).
@ -5676,17 +5679,21 @@ meta_window_set_gravity (MetaWindow *window,
void void
meta_window_get_work_area (MetaWindow *window, meta_window_get_work_area (MetaWindow *window,
gboolean for_current_xinerama,
MetaRectangle *area) MetaRectangle *area)
{ {
MetaRectangle space_area; MetaRectangle space_area;
GList *tmp; GList *tmp;
const MetaXineramaScreenInfo *xinerama;
int left_strut; int left_strut;
int right_strut; int right_strut;
int top_strut; int top_strut;
int bottom_strut; int bottom_strut;
if (for_current_xinerama)
{
const MetaXineramaScreenInfo *xinerama;
xinerama = meta_screen_get_xinerama_for_window (window->screen, xinerama = meta_screen_get_xinerama_for_window (window->screen,
window); window);
@ -5694,6 +5701,14 @@ meta_window_get_work_area (MetaWindow *window,
right_strut = window->screen->width - xinerama->width - xinerama->x_origin; right_strut = window->screen->width - xinerama->width - xinerama->x_origin;
top_strut = xinerama->y_origin; top_strut = xinerama->y_origin;
bottom_strut = window->screen->height - xinerama->height - xinerama->y_origin; bottom_strut = window->screen->height - xinerama->height - xinerama->y_origin;
}
else
{
left_strut = 0;
right_strut = 0;
top_strut = 0;
bottom_strut = 0;
}
tmp = meta_window_get_workspaces (window); tmp = meta_window_get_workspaces (window);

View File

@ -372,6 +372,7 @@ gboolean meta_window_visible_on_workspace (MetaWindow *window,
/* Get minimum work area for all workspaces we're on */ /* Get minimum work area for all workspaces we're on */
void meta_window_get_work_area (MetaWindow *window, void meta_window_get_work_area (MetaWindow *window,
gboolean for_current_xinerama,
MetaRectangle *area); MetaRectangle *area);
gboolean meta_window_same_application (MetaWindow *window, gboolean meta_window_same_application (MetaWindow *window,