diff --git a/src/core/constraints.c b/src/core/constraints.c index 39a96eede..c3ad4741f 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -528,10 +528,11 @@ place_window_if_needed(MetaWindow *window, if (window->placed || did_placement) { if (window->maximize_horizontally_after_placement || - window->maximize_vertically_after_placement) + window->maximize_vertically_after_placement || + window->fullscreen_after_placement) { - /* define a sane saved_rect so that the user can unmaximize to - * something reasonable. + /* define a sane saved_rect so that the user can unmaximize or + * make unfullscreen to something reasonable. */ if (info->current.width >= info->work_area_monitor.width) { @@ -558,6 +559,15 @@ place_window_if_needed(MetaWindow *window, if (window->frame && !window->fullscreen) meta_frame_calc_geometry (window->frame, info->fgeom); + if (window->fullscreen_after_placement) + { + window->saved_rect = info->current; + window->fullscreen = TRUE; + window->fullscreen_after_placement = FALSE; + + g_object_notify (G_OBJECT (window), "fullscreen"); + } + window->maximize_horizontally_after_placement = FALSE; window->maximize_vertically_after_placement = FALSE; } diff --git a/src/core/window-private.h b/src/core/window-private.h index b2694a9e3..77759ecfb 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -133,6 +133,9 @@ struct _MetaWindow /* Whether the urgent flag of WM_HINTS is set */ guint wm_hints_urgent : 1; + /* Whether we have to fullscreen after placement */ + guint fullscreen_after_placement : 1; + /* Area to cover when in fullscreen mode. If _NET_WM_FULLSCREEN_MONITORS has * been overridden (via a client message), the window will cover the union of * these monitors. If not, this is the single monitor which the window's @@ -249,6 +252,9 @@ struct _MetaWindow /* Have we placed this window? */ guint placed : 1; + /* Must we force_save_user_window_placement? */ + guint force_save_user_rect : 1; + /* Is this not a transient of the focus window which is being denied focus? */ guint denied_focus_and_not_transient : 1; diff --git a/src/core/window-props.c b/src/core/window-props.c index 4d951194f..cfd9663e4 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -604,6 +604,7 @@ reload_net_wm_state (MetaWindow *window, window->shaded = FALSE; window->maximized_horizontally = FALSE; window->maximized_vertically = FALSE; + window->fullscreen = FALSE; window->wm_state_modal = FALSE; window->wm_state_skip_taskbar = FALSE; window->wm_state_skip_pager = FALSE; @@ -632,13 +633,7 @@ reload_net_wm_state (MetaWindow *window, else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_PAGER) window->wm_state_skip_pager = TRUE; else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_FULLSCREEN) - { - if (!window->fullscreen) - { - window->fullscreen = TRUE; - g_object_notify (G_OBJECT (window), "fullscreen"); - } - } + window->fullscreen_after_placement = TRUE; else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_ABOVE) window->wm_state_above = TRUE; else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_BELOW) diff --git a/src/core/window.c b/src/core/window.c index c6abf8111..aa6c691a6 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -723,6 +723,7 @@ meta_window_new_with_attrs (MetaDisplay *display, window->maximize_vertically_after_placement = FALSE; window->minimize_after_placement = FALSE; window->fullscreen = FALSE; + window->fullscreen_after_placement = FALSE; window->fullscreen_monitors[0] = -1; window->require_fully_onscreen = TRUE; window->require_on_single_monitor = TRUE; @@ -746,6 +747,7 @@ meta_window_new_with_attrs (MetaDisplay *display, meta_topic (META_DEBUG_PLACEMENT, "Not placing window 0x%lx since it's already mapped\n", xwindow); + window->force_save_user_rect = TRUE; window->denied_focus_and_not_transient = FALSE; window->unmanaging = FALSE; window->is_in_queues = 0; @@ -3008,6 +3010,8 @@ meta_window_maximize_internal (MetaWindow *window, window->maximized_horizontally || maximize_horizontally; window->maximized_vertically = window->maximized_vertically || maximize_vertically; + if (maximize_horizontally || maximize_vertically) + window->force_save_user_rect = FALSE; /* Fix for #336850: If the frame shape isn't reapplied, it is * possible that the frame will retains its rounded corners. That @@ -3187,6 +3191,10 @@ meta_window_unmaximize (MetaWindow *window, window->display->grab_anchor_window_pos = target_rect; } + /* Make sure user_rect is current. + */ + force_save_user_window_placement (window); + if (window->display->compositor) { MetaRectangle old_rect, new_rect; @@ -3264,6 +3272,7 @@ meta_window_make_fullscreen_internal (MetaWindow *window) meta_window_save_rect (window); window->fullscreen = TRUE; + window->force_save_user_rect = FALSE; meta_stack_freeze (window->screen->stack); meta_window_update_layer (window); @@ -3319,6 +3328,10 @@ meta_window_unmake_fullscreen (MetaWindow *window) target_rect.width, target_rect.height); + /* Make sure user_rect is current. + */ + force_save_user_window_placement (window); + meta_window_update_layer (window); recalc_window_features (window); @@ -4133,7 +4146,7 @@ meta_window_move_resize_internal (MetaWindow *window, if (need_configure_notify) send_configure_notify (window); - if (!window->placed) + if (!window->placed && window->force_save_user_rect && !window->fullscreen) force_save_user_window_placement (window); else if (is_user_action) save_user_window_placement (window);