diff --git a/data/org.cinnamon.muffin.gschema.xml.in b/data/org.cinnamon.muffin.gschema.xml.in
index 88d7be2c7..c8814e8e0 100644
--- a/data/org.cinnamon.muffin.gschema.xml.in
+++ b/data/org.cinnamon.muffin.gschema.xml.in
@@ -43,6 +43,17 @@
+
+ true
+ Enable edge resistance between windows
+
+ If enabled, windows resist movement when their edges approach the
+ edges of other windows. Disabling this allows windows to be dragged
+ freely past one another without any sticky edge effect. Resistance
+ against monitor and screen boundaries is not affected by this setting.
+
+
+
false
Sets maximize as the tile action for the top edge of the screen
diff --git a/src/core/edge-resistance.c b/src/core/edge-resistance.c
index fc7c06602..ed7ca3f2b 100644
--- a/src/core/edge-resistance.c
+++ b/src/core/edge-resistance.c
@@ -27,6 +27,7 @@
#include "core/display-private.h"
#include "core/meta-workspace-manager-private.h"
#include "core/workspace-private.h"
+#include "meta/prefs.h"
/* A simple macro for whether a given window's edges are potentially
* relevant for resistance/snapping during a move/resize operation
@@ -341,7 +342,8 @@ apply_edge_resistance (MetaWindow *window,
gboolean increasing = new_pos > old_pos;
int increment = increasing ? 1 : -1;
- const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_WINDOW = 16;
+ const gboolean resist = meta_prefs_get_edge_resistance_window ();
+ const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_WINDOW = resist ? 16 : 0;
const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_WINDOW = 0;
const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_MONITOR = 32;
const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_MONITOR = 0;
diff --git a/src/core/prefs.c b/src/core/prefs.c
index 6c697b2e4..1eda5d39f 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -123,6 +123,7 @@ static int draggable_border_width = 10;
static int drag_threshold;
static gboolean resize_with_right_button = FALSE;
static gboolean edge_tiling = FALSE;
+static gboolean edge_resistance_window = TRUE;
static gboolean force_fullscreen = TRUE;
static gboolean auto_maximize = TRUE;
static gboolean show_fallback_app_menu = TRUE;
@@ -415,6 +416,13 @@ static MetaBoolPreference preferences_bool[] =
},
&edge_tiling,
},
+ {
+ { "edge-resistance-window",
+ SCHEMA_MUFFIN,
+ META_PREF_EDGE_RESISTANCE_WINDOW,
+ },
+ &edge_resistance_window,
+ },
{
{ "workspaces-only-on-primary",
SCHEMA_MUFFIN,
@@ -1925,6 +1933,9 @@ meta_preference_to_string (MetaPreference pref)
case META_PREF_EDGE_TILING:
return "EDGE_TILING";
+ case META_PREF_EDGE_RESISTANCE_WINDOW:
+ return "EDGE_RESISTANCE_WINDOW";
+
case META_PREF_FORCE_FULLSCREEN:
return "FORCE_FULLSCREEN";
@@ -2400,6 +2411,12 @@ meta_prefs_get_edge_tiling (void)
return edge_tiling;
}
+gboolean
+meta_prefs_get_edge_resistance_window (void)
+{
+ return edge_resistance_window;
+}
+
gboolean
meta_prefs_get_tile_maximize (void)
{
diff --git a/src/meta/prefs.h b/src/meta/prefs.h
index 1179d530d..702c9bd9b 100644
--- a/src/meta/prefs.h
+++ b/src/meta/prefs.h
@@ -106,6 +106,7 @@ typedef enum
META_PREF_CURSOR_SIZE,
META_PREF_RESIZE_WITH_RIGHT_BUTTON,
META_PREF_EDGE_TILING,
+ META_PREF_EDGE_RESISTANCE_WINDOW,
META_PREF_FORCE_FULLSCREEN,
META_PREF_WORKSPACES_ONLY_ON_PRIMARY,
META_PREF_DRAGGABLE_BORDER_WIDTH,
@@ -204,6 +205,9 @@ gboolean meta_prefs_get_gnome_animations (void);
META_EXPORT
gboolean meta_prefs_get_edge_tiling (void);
+META_EXPORT
+gboolean meta_prefs_get_edge_resistance_window (void);
+
META_EXPORT
gboolean meta_prefs_get_tile_maximize (void);