Browse Source

External panelize: refactoring:

  *  src/filemanager/panelize.[ch]: keep function related to the external
  panelize command only. Functions related to the panelized mode of file
  panel move to panel.[ch]. Clean up includes.

  * rename functions:
  cd_panelize_cmd -> panel_panelize_cd
  panelize_change_root -> panel_panelize_change_root
  panelize_absolutize_if_needed -> panel_panelize_absolutize_if_needed
  panelize_save_panel -> panel_panelize_save

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Andrew Borodin 2 years ago
parent
commit
177d1a780c

+ 1 - 1
src/filemanager/filemanager.c

@@ -1262,7 +1262,7 @@ midnight_execute_cmd (Widget * sender, long command)
         break;
 #endif
     case CK_Panelize:
-        cd_panelize_cmd ();
+        panel_panelize_cd ();
         break;
     case CK_Help:
         help_cmd ();

+ 2 - 2
src/filemanager/find.c

@@ -1876,8 +1876,8 @@ do_find (WPanel * panel, const char *start_dir, ssize_t start_dir_len, const cha
         }
 
         panel->is_panelized = TRUE;
-        panelize_absolutize_if_needed (panel);
-        panelize_save_panel (panel);
+        panel_panelize_absolutize_if_needed (panel);
+        panel_panelize_save (panel);
     }
 
     kill_gui ();

+ 141 - 0
src/filemanager/panel.c

@@ -5127,6 +5127,147 @@ panel_get_user_possible_fields (gsize * array_size)
 
 /* --------------------------------------------------------------------------------------------- */
 
+void
+panel_panelize_cd (void)
+{
+    WPanel *panel;
+    int i;
+    dir_list *list;
+    gboolean panelized_same;
+
+    if (!SELECTED_IS_PANEL)
+        create_panel (MENU_PANEL_IDX, view_listing);
+
+    panel = PANEL (get_panel_widget (MENU_PANEL_IDX));
+
+    dir_list_clean (&panel->dir);
+    if (panelized_panel.root_vpath == NULL)
+        panel_panelize_change_root (current_panel->cwd_vpath);
+
+    if (panelized_panel.list.len < 1)
+        dir_list_init (&panelized_panel.list);
+    else if (panelized_panel.list.len > panel->dir.size)
+        dir_list_grow (&panel->dir, panelized_panel.list.len - panel->dir.size);
+
+    list = &panel->dir;
+    list->len = panelized_panel.list.len;
+
+    panelized_same = vfs_path_equal (panelized_panel.root_vpath, panel->cwd_vpath);
+
+    for (i = 0; i < panelized_panel.list.len; i++)
+    {
+        if (panelized_same || DIR_IS_DOTDOT (panelized_panel.list.list[i].fname->str))
+            list->list[i].fname = mc_g_string_dup (panelized_panel.list.list[i].fname);
+        else
+        {
+            vfs_path_t *tmp_vpath;
+
+            tmp_vpath =
+                vfs_path_append_new (panelized_panel.root_vpath,
+                                     panelized_panel.list.list[i].fname->str, (char *) NULL);
+            list->list[i].fname = g_string_new (vfs_path_as_str (tmp_vpath));
+            vfs_path_free (tmp_vpath, TRUE);
+        }
+        list->list[i].f.link_to_dir = panelized_panel.list.list[i].f.link_to_dir;
+        list->list[i].f.stale_link = panelized_panel.list.list[i].f.stale_link;
+        list->list[i].f.dir_size_computed = panelized_panel.list.list[i].f.dir_size_computed;
+        list->list[i].f.marked = panelized_panel.list.list[i].f.marked;
+        list->list[i].st = panelized_panel.list.list[i].st;
+        list->list[i].sort_key = panelized_panel.list.list[i].sort_key;
+        list->list[i].second_sort_key = panelized_panel.list.list[i].second_sort_key;
+    }
+
+    panel->is_panelized = TRUE;
+    panel_panelize_absolutize_if_needed (panel);
+
+    try_to_select (panel, NULL);
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+/**
+ * Change root directory of panelized content.
+ * @param new_root - object with new path.
+ */
+void
+panel_panelize_change_root (const vfs_path_t * new_root)
+{
+    vfs_path_free (panelized_panel.root_vpath, TRUE);
+    panelized_panel.root_vpath = vfs_path_clone (new_root);
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+/**
+ * Conditionally switches a panel's directory to "/" (root).
+ *
+ * If a panelized panel's listing contain absolute paths, this function
+ * sets the panel's directory to "/". Otherwise it does nothing.
+ *
+ * Rationale:
+ *
+ * This makes tokenized strings like "%d/%p" work. This also makes other
+ * places work where such naive concatenation is done in code (e.g., when
+ * pressing ctrl+shift+enter, for CK_PutCurrentFullSelected).
+ *
+ * When to call:
+ *
+ * You should always call this function after you populate the listing
+ * of a panelized panel.
+ */
+void
+panel_panelize_absolutize_if_needed (WPanel * panel)
+{
+    const dir_list *const list = &panel->dir;
+
+    /* Note: We don't support mixing of absolute and relative paths, which is
+     * why it's ok for us to check only the 1st entry. */
+    if (list->len > 1 && g_path_is_absolute (list->list[1].fname->str))
+    {
+        vfs_path_t *root;
+
+        root = vfs_path_from_str (PATH_SEP_STR);
+        panel_set_cwd (panel, root);
+        if (panel == current_panel)
+            mc_chdir (root);
+        vfs_path_free (root, TRUE);
+    }
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+void
+panel_panelize_save (WPanel * panel)
+{
+    int i;
+    dir_list *list = &panel->dir;
+
+    panel_panelize_change_root (current_panel->cwd_vpath);
+
+    if (panelized_panel.list.len > 0)
+        dir_list_clean (&panelized_panel.list);
+    if (panel->dir.len == 0)
+        return;
+
+    if (panel->dir.len > panelized_panel.list.size)
+        dir_list_grow (&panelized_panel.list, panel->dir.len - panelized_panel.list.size);
+    panelized_panel.list.len = panel->dir.len;
+
+    for (i = 0; i < panel->dir.len; i++)
+    {
+        panelized_panel.list.list[i].fname = mc_g_string_dup (list->list[i].fname);
+        panelized_panel.list.list[i].f.link_to_dir = list->list[i].f.link_to_dir;
+        panelized_panel.list.list[i].f.stale_link = list->list[i].f.stale_link;
+        panelized_panel.list.list[i].f.dir_size_computed = list->list[i].f.dir_size_computed;
+        panelized_panel.list.list[i].f.marked = list->list[i].f.marked;
+        panelized_panel.list.list[i].st = list->list[i].st;
+        panelized_panel.list.list[i].sort_key = list->list[i].sort_key;
+        panelized_panel.list.list[i].second_sort_key = list->list[i].second_sort_key;
+    }
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
 void
 panel_init (void)
 {

+ 5 - 0
src/filemanager/panel.h

@@ -194,6 +194,11 @@ char **panel_get_user_possible_fields (gsize * array_size);
 void panel_set_cwd (WPanel * panel, const vfs_path_t * vpath);
 void panel_set_lwd (WPanel * panel, const vfs_path_t * vpath);
 
+void panel_panelize_cd (void);
+void panel_panelize_change_root (const vfs_path_t * new_root);
+void panel_panelize_absolutize_if_needed (WPanel * panel);
+void panel_panelize_save (WPanel * panel);
+
 void panel_init (void);
 void panel_deinit (void);
 

+ 4 - 159
src/filemanager/panelize.c

@@ -31,29 +31,20 @@
 
 #include <config.h>
 
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
 #include "lib/global.h"
 
 #include "lib/skin.h"
+#include "lib/tty/tty.h"
 #include "lib/vfs/vfs.h"
 #include "lib/mcconfig.h"       /* Load/save directories panelize */
 #include "lib/strutil.h"
-#include "lib/util.h"
 #include "lib/widget.h"
 
-#include "src/setup.h"          /* For profile_bname */
 #include "src/history.h"
 
-#include "dir.h"
 #include "filemanager.h"        /* current_panel */
 #include "layout.h"             /* rotate_dash() */
-#include "panel.h"              /* WPanel */
+#include "panel.h"              /* WPanel, dir.h */
 
 #include "panelize.h"
 
@@ -322,7 +313,7 @@ do_external_panelize (char *command)
     /* Clear the counters and the directory list */
     panel_clean_dir (current_panel);
 
-    panelize_change_root (current_panel->cwd_vpath);
+    panel_panelize_change_root (current_panel->cwd_vpath);
 
     dir_list_init (list);
 
@@ -430,163 +421,17 @@ do_external_panelize (char *command)
     mc_pclose (external, NULL);
 
     current_panel->is_panelized = TRUE;
-    panelize_absolutize_if_needed (current_panel);
+    panel_panelize_absolutize_if_needed (current_panel);
 
     try_to_select (current_panel, NULL);
     panel_re_sort (current_panel);
     rotate_dash (FALSE);
 }
 
-/* --------------------------------------------------------------------------------------------- */
-
-static void
-do_panelize_cd (WPanel * panel)
-{
-    int i;
-    dir_list *list;
-    gboolean panelized_same;
-
-    dir_list_clean (&panel->dir);
-    if (panelized_panel.root_vpath == NULL)
-        panelize_change_root (current_panel->cwd_vpath);
-
-    if (panelized_panel.list.len < 1)
-        dir_list_init (&panelized_panel.list);
-    else if (panelized_panel.list.len > panel->dir.size)
-        dir_list_grow (&panel->dir, panelized_panel.list.len - panel->dir.size);
-
-    list = &panel->dir;
-    list->len = panelized_panel.list.len;
-
-    panelized_same = vfs_path_equal (panelized_panel.root_vpath, panel->cwd_vpath);
-
-    for (i = 0; i < panelized_panel.list.len; i++)
-    {
-        if (panelized_same || DIR_IS_DOTDOT (panelized_panel.list.list[i].fname->str))
-            list->list[i].fname = mc_g_string_dup (panelized_panel.list.list[i].fname);
-        else
-        {
-            vfs_path_t *tmp_vpath;
-
-            tmp_vpath =
-                vfs_path_append_new (panelized_panel.root_vpath,
-                                     panelized_panel.list.list[i].fname->str, (char *) NULL);
-            list->list[i].fname = g_string_new (vfs_path_as_str (tmp_vpath));
-            vfs_path_free (tmp_vpath, TRUE);
-        }
-        list->list[i].f.link_to_dir = panelized_panel.list.list[i].f.link_to_dir;
-        list->list[i].f.stale_link = panelized_panel.list.list[i].f.stale_link;
-        list->list[i].f.dir_size_computed = panelized_panel.list.list[i].f.dir_size_computed;
-        list->list[i].f.marked = panelized_panel.list.list[i].f.marked;
-        list->list[i].st = panelized_panel.list.list[i].st;
-        list->list[i].sort_key = panelized_panel.list.list[i].sort_key;
-        list->list[i].second_sort_key = panelized_panel.list.list[i].second_sort_key;
-    }
-
-    panel->is_panelized = TRUE;
-    panelize_absolutize_if_needed (panel);
-
-    try_to_select (panel, NULL);
-}
-
 /* --------------------------------------------------------------------------------------------- */
 /*** public functions ****************************************************************************/
 /* --------------------------------------------------------------------------------------------- */
 
-/**
- * Change root directory of panelized content.
- * @param new_root - object with new path.
- */
-void
-panelize_change_root (const vfs_path_t * new_root)
-{
-    vfs_path_free (panelized_panel.root_vpath, TRUE);
-    panelized_panel.root_vpath = vfs_path_clone (new_root);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-void
-panelize_save_panel (WPanel * panel)
-{
-    int i;
-    dir_list *list = &panel->dir;
-
-    panelize_change_root (current_panel->cwd_vpath);
-
-    if (panelized_panel.list.len > 0)
-        dir_list_clean (&panelized_panel.list);
-    if (panel->dir.len == 0)
-        return;
-
-    if (panel->dir.len > panelized_panel.list.size)
-        dir_list_grow (&panelized_panel.list, panel->dir.len - panelized_panel.list.size);
-    panelized_panel.list.len = panel->dir.len;
-
-    for (i = 0; i < panel->dir.len; i++)
-    {
-        panelized_panel.list.list[i].fname = mc_g_string_dup (list->list[i].fname);
-        panelized_panel.list.list[i].f.link_to_dir = list->list[i].f.link_to_dir;
-        panelized_panel.list.list[i].f.stale_link = list->list[i].f.stale_link;
-        panelized_panel.list.list[i].f.dir_size_computed = list->list[i].f.dir_size_computed;
-        panelized_panel.list.list[i].f.marked = list->list[i].f.marked;
-        panelized_panel.list.list[i].st = list->list[i].st;
-        panelized_panel.list.list[i].sort_key = list->list[i].sort_key;
-        panelized_panel.list.list[i].second_sort_key = list->list[i].second_sort_key;
-    }
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-/**
- * Conditionally switches a panel's directory to "/" (root).
- *
- * If a panelized panel's listing contain absolute paths, this function
- * sets the panel's directory to "/". Otherwise it does nothing.
- *
- * Rationale:
- *
- * This makes tokenized strings like "%d/%p" work. This also makes other
- * places work where such naive concatenation is done in code (e.g., when
- * pressing ctrl+shift+enter, for CK_PutCurrentFullSelected).
- *
- * When to call:
- *
- * You should always call this function after you populate the listing
- * of a panelized panel.
- */
-void
-panelize_absolutize_if_needed (WPanel * panel)
-{
-    const dir_list *const list = &panel->dir;
-
-    /* Note: We don't support mixing of absolute and relative paths, which is
-     * why it's ok for us to check only the 1st entry. */
-    if (list->len > 1 && g_path_is_absolute (list->list[1].fname->str))
-    {
-        vfs_path_t *root;
-
-        root = vfs_path_from_str (PATH_SEP_STR);
-        panel_set_cwd (panel, root);
-        if (panel == current_panel)
-            mc_chdir (root);
-        vfs_path_free (root, TRUE);
-    }
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-void
-cd_panelize_cmd (void)
-{
-    if (!SELECTED_IS_PANEL)
-        create_panel (MENU_PANEL_IDX, view_listing);
-
-    do_panelize_cd (PANEL (get_panel_widget (MENU_PANEL_IDX)));
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
 void
 external_panelize (void)
 {

+ 1 - 4
src/filemanager/panelize.h

@@ -19,10 +19,7 @@ void external_panelize (void);
 void load_panelize (void);
 void save_panelize (void);
 void done_panelize (void);
-void cd_panelize_cmd (void);
-void panelize_save_panel (WPanel * panel);
-void panelize_change_root (const vfs_path_t * new_root);
-void panelize_absolutize_if_needed (WPanel * panel);
 
 /*** inline functions ****************************************************************************/
+
 #endif /* MC__PANELIZE_H */