Prevent window self-maximisation

https://bugzilla.gnome.org/show_bug.cgi?id=461927
This commit is contained in:
Peter Bloomfield 2010-01-20 10:59:07 -05:00 committed by Owen W. Taylor
parent 11e01ec074
commit c6793d477a
4 changed files with 35 additions and 11 deletions

View File

@ -528,10 +528,11 @@ place_window_if_needed(MetaWindow *window,
if (window->placed || did_placement) if (window->placed || did_placement)
{ {
if (window->maximize_horizontally_after_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 /* define a sane saved_rect so that the user can unmaximize or
* something reasonable. * make unfullscreen to something reasonable.
*/ */
if (info->current.width >= info->work_area_monitor.width) if (info->current.width >= info->work_area_monitor.width)
{ {
@ -558,6 +559,15 @@ place_window_if_needed(MetaWindow *window,
if (window->frame && !window->fullscreen) if (window->frame && !window->fullscreen)
meta_frame_calc_geometry (window->frame, info->fgeom); 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_horizontally_after_placement = FALSE;
window->maximize_vertically_after_placement = FALSE; window->maximize_vertically_after_placement = FALSE;
} }

View File

@ -133,6 +133,9 @@ struct _MetaWindow
/* Whether the urgent flag of WM_HINTS is set */ /* Whether the urgent flag of WM_HINTS is set */
guint wm_hints_urgent : 1; 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 /* 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 * 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 * these monitors. If not, this is the single monitor which the window's
@ -249,6 +252,9 @@ struct _MetaWindow
/* Have we placed this window? */ /* Have we placed this window? */
guint placed : 1; 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? */ /* Is this not a transient of the focus window which is being denied focus? */
guint denied_focus_and_not_transient : 1; guint denied_focus_and_not_transient : 1;

View File

@ -604,6 +604,7 @@ reload_net_wm_state (MetaWindow *window,
window->shaded = FALSE; window->shaded = FALSE;
window->maximized_horizontally = FALSE; window->maximized_horizontally = FALSE;
window->maximized_vertically = FALSE; window->maximized_vertically = FALSE;
window->fullscreen = FALSE;
window->wm_state_modal = FALSE; window->wm_state_modal = FALSE;
window->wm_state_skip_taskbar = FALSE; window->wm_state_skip_taskbar = FALSE;
window->wm_state_skip_pager = 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) else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_PAGER)
window->wm_state_skip_pager = TRUE; window->wm_state_skip_pager = TRUE;
else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_FULLSCREEN) else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_FULLSCREEN)
{ window->fullscreen_after_placement = TRUE;
if (!window->fullscreen)
{
window->fullscreen = TRUE;
g_object_notify (G_OBJECT (window), "fullscreen");
}
}
else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_ABOVE) else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_ABOVE)
window->wm_state_above = TRUE; window->wm_state_above = TRUE;
else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_BELOW) else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_BELOW)

View File

@ -723,6 +723,7 @@ meta_window_new_with_attrs (MetaDisplay *display,
window->maximize_vertically_after_placement = FALSE; window->maximize_vertically_after_placement = FALSE;
window->minimize_after_placement = FALSE; window->minimize_after_placement = FALSE;
window->fullscreen = FALSE; window->fullscreen = FALSE;
window->fullscreen_after_placement = FALSE;
window->fullscreen_monitors[0] = -1; window->fullscreen_monitors[0] = -1;
window->require_fully_onscreen = TRUE; window->require_fully_onscreen = TRUE;
window->require_on_single_monitor = TRUE; window->require_on_single_monitor = TRUE;
@ -746,6 +747,7 @@ meta_window_new_with_attrs (MetaDisplay *display,
meta_topic (META_DEBUG_PLACEMENT, meta_topic (META_DEBUG_PLACEMENT,
"Not placing window 0x%lx since it's already mapped\n", "Not placing window 0x%lx since it's already mapped\n",
xwindow); xwindow);
window->force_save_user_rect = TRUE;
window->denied_focus_and_not_transient = FALSE; window->denied_focus_and_not_transient = FALSE;
window->unmanaging = FALSE; window->unmanaging = FALSE;
window->is_in_queues = 0; window->is_in_queues = 0;
@ -3008,6 +3010,8 @@ meta_window_maximize_internal (MetaWindow *window,
window->maximized_horizontally || maximize_horizontally; window->maximized_horizontally || maximize_horizontally;
window->maximized_vertically = window->maximized_vertically =
window->maximized_vertically || maximize_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 /* Fix for #336850: If the frame shape isn't reapplied, it is
* possible that the frame will retains its rounded corners. That * 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; window->display->grab_anchor_window_pos = target_rect;
} }
/* Make sure user_rect is current.
*/
force_save_user_window_placement (window);
if (window->display->compositor) if (window->display->compositor)
{ {
MetaRectangle old_rect, new_rect; MetaRectangle old_rect, new_rect;
@ -3264,6 +3272,7 @@ meta_window_make_fullscreen_internal (MetaWindow *window)
meta_window_save_rect (window); meta_window_save_rect (window);
window->fullscreen = TRUE; window->fullscreen = TRUE;
window->force_save_user_rect = FALSE;
meta_stack_freeze (window->screen->stack); meta_stack_freeze (window->screen->stack);
meta_window_update_layer (window); meta_window_update_layer (window);
@ -3319,6 +3328,10 @@ meta_window_unmake_fullscreen (MetaWindow *window)
target_rect.width, target_rect.width,
target_rect.height); target_rect.height);
/* Make sure user_rect is current.
*/
force_save_user_window_placement (window);
meta_window_update_layer (window); meta_window_update_layer (window);
recalc_window_features (window); recalc_window_features (window);
@ -4133,7 +4146,7 @@ meta_window_move_resize_internal (MetaWindow *window,
if (need_configure_notify) if (need_configure_notify)
send_configure_notify (window); send_configure_notify (window);
if (!window->placed) if (!window->placed && window->force_save_user_rect && !window->fullscreen)
force_save_user_window_placement (window); force_save_user_window_placement (window);
else if (is_user_action) else if (is_user_action)
save_user_window_placement (window); save_user_window_placement (window);