Hi, intrigeri wrote (03 Jan 2011 18:25:03 GMT) : > Oleg Matviychuk wrote (20 Mar 2009 20:53:31 GMT) : >> I can confirm such behaviour on Lenny. > Same here, also confirmed on Squeeze. > [...] > Matthew Martin's patch[0], attached to another related upstream GNOME > bug[1], fixes this bug.
Tails has been shipping a patched metacity for more than 2 years now, without running into any problem, so it's quite clear this patch does the right thing. The attached patch is Matthew's one, refreshed to apply cleanly against metacity 1:2.34.3-2 -- and it still fixes this bug. I'm going to submit this refreshed version to the GNOME bts right now, but I'm not convinced it will be granted more attention than what we've seen in the past. Therefore, please consider applying this patch to the Debian package. Cheers, -- intrigeri | GnuPG key @ https://gaffer.ptitcanardnoir.org/intrigeri/intrigeri.asc | OTR fingerprint @ https://gaffer.ptitcanardnoir.org/intrigeri/otr.asc
--- a/src/core/window.c +++ b/src/core/window.c @@ -2045,6 +2045,10 @@ windows_overlap (const MetaWindow *w1, const MetaWindow *w2) { MetaRectangle w1rect, w2rect; + + if (w1->minimized || w2->minimized) + return FALSE; + meta_window_get_outer_rect (w1, &w1rect); meta_window_get_outer_rect (w2, &w2rect); return meta_rectangle_overlap (&w1rect, &w2rect); @@ -2099,6 +2103,7 @@ gboolean takes_focus_on_map; gboolean place_on_top_on_map; gboolean needs_stacking_adjustment; + gboolean will_be_covered; MetaWindow *focus_window; guint32 timestamp; @@ -2116,6 +2121,7 @@ did_show = FALSE; window_state_on_map (window, &takes_focus_on_map, &place_on_top_on_map); needs_stacking_adjustment = FALSE; + will_be_covered = window_would_be_covered (window); meta_topic (META_DEBUG_WINDOW_STATE, "Window %s %s focus on map, and %s place on top on map.\n", @@ -2136,7 +2142,7 @@ if ( focus_window != NULL && window->showing_for_first_time && ( (!place_on_top_on_map && !takes_focus_on_map) || - window_would_be_covered (window) ) + will_be_covered ) ) { if (meta_window_is_ancestor_of_transient (focus_window, window)) { @@ -2220,21 +2226,21 @@ * in the stack when it doesn't overlap it confusingly places * that new window below a lot of other windows. */ - if (overlap || + if (!will_be_covered && (overlap || (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK && - meta_prefs_get_raise_on_click ())) + meta_prefs_get_raise_on_click ()))) meta_window_stack_just_below (window, focus_window); - /* If the window will be obscured by the focus window, then the - * user might not notice the window appearing so set the - * demands attention hint. + /* If the window will be obscured by the focus window or a window set to + * always on top, then the user might not notice the window appearing so + * set the demands attention hint. * * We set the hint ourselves rather than calling * meta_window_set_demands_attention() because that would cause * a recalculation of overlap, and a call to set_net_wm_state() * which we are going to call ourselves here a few lines down. */ - if (overlap) + if (overlap || will_be_covered) window->wm_state_demands_attention = TRUE; }