Skip to content

Commit 696c587

Browse files
committed
tiling: re-maximize previously-maximized windows when dragging,
regardless of the tile-maximize preference. If you break a maximized window free, then drag the window back near the top of any window, it should be remaximized, not tiled, even if meta_pref_get_tile_maximize() is false. This was existing behavior in < 5.4. Maximize during drag should always work, so show the preview for it even when full tiling is disabled.
1 parent cfb1b7a commit 696c587

File tree

2 files changed

+33
-89
lines changed

2 files changed

+33
-89
lines changed

src/core/window-private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ struct _MetaWindow
243243
MetaTileMode tile_mode;
244244

245245
/* The last "full" maximized/unmaximized state. We need to keep track of
246-
* that to toggle between normal/tiled or maximized/tiled states. */
246+
* that to decide whether to tile-top or restore maximization during a drag. */
247247
guint saved_maximize : 1;
248248
int tile_monitor_number;
249249

src/core/window.c

Lines changed: 32 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2898,8 +2898,7 @@ meta_window_maximize_internal (MetaWindow *window,
28982898
else
28992899
meta_window_save_rect (window);
29002900

2901-
if (maximize_horizontally && maximize_vertically)
2902-
window->saved_maximize = TRUE;
2901+
window->saved_maximize = maximize_horizontally && maximize_vertically;
29032902

29042903
window->maximized_horizontally =
29052904
window->maximized_horizontally || maximize_horizontally;
@@ -3558,7 +3557,9 @@ meta_window_unmaximize (MetaWindow *window,
35583557
unmaximize_vertically = directions & META_MAXIMIZE_VERTICAL;
35593558
g_assert (unmaximize_horizontally || unmaximize_vertically);
35603559

3561-
if (unmaximize_horizontally && unmaximize_vertically)
3560+
// Window can be unmaximized (temporarily) during a drag, but saved_maximize should be preserved
3561+
// in case we're to restore a previously maximized window (ignoring the tile_maximize pref).
3562+
if (unmaximize_horizontally && unmaximize_vertically && (window->display->grab_op == META_GRAB_OP_NONE))
35623563
window->saved_maximize = FALSE;
35633564

35643565
/* Only do something if the window isn't already maximized in the
@@ -6408,6 +6409,21 @@ update_move_maybe_tile (MetaWindow *window,
64086409
logical_monitor->number,
64096410
&work_area);
64106411

6412+
if (!meta_prefs_get_edge_tiling ())
6413+
{
6414+
if ((get_tile_zone_at_pointer (window, logical_monitor, work_area, x, y) == ZONE_TOP) && meta_window_can_maximize (window))
6415+
{
6416+
display->preview_tile_mode = META_TILE_MAXIMIZED;
6417+
window->tile_monitor_number = logical_monitor->number;
6418+
}
6419+
else
6420+
{
6421+
display->preview_tile_mode = META_TILE_NONE;
6422+
}
6423+
6424+
return;
6425+
}
6426+
64116427
/* Check if the cursor is in a position which triggers tiling
64126428
* and set tile_mode accordingly.
64136429
*/
@@ -6417,10 +6433,14 @@ update_move_maybe_tile (MetaWindow *window,
64176433
else if (meta_window_can_tile_left_right (window) &&
64186434
get_tile_zone_at_pointer (window, logical_monitor, work_area, x, y) == ZONE_RIGHT)
64196435
display->preview_tile_mode = META_TILE_RIGHT;
6420-
else if (meta_window_can_tile_top_bottom (window) &&
6421-
// TODO: Handle maximize/tile preference
6422-
get_tile_zone_at_pointer (window, logical_monitor, work_area, x, y) == ZONE_TOP)
6423-
display->preview_tile_mode = meta_prefs_get_tile_maximize() ? META_TILE_MAXIMIZED : META_TILE_TOP;
6436+
else if (get_tile_zone_at_pointer (window, logical_monitor, work_area, x, y) == ZONE_TOP)
6437+
{
6438+
if (window->saved_maximize || (meta_prefs_get_tile_maximize () && meta_window_can_maximize (window)))
6439+
display->preview_tile_mode = META_TILE_MAXIMIZED;
6440+
else
6441+
if (meta_window_can_tile_top_bottom (window))
6442+
display->preview_tile_mode = META_TILE_TOP;
6443+
}
64246444
else if (meta_window_can_tile_top_bottom (window) &&
64256445
get_tile_zone_at_pointer (window, logical_monitor, work_area, x, y) == ZONE_BOTTOM)
64266446
display->preview_tile_mode = META_TILE_BOTTOM;
@@ -6494,8 +6514,7 @@ update_move (MetaWindow *window,
64946514
display->preview_tile_mode = META_TILE_NONE;
64956515
window->tile_monitor_number = -1;
64966516
}
6497-
else if (meta_prefs_get_edge_tiling () &&
6498-
!META_WINDOW_MAXIMIZED (window) &&
6517+
else if (!META_WINDOW_MAXIMIZED (window) &&
64996518
!META_WINDOW_TILED (window))
65006519
{
65016520
update_move_maybe_tile (window, shake_threshold, x, y);
@@ -6547,67 +6566,6 @@ update_move (MetaWindow *window,
65476566
return;
65486567
}
65496568

6550-
/* remaximize window on another monitor if window has been shaken
6551-
* loose or it is still maximized (then move straight)
6552-
*/
6553-
else if ((window->shaken_loose || META_WINDOW_MAXIMIZED (window)) &&
6554-
(window->tile_mode == META_TILE_NONE || window->tile_mode == META_TILE_MAXIMIZED))
6555-
{
6556-
MetaBackend *backend = meta_get_backend ();
6557-
MetaMonitorManager *monitor_manager =
6558-
meta_backend_get_monitor_manager (backend);
6559-
int n_logical_monitors;
6560-
const MetaLogicalMonitor *wmonitor;
6561-
MetaRectangle work_area;
6562-
int monitor;
6563-
6564-
window->tile_mode = META_TILE_NONE;
6565-
wmonitor = window->monitor;
6566-
n_logical_monitors =
6567-
meta_monitor_manager_get_num_logical_monitors (monitor_manager);
6568-
6569-
for (monitor = 0; monitor < n_logical_monitors; monitor++)
6570-
{
6571-
meta_window_get_work_area_for_monitor (window, monitor, &work_area);
6572-
6573-
/* check if cursor is near the top of a monitor work area */
6574-
if (x >= work_area.x &&
6575-
x < (work_area.x + work_area.width) &&
6576-
y >= work_area.y &&
6577-
y < (work_area.y + shake_threshold))
6578-
{
6579-
/* move the saved rect if window will become maximized on an
6580-
* other monitor so user isn't surprised on a later unmaximize
6581-
*/
6582-
if (wmonitor->number != monitor)
6583-
{
6584-
window->saved_rect.x = work_area.x;
6585-
window->saved_rect.y = work_area.y;
6586-
6587-
if (window->frame)
6588-
{
6589-
window->saved_rect.x += window->frame->child_x;
6590-
window->saved_rect.y += window->frame->child_y;
6591-
}
6592-
6593-
window->unconstrained_rect.x = window->saved_rect.x;
6594-
window->unconstrained_rect.y = window->saved_rect.y;
6595-
6596-
meta_window_unmaximize (window, META_MAXIMIZE_BOTH);
6597-
6598-
display->grab_initial_window_pos = work_area;
6599-
display->grab_anchor_root_x = x;
6600-
display->grab_anchor_root_y = y;
6601-
window->shaken_loose = FALSE;
6602-
6603-
meta_window_maximize (window, META_MAXIMIZE_BOTH);
6604-
}
6605-
6606-
return;
6607-
}
6608-
}
6609-
}
6610-
66116569
/* Delay showing the tile preview slightly to make it more unlikely to
66126570
* trigger it unwittingly, e.g. when shaking loose the window or moving
66136571
* it to another monitor.
@@ -6780,24 +6738,6 @@ update_resize (MetaWindow *window,
67806738
window->display->grab_last_moveresize_time = g_get_real_time ();
67816739
}
67826740

6783-
static void
6784-
maybe_maximize_tiled_window (MetaWindow *window)
6785-
{
6786-
MetaRectangle work_area;
6787-
gint shake_threshold;
6788-
6789-
if (!META_WINDOW_TILED (window))
6790-
return;
6791-
6792-
shake_threshold = meta_prefs_get_drag_threshold ();
6793-
6794-
meta_window_get_work_area_for_monitor (window,
6795-
window->tile_monitor_number,
6796-
&work_area);
6797-
if (window->rect.width >= work_area.width - shake_threshold)
6798-
meta_window_maximize (window, META_MAXIMIZE_BOTH);
6799-
}
6800-
68016741
void
68026742
meta_window_update_resize (MetaWindow *window,
68036743
gboolean snap,
@@ -6845,6 +6785,10 @@ end_grab_op (MetaWindow *window,
68456785
}
68466786
}
68476787
window->display->preview_tile_mode = META_TILE_NONE;
6788+
6789+
if (!(window->maximized_horizontally && window->maximized_vertically))
6790+
window->saved_maximize = FALSE;
6791+
68486792
meta_display_end_grab_op (window->display, clutter_event_get_time (event));
68496793
}
68506794

0 commit comments

Comments
 (0)