[mutter] window: "Hide" edge resistance behind modifier key



commit 22902a5e2c637da88cbdcb75068ee10de67eb2a6
Author: Florian Müllner <fmuellner gnome org>
Date:   Sat May 23 20:06:14 2020 +0200

    window: "Hide" edge resistance behind modifier key
    
    Aligning windows manually with other windows has become less important
    since the advent of tiling. This decreases the usefulness of edge
    resistance, which in fact many users perceive as lag nowadays.
    
    Account for that by limiting resistance to screen and monitor edges by
    default, and only include windows when the control key is pressed.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=679609

 src/core/edge-resistance.c | 12 +++++++++++-
 src/core/keybindings.c     |  2 +-
 src/core/window-private.h  |  1 +
 src/core/window.c          | 10 ++++++++--
 4 files changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/src/core/edge-resistance.c b/src/core/edge-resistance.c
index 870ce6e78e..3e42936e73 100644
--- a/src/core/edge-resistance.c
+++ b/src/core/edge-resistance.c
@@ -334,6 +334,7 @@ apply_edge_resistance (MetaWindow                *window,
                        ResistanceDataForAnEdge   *resistance_data,
                        GSourceFunc                timeout_func,
                        gboolean                   xdir,
+                       gboolean                   include_windows,
                        gboolean                   keyboard_op)
 {
   int i, begin, end;
@@ -420,7 +421,8 @@ apply_edge_resistance (MetaWindow                *window,
               switch (edge->edge_type)
                 {
                 case META_EDGE_WINDOW:
-                  timeout_length_ms = TIMEOUT_RESISTANCE_LENGTH_MS_WINDOW;
+                  if (include_windows)
+                    timeout_length_ms = TIMEOUT_RESISTANCE_LENGTH_MS_WINDOW;
                   break;
                 case META_EDGE_MONITOR:
                   timeout_length_ms = TIMEOUT_RESISTANCE_LENGTH_MS_MONITOR;
@@ -464,6 +466,8 @@ apply_edge_resistance (MetaWindow                *window,
           switch (edge->edge_type)
             {
             case META_EDGE_WINDOW:
+              if (!include_windows)
+                break;
               if (movement_towards_edge (edge->side_type, increment))
                 threshold = PIXEL_DISTANCE_THRESHOLD_TOWARDS_WINDOW;
               else
@@ -640,6 +644,8 @@ apply_edge_resistance_to_each_side (MetaDisplay             *display,
     }
   else
     {
+      gboolean include_windows = flags & META_EDGE_RESISTANCE_WINDOWS;
+
       /* Disable edge resistance for resizes when windows have size
        * increment hints; see #346782.  For all other cases, apply
        * them.
@@ -656,6 +662,7 @@ apply_edge_resistance_to_each_side (MetaDisplay             *display,
                                               &edge_data->left_data,
                                               timeout_func,
                                               TRUE,
+                                              include_windows,
                                               keyboard_op);
           new_right  = apply_edge_resistance (window,
                                               BOX_RIGHT (*old_outer),
@@ -666,6 +673,7 @@ apply_edge_resistance_to_each_side (MetaDisplay             *display,
                                               &edge_data->right_data,
                                               timeout_func,
                                               TRUE,
+                                              include_windows,
                                               keyboard_op);
         }
       else
@@ -685,6 +693,7 @@ apply_edge_resistance_to_each_side (MetaDisplay             *display,
                                               &edge_data->top_data,
                                               timeout_func,
                                               FALSE,
+                                              include_windows,
                                               keyboard_op);
           new_bottom = apply_edge_resistance (window,
                                               BOX_BOTTOM (*old_outer),
@@ -695,6 +704,7 @@ apply_edge_resistance_to_each_side (MetaDisplay             *display,
                                               &edge_data->bottom_data,
                                               timeout_func,
                                               FALSE,
+                                              include_windows,
                                               keyboard_op);
         }
       else
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 417294cbd0..f649093c9c 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -2420,7 +2420,7 @@ process_keyboard_move_grab (MetaDisplay     *display,
   x = frame_rect.x;
   y = frame_rect.y;
 
-  flags = META_EDGE_RESISTANCE_KEYBOARD_OP;
+  flags = META_EDGE_RESISTANCE_KEYBOARD_OP | META_EDGE_RESISTANCE_WINDOWS;
 
   if ((event->modifier_state & CLUTTER_SHIFT_MASK) != 0)
     flags |= META_EDGE_RESISTANCE_SNAP;
diff --git a/src/core/window-private.h b/src/core/window-private.h
index ef00231087..2ef0db7140 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -162,6 +162,7 @@ typedef enum
   META_EDGE_RESISTANCE_DEFAULT     = 0,
   META_EDGE_RESISTANCE_SNAP        = 1 << 0,
   META_EDGE_RESISTANCE_KEYBOARD_OP = 1 << 1,
+  META_EDGE_RESISTANCE_WINDOWS     = 1 << 2,
 } MetaEdgeResistanceFlags;
 
 struct _MetaWindow
diff --git a/src/core/window.c b/src/core/window.c
index 9688937861..149a6fa62c 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -6421,6 +6421,9 @@ end_grab_op (MetaWindow *window,
       if (modifiers & CLUTTER_SHIFT_MASK)
         flags |= META_EDGE_RESISTANCE_SNAP;
 
+      if (modifiers & CLUTTER_CONTROL_MASK)
+        flags |= META_EDGE_RESISTANCE_WINDOWS;
+
       if (meta_grab_op_is_moving (window->display->grab_op))
         {
           if (window->display->preview_tile_mode != META_TILE_NONE)
@@ -6431,7 +6434,7 @@ end_grab_op (MetaWindow *window,
       else if (meta_grab_op_is_resizing (window->display->grab_op))
         {
           if (window->tile_match != NULL)
-            flags |= META_EDGE_RESISTANCE_SNAP;
+            flags |= (META_EDGE_RESISTANCE_SNAP | META_EDGE_RESISTANCE_WINDOWS);
 
           update_resize (window, flags, x, y, TRUE);
           maybe_maximize_tiled_window (window);
@@ -6503,6 +6506,9 @@ meta_window_handle_mouse_grab_op_event  (MetaWindow         *window,
       if (modifier_state & CLUTTER_SHIFT_MASK)
         flags |= META_EDGE_RESISTANCE_SNAP;
 
+      if (modifier_state & CLUTTER_CONTROL_MASK)
+        flags |= META_EDGE_RESISTANCE_WINDOWS;
+
       meta_display_check_threshold_reached (window->display, x, y);
       if (meta_grab_op_is_moving (window->display->grab_op))
         {
@@ -6511,7 +6517,7 @@ meta_window_handle_mouse_grab_op_event  (MetaWindow         *window,
       else if (meta_grab_op_is_resizing (window->display->grab_op))
         {
           if (window->tile_match != NULL)
-            flags |= META_EDGE_RESISTANCE_SNAP;
+            flags |= (META_EDGE_RESISTANCE_SNAP | META_EDGE_RESISTANCE_WINDOWS);
 
           update_resize (window, flags, x, y, FALSE);
         }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]