diff --git a/ChangeLog b/ChangeLog index 4dc7b4df4..97e784f2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2002-06-08 Havoc Pennington + + * 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 * src/window.c (update_struts): only invalidate things if the diff --git a/src/common.h b/src/common.h index 4450d7129..f7143e8d9 100644 --- a/src/common.h +++ b/src/common.h @@ -41,7 +41,8 @@ typedef enum META_FRAME_STUCK = 1 << 8, META_FRAME_MAXIMIZED = 1 << 9, META_FRAME_ALLOWS_SHADE = 1 << 10, - META_FRAME_ALLOWS_MOVE = 1 << 11 + META_FRAME_ALLOWS_MOVE = 1 << 11, + META_FRAME_FULLSCREEN = 1 << 12 } MetaFrameFlags; typedef enum diff --git a/src/frame.c b/src/frame.c index 7b7b97380..b823973c7 100644 --- a/src/frame.c +++ b/src/frame.c @@ -244,7 +244,10 @@ meta_frame_get_flags (MetaFrame *frame) flags |= META_FRAME_STUCK; if (frame->window->maximized) - flags |= META_FRAME_MAXIMIZED; + flags |= META_FRAME_MAXIMIZED; + + if (frame->window->fullscreen) + flags |= META_FRAME_FULLSCREEN; return flags; } diff --git a/src/place.c b/src/place.c index 18d70ea06..f8ea82b4c 100644 --- a/src/place.c +++ b/src/place.c @@ -103,7 +103,7 @@ find_next_cascade (MetaWindow *window, * cascade_x, cascade_y are the target position * 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_y = MAX (0, work_area.y); @@ -215,7 +215,7 @@ constrain_placement (MetaWindow *window, MetaRectangle work_area; 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_y = work_area.y; @@ -561,7 +561,7 @@ get_vertical_edges (MetaWindow *window, edges = g_new (int, n_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; ++i; @@ -634,7 +634,7 @@ get_horizontal_edges (MetaWindow *window, edges = g_new (int, n_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; ++i; diff --git a/src/screen.c b/src/screen.c index 772a76a1c..7ba62856d 100644 --- a/src/screen.c +++ b/src/screen.c @@ -294,17 +294,40 @@ meta_screen_new (MetaDisplay *display, */ if (screen->n_xinerama_infos == 0) { - meta_topic (META_DEBUG_XINERAMA, - "No Xinerama screens, using default screen info\n"); - - screen->xinerama_infos = g_new (MetaXineramaScreenInfo, 1); - screen->n_xinerama_infos = 1; - - 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; - screen->xinerama_infos[0].height = screen->height; + 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, + "No Xinerama screens, using default screen info\n"); + + screen->xinerama_infos = g_new (MetaXineramaScreenInfo, 1); + screen->n_xinerama_infos = 1; + + 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; + screen->xinerama_infos[0].height = screen->height; + } } g_assert (screen->n_xinerama_infos > 0); @@ -812,7 +835,13 @@ meta_screen_get_xinerama_for_window (MetaScreen *screen, { int i; 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; 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.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) { diff --git a/src/theme.c b/src/theme.c index 7e09b9cc6..b96afa209 100644 --- a/src/theme.c +++ b/src/theme.c @@ -376,6 +376,18 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout, else *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 diff --git a/src/window.c b/src/window.c index ca26a2598..d9a238a7b 100644 --- a/src/window.c +++ b/src/window.c @@ -4983,7 +4983,7 @@ constrain_size (MetaWindow *window, #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. */ if (window->fullscreen) @@ -5112,11 +5112,7 @@ constrain_position (MetaWindow *window, int y, int *new_x, int *new_y) -{ - MetaRectangle work_area; - - meta_window_get_work_area (window, &work_area); - +{ /* frame member variables should NEVER be used in here, only * MetaFrameGeometry */ @@ -5160,6 +5156,10 @@ constrain_position (MetaWindow *window, } else if (window->maximized) { + MetaRectangle work_area; + + meta_window_get_work_area (window, TRUE, &work_area); + x = work_area.x; y = work_area.y; if (window->frame) @@ -5183,6 +5183,9 @@ constrain_position (MetaWindow *window, int nw_x, nw_y; int se_x, se_y; 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 * size of the menu control?). @@ -5676,25 +5679,37 @@ meta_window_set_gravity (MetaWindow *window, void meta_window_get_work_area (MetaWindow *window, + gboolean for_current_xinerama, MetaRectangle *area) { MetaRectangle space_area; GList *tmp; - const MetaXineramaScreenInfo *xinerama; int left_strut; int right_strut; int top_strut; int bottom_strut; - xinerama = meta_screen_get_xinerama_for_window (window->screen, - window); - - left_strut = xinerama->x_origin; - right_strut = window->screen->width - xinerama->width - xinerama->x_origin; - top_strut = xinerama->y_origin; - bottom_strut = window->screen->height - xinerama->height - xinerama->y_origin; - + if (for_current_xinerama) + { + const MetaXineramaScreenInfo *xinerama; + + xinerama = meta_screen_get_xinerama_for_window (window->screen, + window); + + left_strut = xinerama->x_origin; + right_strut = window->screen->width - xinerama->width - xinerama->x_origin; + top_strut = 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); while (tmp != NULL) diff --git a/src/window.h b/src/window.h index 7cbafd174..f5580ae29 100644 --- a/src/window.h +++ b/src/window.h @@ -372,6 +372,7 @@ gboolean meta_window_visible_on_workspace (MetaWindow *window, /* Get minimum work area for all workspaces we're on */ void meta_window_get_work_area (MetaWindow *window, + gboolean for_current_xinerama, MetaRectangle *area); gboolean meta_window_same_application (MetaWindow *window,