Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ tmp/**/*
*.bak
*.swp
*~.nib
*.sh
*.deb
local.properties
.classpath
.settings/
Expand Down
63 changes: 63 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,66 @@
commit 99b3cba71b7a364cb495e10496de9e184a1fcd70
Author: Nemo Developer <nemo@local>
Date: 2025-01-01

dual-pane: add vertical split, separate sidebars, nav bars, and statusbars

Extend the dual-pane feature with four new user-configurable options,
all found in Preferences → Behaviour → Dual Pane:

"Show panes vertically – one above the other" (default: off)
Adds a VPaned orientation for split-view in addition to the existing
side-by-side HPaned layout. The split_view_hpane is recreated with
the appropriate GtkOrientation when the preference changes.

"Separate sidebar per pane" (default: off, requires vertical split)
In vertical split mode each pane column gets its own independent
sidebar (places or tree) locked to that pane's navigation so
browsing in one pane does not move the other pane's sidebar.
Implemented by wrapping pane1 in a new inline HPaned
(primary_pane_content_paned) and adding a second sidebar box
(sidebar2 / secondary_pane_content_paned) for pane2.

"Separate Path Bar/Location Entry per pane" (default: off, requires vertical split)
Embeds a full toolbar (path bar / location entry) directly inside
each pane column so each pane tracks its own navigation history
independently without sharing the window-level toolbar.

"Separate statusbar per pane" (default: off, requires vertical split + separate sidebar)
Adds a full-width NemoStatusBar below each pane column (spanning
both the sidebar and content area). The global statusbar is hidden
by concealing its outer event-box wrapper rather than changing its
visible property, preserving the GSettings binding that controls the
floating-bar "selected items" overlay. Each per-pane bar is locked
to its pane via a new PROP_PANE construct property so its zoom
slider and sidebar buttons operate on that pane only. The places /
tree toggle buttons call the new nemo_window_set_pane_sidebar_type()
helper which swaps the sidebar widget in-place without firing the
global notify::sidebar-view-id signal, keeping each pane's sidebar
type independent.

Modified files:
src/nemo-window.c
src/nemo-window.h
src/nemo-window-private.h
src/nemo-window-slot.c
src/nemo-statusbar.c
src/nemo-statusbar.h
src/nemo-file-management-properties.c
gresources/nemo-file-management-properties.glade
libnemo-private/nemo-global-preferences.h
libnemo-private/org.nemo.gschema.xml

M src/nemo-window.c
M src/nemo-window.h
M src/nemo-window-private.h
M src/nemo-window-slot.c
M src/nemo-statusbar.c
M src/nemo-statusbar.h
M src/nemo-file-management-properties.c
M gresources/nemo-file-management-properties.glade
M libnemo-private/nemo-global-preferences.h
M libnemo-private/org.nemo.gschema.xml

commit 16763a8b828387930641d69c04451e02d67cadd6
Author: Cosimo Cecchi <cosimoc@gnome.org>
Date: 2012-05-14
Expand Down
7 changes: 7 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
nemo (6.6.4) zena; urgency=medium

[ cdmdotnet Limited ]
* dual-pane: add vertical split, separate sidebars, nav bars, and statusbars

-- cdmdotnet Limited <root@linuxmint.com> Tue, 16 Mar 2026 07:29:12 +0000

nemo (6.6.3) zena; urgency=medium

[ Michael Webster ]
Expand Down
127 changes: 119 additions & 8 deletions gresources/nemo-file-management-properties.glade
Original file line number Diff line number Diff line change
Expand Up @@ -1239,6 +1239,70 @@ along with . If not, see <http://www.gnu.org/licenses/>.
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="expand_row_on_dnd_dwell_checkbutton">
<property name="label" translatable="yes">Automatically expand rows during drag-and-drop</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="use-underline">True</property>
<property name="xalign">0</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="vbox_dual_pane_section">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="border-width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label_dual_pane">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Dual Pane&lt;/b&gt;</property>
<property name="use-markup">True</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment_dual_pane">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="left-padding">40</property>
<child>
<object class="GtkBox" id="vbox_dual_pane_checks">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="start_with_dual_pane_checkbutton">
<property name="label" translatable="yes">Always start in dual-pane view</property>
Expand All @@ -1252,13 +1316,60 @@ along with . If not, see <http://www.gnu.org/licenses/>.
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">3</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="dual_pane_vertical_split_checkbutton">
<property name="label" translatable="yes">Show panes vertically - one above the other</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="use-underline">True</property>
<property name="xalign">0</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="dual_pane_separate_sidebar_checkbutton">
<property name="label" translatable="yes">Separate sidebar per pane</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="use-underline">True</property>
<property name="xalign">0</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="dual_pane_separate_nav_bar_checkbutton">
<property name="label" translatable="yes">Separate Path Bar/Location Entry per pane</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="use-underline">True</property>
<property name="xalign">0</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="expand_row_on_dnd_dwell_checkbutton">
<property name="label" translatable="yes">Automatically expand rows during drag-and-drop</property>
<object class="GtkCheckButton" id="dual_pane_separate_statusbar_checkbutton">
<property name="label" translatable="yes">Separate statusbar per pane</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
Expand All @@ -1285,7 +1396,7 @@ along with . If not, see <http://www.gnu.org/licenses/>.
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
<child>
Expand Down Expand Up @@ -1384,7 +1495,7 @@ along with . If not, see <http://www.gnu.org/licenses/>.
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
<child>
Expand Down Expand Up @@ -1495,7 +1606,7 @@ along with . If not, see <http://www.gnu.org/licenses/>.
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
<property name="position">4</property>
</packing>
</child>
<child>
Expand Down Expand Up @@ -1623,7 +1734,7 @@ along with . If not, see <http://www.gnu.org/licenses/>.
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
<property name="position">5</property>
</packing>
</child>
<child>
Expand Down Expand Up @@ -1710,7 +1821,7 @@ along with . If not, see <http://www.gnu.org/licenses/>.
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">5</property>
<property name="position">6</property>
</packing>
</child>
</object>
Expand Down
13 changes: 13 additions & 0 deletions gresources/nemo-style-fallback-mandatory.css
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,16 @@
color: @theme_selected_fg_color;
background-color: @theme_selected_bg_color;
}

/* Per-pane sidebar colouring (dual-pane mode with separate sidebars).
*
* When two sidebars are shown, the ACTIVE sidebar box has GTK_STYLE_CLASS_SIDEBAR
* removed by sidebar_set_active_style() so the theme's grey .sidebar rules no
* longer apply — it simply uses the normal window background.
*
* The INACTIVE sidebar keeps GTK_STYLE_CLASS_SIDEBAR (grey) and also gets
* "nemo-inactive-pane" so the rule below greys its treeview rows explicitly.
* (The existing rule at the top of this file handles .nemo-inactive-pane .view.)
*
* No additional CSS rules are needed here for the active sidebar.
*/
4 changes: 4 additions & 0 deletions libnemo-private/nemo-global-preferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,10 @@ typedef enum
#define NEMO_PREFERENCES_CLOSE_DEVICE_VIEW_ON_EJECT "close-device-view-on-device-eject"

#define NEMO_PREFERENCES_START_WITH_DUAL_PANE "start-with-dual-pane"
#define NEMO_PREFERENCES_DUAL_PANE_VERTICAL_SPLIT "dual-pane-vertical-split"
#define NEMO_PREFERENCES_DUAL_PANE_SEPARATE_SIDEBAR "dual-pane-separate-sidebar"
#define NEMO_PREFERENCES_DUAL_PANE_SEPARATE_NAV_BAR "dual-pane-separate-nav-bar"
#define NEMO_PREFERENCES_DUAL_PANE_SEPARATE_STATUSBAR "dual-pane-separate-statusbar"
#define NEMO_PREFERENCES_IGNORE_VIEW_METADATA "ignore-view-metadata"
#define NEMO_PREFERENCES_SHOW_BOOKMARKS_IN_TO_MENUS "show-bookmarks-in-to-menus"
#define NEMO_PREFERENCES_SHOW_PLACES_IN_TO_MENUS "show-places-in-to-menus"
Expand Down
20 changes: 20 additions & 0 deletions libnemo-private/org.nemo.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,26 @@
<summary>Whether to default to showing dual-pane view when a new window is opened</summary>
<description>If set to true, new Nemo windows will default to showing two panes</description>
</key>
<key name="dual-pane-vertical-split" type="b">
<default>false</default>
<summary>Whether to show dual panes vertically (one above the other)</summary>
<description>If set to true, dual-pane view will show one pane above the other instead of side by side</description>
</key>
<key name="dual-pane-separate-sidebar" type="b">
<default>false</default>
<summary>Whether each pane has its own sidebar</summary>
<description>If set to true, each pane in dual-pane view will have its own independent sidebar</description>
</key>
<key name="dual-pane-separate-nav-bar" type="b">
<default>false</default>
<summary>Whether each pane has its own path bar / location entry</summary>
<description>If set to true, each pane in dual-pane view will have its own independent navigation bar</description>
</key>
<key name="dual-pane-separate-statusbar" type="b">
<default>false</default>
<summary>Whether each pane has its own status bar</summary>
<description>If set to true, each pane in vertical dual-pane view with separate sidebars will have its own status bar below it</description>
</key>
<key name="ignore-view-metadata" type="b">
<default>false</default>
<summary>Whether to ignore folder metadata for view zoom levels and layouts</summary>
Expand Down
2 changes: 1 addition & 1 deletion meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Meson build file

# https://github.com/linuxmint/nemo
project('nemo', 'c', version : '6.6.3', meson_version : '>=0.56.0')
project('nemo', 'c', version : '6.6.4', meson_version : '>=0.56.0')

# 1. If the library code has changed at all since last release, then increment revision.
# 2. If any interfaces have been added, then increment current and set revision to 0.
Expand Down
Loading
Loading