From 9ee31831f2413439cf2795aeeb515ce7621b9ee5 Mon Sep 17 00:00:00 2001 From: Dave Daynard Date: Sun, 4 Oct 2026 13:50:13 -0400 Subject: [PATCH] desktop: don't force keep-align flag The code already has paths for icons with custom location data, but we were forcing keep-align to always be true. Allow the user to toggle it off, and selectively snap to grid only when the setting is on --- gresources/nemo-desktop-overlay.glade | 42 +++++++++++++++++++++++ libnemo-private/nemo-global-preferences.h | 1 + libnemo-private/org.nemo.gschema.xml | 5 +++ src/nemo-desktop-icon-grid-view.c | 31 ++++++++++++++++- src/nemo-desktop-overlay.c | 40 +++++++++++++++++++++ 5 files changed, 118 insertions(+), 1 deletion(-) 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 @@ + + + True + True + False + False + + + True + False + 5 + 20 + + + True + False + Keep aligned to grid + + + False + True + 6 + 0 + + + + + True + True + center + + + False + True + end + 1 + + + + + + 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);