mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 20:36:50 +03:00
Use events to check timestamp of panel directories
...instead of direct access to panels in VGS GC. Inlcudes clean up. Signed-off-by: Andrew Borodin <aborodin@vmail.ru> Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
parent
6016620f42
commit
4005b7924e
@ -1,6 +1,8 @@
|
||||
#ifndef MC__EVENT_TYPES_H
|
||||
#define MC__EVENT_TYPES_H
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
/*** typedefs(not structures) and defined constants **********************************************/
|
||||
|
||||
/* Event groups for main modules */
|
||||
@ -14,6 +16,16 @@
|
||||
|
||||
/*** structures declarations (and typedefs of structures)*****************************************/
|
||||
|
||||
|
||||
/* MCEVENT_GROUP_CORE:vfs_timestamp */
|
||||
struct vfs_class;
|
||||
typedef struct
|
||||
{
|
||||
struct vfs_class *vclass;
|
||||
gpointer id;
|
||||
gboolean ret;
|
||||
} ev_vfs_stamp_create_t;
|
||||
|
||||
/*** global variables defined in .c file *********************************************************/
|
||||
|
||||
/*** declarations of public functions ************************************************************/
|
||||
|
59
lib/vfs/gc.c
59
lib/vfs/gc.c
@ -33,18 +33,12 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* For atol() */
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h> /* is_digit() */
|
||||
#include <sys/time.h> /* gettimeofday() */
|
||||
|
||||
#include "lib/global.h"
|
||||
|
||||
#include "src/filemanager/midnight.h" /* current_panel */
|
||||
#include "lib/event.h"
|
||||
|
||||
#include "vfs.h"
|
||||
#include "utilvfs.h"
|
||||
@ -173,58 +167,35 @@ vfs_stamp_path (const char *path)
|
||||
*/
|
||||
|
||||
void
|
||||
vfs_stamp_create (struct vfs_class *oldvfs, vfsid oldvfsid)
|
||||
vfs_stamp_create (struct vfs_class *vclass, vfsid id)
|
||||
{
|
||||
struct vfs_class *nvfs, *n2vfs, *n3vfs;
|
||||
vfsid nvfsid, n2vfsid, n3vfsid;
|
||||
struct vfs_class *nvfs;
|
||||
vfsid nvfsid;
|
||||
|
||||
ev_vfs_stamp_create_t event_data = { vclass, id, FALSE };
|
||||
|
||||
/* There are three directories we have to take care of: current_dir,
|
||||
current_panel->cwd and other_panel->cwd. Athough most of the time either
|
||||
current_dir and current_panel->cwd or current_dir and other_panel->cwd are the
|
||||
same, it's possible that all three are different -- Norbert */
|
||||
|
||||
if (current_panel == NULL)
|
||||
if (!mc_event_present (MCEVENT_GROUP_CORE, "vfs_timestamp"))
|
||||
return;
|
||||
|
||||
nvfs = vfs_get_class (vfs_get_current_dir ());
|
||||
nvfsid = vfs_getid (nvfs, vfs_get_current_dir ());
|
||||
vfs_rmstamp (nvfs, nvfsid);
|
||||
|
||||
if ((nvfs == oldvfs && nvfsid == oldvfsid) || oldvfsid == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (get_current_type () == view_listing)
|
||||
{
|
||||
n2vfs = vfs_get_class (current_panel->cwd);
|
||||
n2vfsid = vfs_getid (n2vfs, current_panel->cwd);
|
||||
if (n2vfs == oldvfs && n2vfsid == oldvfsid)
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
n2vfs = NULL;
|
||||
n2vfsid = NULL;
|
||||
}
|
||||
|
||||
if (get_other_type () == view_listing)
|
||||
{
|
||||
n3vfs = vfs_get_class (other_panel->cwd);
|
||||
n3vfsid = vfs_getid (n3vfs, other_panel->cwd);
|
||||
if (n3vfs == oldvfs && n3vfsid == oldvfsid)
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
n3vfs = NULL;
|
||||
n3vfsid = NULL;
|
||||
}
|
||||
|
||||
if (!oldvfs || !oldvfs->nothingisopen || !(*oldvfs->nothingisopen) (oldvfsid))
|
||||
if (id == NULL || (nvfs == vclass && nvfsid == id))
|
||||
return;
|
||||
|
||||
vfs_addstamp (oldvfs, oldvfsid);
|
||||
mc_event_raise (MCEVENT_GROUP_CORE, "vfs_timestamp", (gpointer) &event_data);
|
||||
|
||||
if (event_data.ret)
|
||||
return;
|
||||
|
||||
if (vclass != NULL && vclass->nothingisopen != NULL && vclass->nothingisopen (id) != 0)
|
||||
vfs_addstamp (vclass, id);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -57,6 +57,8 @@
|
||||
#include "src/learn.h" /* learn_keys() */
|
||||
#include "src/execute.h" /* suspend_cmd() */
|
||||
#include "src/keybind-defaults.h"
|
||||
#include "lib/keybind.h"
|
||||
#include "lib/event.h"
|
||||
|
||||
#include "option.h" /* configure_box() */
|
||||
#include "tree.h"
|
||||
@ -66,7 +68,6 @@
|
||||
#include "hotlist.h"
|
||||
#include "panelize.h"
|
||||
#include "command.h" /* cmdline */
|
||||
#include "lib/keybind.h"
|
||||
|
||||
#include "chmod.h"
|
||||
#include "chown.h"
|
||||
@ -487,6 +488,66 @@ translated_mc_chdir (char *dir)
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
#if ENABLE_VFS
|
||||
|
||||
/* event helper */
|
||||
static gboolean
|
||||
check_panel_timestamp (WPanel * panel, panel_view_mode_t mode, struct vfs_class *vclass, vfsid id)
|
||||
{
|
||||
if (mode == view_listing)
|
||||
{
|
||||
struct vfs_class *nvfs;
|
||||
vfsid nvfsid;
|
||||
nvfs = vfs_get_class (panel->cwd);
|
||||
if (nvfs != vclass)
|
||||
return FALSE;
|
||||
nvfsid = vfs_getid (nvfs, panel->cwd);
|
||||
if (nvfsid == id)
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* event callback */
|
||||
static gboolean
|
||||
check_current_panel_timestamp (const gchar * event_group_name, const gchar * event_name,
|
||||
gpointer init_data, gpointer data)
|
||||
{
|
||||
ev_vfs_stamp_create_t *event_data = (ev_vfs_stamp_create_t *) data;
|
||||
|
||||
(void) event_group_name;
|
||||
(void) event_name;
|
||||
(void) init_data;
|
||||
|
||||
event_data->ret =
|
||||
check_panel_timestamp (current_panel, get_current_type (), event_data->vclass,
|
||||
event_data->id);
|
||||
return !event_data->ret;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* event callback */
|
||||
static gboolean
|
||||
check_other_panel_timestamp (const gchar * event_group_name, const gchar * event_name,
|
||||
gpointer init_data, gpointer data)
|
||||
{
|
||||
ev_vfs_stamp_create_t *event_data = (ev_vfs_stamp_create_t *) data;
|
||||
|
||||
(void) event_group_name;
|
||||
(void) event_name;
|
||||
(void) init_data;
|
||||
|
||||
event_data->ret =
|
||||
check_panel_timestamp (other_panel, get_other_type (), event_data->vclass, event_data->id);
|
||||
return !event_data->ret;
|
||||
}
|
||||
#endif /* ENABLE_VFS */
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
create_panels (void)
|
||||
{
|
||||
@ -534,16 +595,18 @@ create_panels (void)
|
||||
set_display_type (other_index, other_mode);
|
||||
|
||||
if (startup_left_mode == view_listing)
|
||||
{
|
||||
current_panel = left_panel;
|
||||
}
|
||||
else if (right_panel != NULL)
|
||||
current_panel = right_panel;
|
||||
else
|
||||
{
|
||||
if (right_panel)
|
||||
current_panel = right_panel;
|
||||
else
|
||||
current_panel = left_panel;
|
||||
}
|
||||
current_panel = left_panel;
|
||||
|
||||
#if ENABLE_VFS
|
||||
mc_event_add (MCEVENT_GROUP_CORE, "vfs_timestamp", check_other_panel_timestamp, NULL,
|
||||
NULL);
|
||||
mc_event_add (MCEVENT_GROUP_CORE, "vfs_timestamp", check_current_panel_timestamp, NULL,
|
||||
NULL);
|
||||
#endif /* ENABLE_VFS */
|
||||
|
||||
/* Create the nice widgets */
|
||||
cmdline = command_new (0, 0, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user