@@ -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-
68016741void
68026742meta_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