Use existing buffer to (un)select file names

This commit is contained in:
Arun Prakash Jana 2021-05-11 03:07:55 +05:30
parent 9b6e7e86bc
commit e4c3f7d739
No known key found for this signature in database
GPG Key ID: A75979F35C080412
2 changed files with 63 additions and 40 deletions

View File

@ -11,5 +11,5 @@ CheckOptions:
- key: fuchsia-restrict-system-includes.Includes
value: '*,-stdint.h,-stdbool.h'
- key: readability-function-size.StatementThreshold
value: '925'
value: '900'
...

101
src/nnn.c
View File

@ -1458,15 +1458,68 @@ static void startselection(void)
}
}
static void updateselbuf(const char *path, char *newpath)
static size_t appendslash(char *path)
{
size_t r;
for (int i = 0; i < ndents; ++i)
if (pdents[i].flags & FILE_SELECTED) {
r = mkpath(path, pdents[i].name, newpath);
appendfpath(newpath, r);
size_t len = 1;
if (path[1] != '\0') {
len = xstrlen(path);
path[len] = '/';
++len;
}
return len;
}
static void invertselbuf(char *path, bool toggle)
{
selbufpos = lastappendpos;
if (!nselected) {
writesel(NULL, 0);
return;
}
size_t len = appendslash(path);
for (int i = 0; i < ndents; ++i) {
if (toggle) { /* Toggle selection status */
pdents[i].flags ^= FILE_SELECTED;
pdents[i].flags & FILE_SELECTED ? ++nselected : --nselected;
}
if (pdents[i].flags & FILE_SELECTED)
appendfpath(path, len + xstrsncpy(path + len, pdents[i].name, PATH_MAX - len));
}
if (len > 1)
--len;
path[len] = '\0';
writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
}
static void addtoselbuf(char *path, int startid, int endid)
{
size_t len = appendslash(path);
/* Remember current selection buffer position */
for (int i = startid; i <= endid; ++i) {
if (!(pdents[i].flags & FILE_SELECTED)) {
/* Write the path to selection file to avoid flush */
appendfpath(path, len + xstrsncpy(path + len, pdents[i].name, PATH_MAX - len));
pdents[i].flags |= FILE_SELECTED;
++nselected;
}
}
if (len > 1)
--len;
path[len] = '\0';
writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
}
/* Finish selection procedure before an operation */
@ -6617,12 +6670,8 @@ nochange:
appendfpath(newpath, mkpath(path, pdents[cur].name, newpath));
writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
} else {
selbufpos = lastappendpos;
if (--nselected) {
updateselbuf(path, newpath);
writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
} else
writesel(NULL, 0);
--nselected;
invertselbuf(path, FALSE);
}
#ifndef NOX11
@ -6693,33 +6742,7 @@ nochange:
selendid = ndents - 1;
}
if (sel == SEL_SELINV) {
/* Toggle selection status */
for (r = selstartid; r <= selendid; ++r) {
pdents[r].flags ^= FILE_SELECTED;
pdents[r].flags & FILE_SELECTED ? ++nselected : --nselected;
}
selbufpos = lastappendpos;
if (nselected) {
updateselbuf(path, newpath);
writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
} else
writesel(NULL, 0);
} else {
/* Remember current selection buffer position */
for (r = selstartid; r <= selendid; ++r) {
if (!(pdents[r].flags & FILE_SELECTED)) {
/* Write the path to selection file to avoid flush */
appendfpath(newpath, mkpath(path, pdents[r].name, newpath));
pdents[r].flags |= FILE_SELECTED;
++nselected;
}
}
writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
}
(sel == SEL_SELINV) ? invertselbuf(path, TRUE) : addtoselbuf(path, selstartid, selendid);
#ifndef NOX11
if (cfg.x11)