Fix directory flashing

Fixed an issue whereby the console would flash when browsing files.

Signed-off-by: Mahyar Koshkouei <deltabeard@users.noreply.github.com>
This commit is contained in:
Mahyar Koshkouei
2017-02-19 20:07:27 +00:00
parent ff54a37930
commit 057a13f7a2
3 changed files with 171 additions and 41 deletions

View File

@@ -116,6 +116,81 @@ static int changeFile(const char* ep_file, struct playbackInfo_t* playbackInfo)
return 0; return 0;
} }
static int cmpstringp(const void *p1, const void *p2)
{
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcasecmp(* (char * const *) p1, * (char * const *) p2);
}
/**
* Store the list of files and folders in current director to an array.
*/
static int getDir(struct dirList_t* dirList)
{
DIR *dp;
struct dirent *ep;
int fileNum = 0;
int dirNum = 0;
char* wd = getcwd(NULL, 0);
if(wd == NULL)
goto out;
/* Clear strings */
for(int i = 0; i < dirList->dirNum; i++)
free(dirList->directories[i]);
for(int i = 0; i < dirList->fileNum; i++)
free(dirList->files[i]);
free(dirList->currentDir);
if((dirList->currentDir = strdup(wd)) == NULL)
puts("Failure");
if((dp = opendir(wd)) == NULL)
goto out;
while((ep = readdir(dp)) != NULL)
{
if(ep->d_type == DT_DIR)
{
/* Add more space for another pointer to a dirent struct */
dirList->directories = realloc(dirList->directories, (dirNum + 1) * sizeof(char*));
if((dirList->directories[dirNum] = strdup(ep->d_name)) == NULL)
puts("Failure");
dirNum++;
continue;
}
/* Add more space for another pointer to a dirent struct */
dirList->files = realloc(dirList->files, (fileNum + 1) * sizeof(char*));
if((dirList->files[fileNum] = strdup(ep->d_name)) == NULL)
puts("Failure");
fileNum++;
}
qsort(&dirList->files[0], fileNum, sizeof(char *), cmpstringp);
qsort(&dirList->directories[0], dirNum, sizeof(char *), cmpstringp);
dirList->dirNum = dirNum;
dirList->fileNum = fileNum;
if(closedir(dp) != 0)
goto out;
out:
free(wd);
return fileNum + dirNum;
}
/** /**
* List current directory. * List current directory.
* *
@@ -124,30 +199,24 @@ static int changeFile(const char* ep_file, struct playbackInfo_t* playbackInfo)
* \param select File to show as selected. Must be > 0. * \param select File to show as selected. Must be > 0.
* \return Number of entries listed or negative on error. * \return Number of entries listed or negative on error.
*/ */
static int listDir(int from, int max, int select) static int listDir(int from, int max, int select, struct dirList_t dirList)
{ {
DIR *dp;
struct dirent *ep;
int fileNum = 0; int fileNum = 0;
int listed = 0; int listed = 0;
char* wd = getcwd(NULL, 0);
if(wd == NULL) //consoleClear();
goto err; printf("\033[0;0H");
printf("Dir: %.33s\n", dirList.currentDir);
consoleClear();
printf("Dir: %.33s\n", wd);
if((dp = opendir(wd)) == NULL)
goto err;
if(from == 0) if(from == 0)
{ {
printf("%c../\n", select == 0 ? '>' : ' '); printf("\33[2K%c../\n", select == 0 ? '>' : ' ');
listed++; listed++;
} }
else
max++;
while((ep = readdir(dp)) != NULL) while(dirList.fileNum + dirList.dirNum > fileNum)
{ {
fileNum++; fileNum++;
@@ -156,26 +225,32 @@ static int listDir(int from, int max, int select)
listed++; listed++;
printf("%c%s%.37s%s\n", if(dirList.dirNum >= fileNum)
select == fileNum ? '>' : ' ', {
ep->d_type == DT_DIR ? "\x1b[34;1m" : "", printf("\33[2K%c\x1b[34;1m%.37s/\x1b[0m\n",
ep->d_name, select == fileNum ? '>' : ' ',
ep->d_type == DT_DIR ? "/\x1b[0m" : ""); dirList.directories[fileNum - 1]);
}
/* fileNum must be referring to a file instead of a directory. */
if(dirList.dirNum < fileNum)
{
printf("\33[2K%c%.37s\n",
select == fileNum ? '>' : ' ',
dirList.files[fileNum - dirList.dirNum - 1]);
}
if(fileNum == max + from) if(fileNum == max + from)
break; break;
} }
if(closedir(dp) != 0) /* TODO: Remove crappy bodge to stop last line from not being cleared. */
goto err; if(from != 0)
printf("\33[2K");
out:
free(wd);
return listed; return listed;
err:
listed = -1;
goto out;
} }
/** /**
@@ -219,6 +294,7 @@ int main(int argc, char **argv)
struct errInfo_t errInfo; struct errInfo_t errInfo;
struct playbackInfo_t playbackInfo; struct playbackInfo_t playbackInfo;
volatile int error = 0; volatile int error = 0;
struct dirList_t dirList = {NULL, 0, NULL, 0, NULL};
gfxInitDefault(); gfxInitDefault();
sdmcInit(); sdmcInit();
@@ -241,7 +317,18 @@ int main(int argc, char **argv)
chdir(DEFAULT_DIR); chdir(DEFAULT_DIR);
chdir("MUSIC"); chdir("MUSIC");
if(listDir(from, MAX_LIST, 0) < 0)
consoleSelect(&topScreen);
if(getDir(&dirList) > 0)
{
printf("Fourth/%d file: %s\n", dirList.dirNum, dirList.files[3]);
}
else
puts("didn't work");
consoleSelect(&bottomScreen);
if(listDir(from, MAX_LIST, 0, dirList) < 0)
{ {
err_print("Unable to list directory."); err_print("Unable to list directory.");
goto err; goto err;
@@ -329,7 +416,7 @@ int main(int argc, char **argv)
if(fileMax - fileNum > 26 && from != 0) if(fileMax - fileNum > 26 && from != 0)
from--; from--;
if(listDir(from, MAX_LIST, fileNum) < 0) if(listDir(from, MAX_LIST, fileNum, dirList) < 0)
err_print("Unable to list directory."); err_print("Unable to list directory.");
} }
@@ -343,7 +430,7 @@ int main(int argc, char **argv)
from < fileMax - MAX_LIST) from < fileMax - MAX_LIST)
from++; from++;
if(listDir(from, MAX_LIST, fileNum) < 0) if(listDir(from, MAX_LIST, fileNum, dirList) < 0)
err_print("Unable to list directory."); err_print("Unable to list directory.");
} }
@@ -366,7 +453,7 @@ int main(int argc, char **argv)
from = 0; from = 0;
} }
if(listDir(from, MAX_LIST, fileNum) < 0) if(listDir(from, MAX_LIST, fileNum, dirList) < 0)
err_print("Unable to list directory."); err_print("Unable to list directory.");
} }
@@ -389,10 +476,18 @@ int main(int argc, char **argv)
from = fileMax - MAX_LIST; from = fileMax - MAX_LIST;
} }
if(listDir(from, MAX_LIST, fileNum) < 0) if(listDir(from, MAX_LIST, fileNum, dirList) < 0)
err_print("Unable to list directory."); err_print("Unable to list directory.");
} }
if(kDown)
{
consoleSelect(&topScreen);
printf("dirNum: %d fileNum: %d fileSelected: %d\n",
dirList.dirNum, dirList.fileNum, fileNum);
consoleSelect(&bottomScreen);
}
/* /*
* Pressing B goes up a folder, as well as pressing A or R when ".." * Pressing B goes up a folder, as well as pressing A or R when ".."
* is selected. * is selected.
@@ -401,12 +496,13 @@ int main(int argc, char **argv)
((kDown & KEY_A) && (from == 0 && fileNum == 0))) ((kDown & KEY_A) && (from == 0 && fileNum == 0)))
{ {
chdir(".."); chdir("..");
consoleClear();
fileMax = getDir(&dirList);
fileNum = 0; fileNum = 0;
from = 0; from = 0;
fileMax = getNumberFiles();
if(listDir(from, MAX_LIST, fileNum) < 0) if(listDir(from, MAX_LIST, fileNum, dirList) < 0)
err_print("Unable to list directory."); err_print("Unable to list directory.");
continue; continue;
@@ -414,6 +510,31 @@ int main(int argc, char **argv)
if(kDown & KEY_A) if(kDown & KEY_A)
{ {
if(dirList.dirNum >= fileNum)
{
consoleSelect(&topScreen);
printf("Changing to %s directory\n", dirList.directories[fileNum - 1]);
consoleSelect(&bottomScreen);
chdir(dirList.directories[fileNum - 1]);
consoleClear();
fileMax = getDir(&dirList);
fileNum = 0;
from = 0;
if(listDir(from, MAX_LIST, fileNum, dirList) < 0)
err_print("Unable to list directory.");
continue;
}
if(dirList.dirNum < fileNum)
{
consoleSelect(&topScreen);
printf("Attempting to play %s\n", dirList.files[fileNum - dirList.dirNum - 1]);
changeFile(dirList.files[fileNum - dirList.dirNum - 1], &playbackInfo);
consoleSelect(&bottomScreen);
continue;
}
#if 0
int audioFileNum = 0; int audioFileNum = 0;
DIR *dp; DIR *dp;
struct dirent *ep; struct dirent *ep;
@@ -439,7 +560,7 @@ int main(int argc, char **argv)
fileNum = 0; fileNum = 0;
from = 0; from = 0;
fileMax = getNumberFiles(); fileMax = getNumberFiles();
if(listDir(from, MAX_LIST, fileNum) < 0) if(listDir(from, MAX_LIST, fileNum, dirList) < 0)
err_print("Unable to list directory."); err_print("Unable to list directory.");
closedir(dp); closedir(dp);
@@ -455,13 +576,9 @@ int main(int argc, char **argv)
} }
else else
err_print("Unable to open directory."); err_print("Unable to open directory.");
#endif
} }
} }
#ifdef DEBUG
consoleSelect(&topScreen);
printf("\rNum: %d, Max: %d, from: %d ", fileNum, fileMax, from);
consoleSelect(&bottomScreen);
#endif
out: out:
puts("Exiting..."); puts("Exiting...");

View File

@@ -7,6 +7,8 @@
* LICENSE file. * LICENSE file.
*/ */
#include <3ds.h>
#ifndef ctrmus_main_h #ifndef ctrmus_main_h
#define ctrmus_main_h #define ctrmus_main_h
@@ -22,6 +24,17 @@ struct watchdogInfo
struct errInfo_t* errInfo; struct errInfo_t* errInfo;
}; };
struct dirList_t
{
char** files;
int fileNum;
char** directories;
int dirNum;
char* currentDir;
};
/** /**
* Allows the playback thread to return any error messages that it may * Allows the playback thread to return any error messages that it may
* encounter. * encounter.