diff --git a/gresources/nemo-desktop-overlay.glade b/gresources/nemo-desktop-overlay.glade
index 93678fbb1a..cb5337dc7f 100644
--- a/gresources/nemo-desktop-overlay.glade
+++ b/gresources/nemo-desktop-overlay.glade
@@ -321,6 +321,48 @@
+
+
+
False
diff --git a/libnemo-private/nemo-global-preferences.h b/libnemo-private/nemo-global-preferences.h
index 91f404854e..4e669fc840 100644
--- a/libnemo-private/nemo-global-preferences.h
+++ b/libnemo-private/nemo-global-preferences.h
@@ -239,6 +239,7 @@ typedef enum
#define NEMO_PREFERENCES_SHOW_ORPHANED_DESKTOP_ICONS "show-orphaned-desktop-icons"
#define NEMO_PREFERENCES_SHOW_DESKTOP "show-desktop-icons" /* DEPRECATED */
#define NEMO_PREFERENCES_USE_DESKTOP_GRID "use-desktop-grid"
+#define NEMO_PREFERENCES_DESKTOP_KEEP_ALIGNED "keep-aligned"
#define NEMO_PREFERENCES_DESKTOP_HORIZONTAL_GRID_ADJUST "horizontal-grid-adjust"
#define NEMO_PREFERENCES_DESKTOP_VERTICAL_GRID_ADJUST "vertical-grid-adjust"
diff --git a/libnemo-private/org.nemo.gschema.xml b/libnemo-private/org.nemo.gschema.xml
index abc2814d44..4f2cee9073 100644
--- a/libnemo-private/org.nemo.gschema.xml
+++ b/libnemo-private/org.nemo.gschema.xml
@@ -576,6 +576,11 @@
Which desktop view type to use
If true, the new desktop grid view will be used by nemo-desktop, otherwise the legacy view will be used.
+
+ true
+ Snap desktop icons to the grid
+ If true, icons are snapped to the desktop grid, otherwise icons are freely placeable.
+
1.0
Vertical desktop grid adjustment
diff --git a/src/nemo-desktop-icon-grid-view.c b/src/nemo-desktop-icon-grid-view.c
index 2e5a8283ea..44a603a25d 100644
--- a/src/nemo-desktop-icon-grid-view.c
+++ b/src/nemo-desktop-icon-grid-view.c
@@ -359,6 +359,29 @@ nemo_desktop_icon_grid_view_dispose (GObject *object)
G_OBJECT_CLASS (nemo_desktop_icon_grid_view_parent_class)->dispose (object);
}
+static void
+apply_keep_aligned (NemoDesktopIconGridView *view)
+{
+ gboolean aligned = g_settings_get_boolean (nemo_desktop_preferences,
+ NEMO_PREFERENCES_DESKTOP_KEEP_ALIGNED);
+ nemo_icon_container_set_keep_aligned (get_icon_container (view), aligned);
+}
+
+static void
+nemo_desktop_icon_grid_view_begin_loading (NemoView *view)
+{
+ NEMO_VIEW_CLASS (nemo_desktop_icon_grid_view_parent_class)->begin_loading (view);
+ apply_keep_aligned (NEMO_DESKTOP_ICON_GRID_VIEW (view));
+}
+
+static void
+desktop_keep_aligned_changed (GSettings *settings,
+ const char *key,
+ gpointer user_data)
+{
+ apply_keep_aligned (NEMO_DESKTOP_ICON_GRID_VIEW (user_data));
+}
+
static void
nemo_desktop_icon_grid_view_class_init (NemoDesktopIconGridViewClass *class)
{
@@ -373,6 +396,7 @@ nemo_desktop_icon_grid_view_class_init (NemoDesktopIconGridViewClass *class)
vclass->merge_menus = real_merge_menus;
vclass->update_menus = real_update_menus;
+ vclass->begin_loading = nemo_desktop_icon_grid_view_begin_loading;
vclass->get_view_id = real_get_id;
vclass->add_file = nemo_desktop_icon_grid_view_add_file;
vclass->file_changed = nemo_desktop_icon_grid_view_file_changed;
@@ -527,7 +551,12 @@ nemo_desktop_icon_grid_view_constructed (GObject *object)
nemo_icon_container_set_is_fixed_size (icon_container, TRUE);
nemo_icon_container_set_is_desktop (icon_container, TRUE);
- nemo_icon_container_set_keep_aligned (icon_container, TRUE);
+ apply_keep_aligned (desktop_icon_grid_view);
+ g_signal_connect_object (nemo_desktop_preferences,
+ "changed::" NEMO_PREFERENCES_DESKTOP_KEEP_ALIGNED,
+ G_CALLBACK (desktop_keep_aligned_changed),
+ desktop_icon_grid_view,
+ 0);
NEMO_ICON_VIEW_GRID_CONTAINER (icon_container)->horizontal = FALSE;
diff --git a/src/nemo-desktop-overlay.c b/src/nemo-desktop-overlay.c
index ca04f1adc8..b54a74c49d 100644
--- a/src/nemo-desktop-overlay.c
+++ b/src/nemo-desktop-overlay.c
@@ -11,6 +11,7 @@
#include "nemo-desktop-manager.h"
#include
+#include
typedef struct
{
@@ -102,6 +103,21 @@ show_view_page (NemoDesktopOverlay *overlay)
gtk_stack_set_visible_child_name (priv->stack, "view");
}
+static void
+keep_aligned_apply_visual (GtkSwitch *keep,
+ GtkSwitch *arrange)
+{
+ gtk_widget_set_sensitive (GTK_WIDGET (keep), !gtk_switch_get_active (arrange));
+}
+
+static void
+auto_arrange_exclusive_notify (GObject *object,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ keep_aligned_apply_visual (GTK_SWITCH (user_data), GTK_SWITCH (object));
+}
+
static void
sync_controls (NemoDesktopOverlay *overlay,
gboolean same_monitor)
@@ -228,6 +244,30 @@ sync_controls (NemoDesktopOverlay *overlay,
gtk_activatable_set_related_action (GTK_ACTIVATABLE (gtk_builder_get_object (priv->builder, "auto_arrange_switch")),
action);
+ {
+ GtkWidget *keep = GTK_WIDGET (gtk_builder_get_object (priv->builder, "keep_aligned_switch"));
+ GtkWidget *arrange = GTK_WIDGET (gtk_builder_get_object (priv->builder, "auto_arrange_switch"));
+ GtkWidget *row = GTK_WIDGET (gtk_builder_get_object (priv->builder, "listboxrow_keep_aligned"));
+
+ /* Skip for legacy desktop */
+ gtk_widget_set_visible (row,
+ g_settings_get_boolean (nemo_desktop_preferences,
+ NEMO_PREFERENCES_USE_DESKTOP_GRID));
+
+ if (!GPOINTER_TO_INT (g_object_get_data (G_OBJECT (keep), "keep-aligned-bound"))) {
+ g_settings_bind (nemo_desktop_preferences,
+ NEMO_PREFERENCES_DESKTOP_KEEP_ALIGNED,
+ keep, "active",
+ G_SETTINGS_BIND_DEFAULT);
+ g_object_set_data (G_OBJECT (keep), "keep-aligned-bound", GINT_TO_POINTER (TRUE));
+ g_signal_connect (arrange, "notify::active",
+ G_CALLBACK (auto_arrange_exclusive_notify),
+ keep);
+ }
+
+ keep_aligned_apply_visual (GTK_SWITCH (keep), GTK_SWITCH (arrange));
+ }
+
action = gtk_action_group_get_action (priv->action_group, "Desktop Reverse Sort");
gtk_activatable_set_related_action (GTK_ACTIVATABLE (gtk_builder_get_object (priv->builder, "reverse_sort_switch")),
action);