mirror of
https://github.com/MidnightCommander/mc
synced 2025-01-08 20:41:59 +03:00
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>
This commit is contained in:
parent
57c61b7681
commit
177d1a780c
@ -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 ();
|
||||
|
@ -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 ();
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user