added unicode support
This commit is contained in:
107
backend.c
107
backend.c
@@ -148,102 +148,79 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
|
||||
void print_dir(WINDOW *win, unsigned long *line_width, unsigned long *dir_file_count, file *dir_content){
|
||||
/* i am not proud of this function */
|
||||
|
||||
char *hover_bg = malloc(*line_width+1);
|
||||
memset(hover_bg, ' ', *line_width);
|
||||
hover_bg[*line_width] = '\0';
|
||||
char *bg = malloc(*line_width);
|
||||
memset(bg, ' ', *line_width);
|
||||
bg[*line_width] = '\0';
|
||||
|
||||
unsigned long i = 0;
|
||||
unsigned long j = 0;
|
||||
float file_size = 0;
|
||||
float file_size;
|
||||
float printed_size = 0;
|
||||
char size_char = ' ';
|
||||
char is_selected = 0;
|
||||
static const char sizes[6] = { 'B', 'K', 'M', 'G', 'T', 'P' };
|
||||
|
||||
unsigned long offset_back;
|
||||
unsigned long offset_front = 2;
|
||||
if (*dir_file_count > 9) {
|
||||
offset_front = (snprintf(NULL, 0, "%ld", *dir_file_count)) + 1;
|
||||
}
|
||||
for (i = file_offset; i < *dir_file_count && i < terminal_height; i++) {
|
||||
unsigned long offset_back;
|
||||
file_size = dir_content[i].file_size;
|
||||
char size_index = 0;
|
||||
while (file_size > 1) {
|
||||
printed_size=file_size;
|
||||
file_size /= 1024;
|
||||
size_index++;
|
||||
if (size_index >= 6) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
size_char = sizes[size_index-1];
|
||||
if (dir_content[i].file_type == FILE_TYPE_DIR || dir_content[i].file_type == FILE_TYPE_SYMLINK) {
|
||||
offset_back = *line_width - (snprintf(NULL,0,"%ld",dir_content[i].file_size) + 1);
|
||||
offset_back = *line_width - (snprintf(NULL,0,"%ld", dir_content[i].file_size) + 1);
|
||||
} else if (size_char =='B') {
|
||||
offset_back = *line_width - (snprintf(NULL,0,"%0.0lf %c", printed_size, size_char) + 1);
|
||||
} else {
|
||||
file_size = dir_content[i].file_size;
|
||||
long passes = 0;
|
||||
while (file_size > 1 || passes > sizeof(sizes)) {
|
||||
printed_size = file_size;
|
||||
file_size /= 1024;
|
||||
passes++;
|
||||
}
|
||||
if (passes) {
|
||||
size_char = sizes[passes-1];
|
||||
} else {
|
||||
size_char = sizes[0];
|
||||
}
|
||||
if (size_char == 'B') {
|
||||
offset_back = *line_width - (snprintf(NULL,0,"%0.0lf %c", printed_size, size_char) + 1);
|
||||
} else {
|
||||
offset_back = *line_width - (snprintf(NULL,0,"%0.2lf %c", printed_size, size_char) + 1);
|
||||
}
|
||||
|
||||
offset_back = *line_width - (snprintf(NULL,0,"%0.2lf %c", printed_size, size_char) + 1);
|
||||
}
|
||||
|
||||
if (dir_content[i].status & FILE_STATUS_SELECTED) {
|
||||
is_selected = 1;
|
||||
wattron(win, COLOR_PAIR(8));
|
||||
} else {
|
||||
is_selected = 0;
|
||||
}
|
||||
|
||||
mvwaddnstr(win, i, 0, bg, offset_front+is_selected);
|
||||
if (dir_content[i].status & FILE_STATUS_SELECTED) {
|
||||
wattron(win, COLOR_PAIR(8));
|
||||
} else {
|
||||
wattron(win, COLOR_PAIR(dir_content[i].color_pair));
|
||||
}
|
||||
if (dir_content[i].status & FILE_STATUS_HOVER) {
|
||||
wattron(win, A_REVERSE);
|
||||
}
|
||||
|
||||
mvwaddstr(win, i, 0, bg);
|
||||
mvwprintw(win, i, 0, "%ld", i);
|
||||
mvwaddnstr(win, i, offset_front+is_selected, dir_content[i].file_name, *line_width);
|
||||
if (dir_content[i].file_type == FILE_TYPE_DIR || dir_content[i].file_type == FILE_TYPE_SYMLINK) {
|
||||
mvwprintw(win, i, offset_back, "%ld", dir_content[i].file_size);
|
||||
}else if (size_char =='B') {
|
||||
mvwprintw(win, i, offset_back, "%0.0lf %c", printed_size, size_char);
|
||||
} else {
|
||||
mvwprintw(win, i, offset_back, "%0.2lf %c", printed_size, size_char);
|
||||
}
|
||||
|
||||
if (dir_content[i].status & FILE_STATUS_HOVER) {
|
||||
wattron(win, A_REVERSE);
|
||||
mvwprintw(win, i, 0, "%s", hover_bg);
|
||||
mvwprintw(win, i, 0, "%ld", i);
|
||||
|
||||
for (j = 0; j < dir_content[i].file_name_width ;j++) {
|
||||
if (j >= offset_back-1) {
|
||||
mvwaddch(win, i, j, '~');
|
||||
break;
|
||||
}
|
||||
mvwaddch(win, i, offset_front+j+is_selected, dir_content[i].file_name[j]);
|
||||
}
|
||||
if (dir_content[i].file_type == FILE_TYPE_DIR || dir_content[i].file_type == FILE_TYPE_SYMLINK) {
|
||||
mvwprintw(win, i, offset_back, "%ld", dir_content[i].file_size);
|
||||
} else {
|
||||
if (size_char == 'B') {
|
||||
mvwprintw(win, i, offset_back, "%0.0lf %c", printed_size, size_char);
|
||||
} else {
|
||||
mvwprintw(win, i, offset_back, "%0.2lf %c", printed_size, size_char);
|
||||
}
|
||||
}
|
||||
wattroff(win, A_REVERSE);
|
||||
} else {
|
||||
mvwprintw(win, i, 0, "%ld", i);
|
||||
for (j = 0; j < dir_content[i].file_name_width ;j++) {
|
||||
if (j >= offset_back-1) {
|
||||
mvwaddch(win, i, j, '~');
|
||||
break;
|
||||
}
|
||||
mvwaddch(win, i, offset_front+j+is_selected, dir_content[i].file_name[j]);
|
||||
}
|
||||
if (dir_content[i].file_type == FILE_TYPE_DIR || dir_content[i].file_type == FILE_TYPE_SYMLINK) {
|
||||
mvwprintw(win, i, offset_back, "%ld", dir_content[i].file_size);
|
||||
} else {
|
||||
if (size_char == 'B') {
|
||||
mvwprintw(win, i, offset_back, "%0.0lf %c", printed_size, size_char);
|
||||
} else {
|
||||
mvwprintw(win, i, offset_back, "%0.2lf %c", printed_size, size_char);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dir_content[i].status & FILE_STATUS_SELECTED) {
|
||||
wattroff(win, COLOR_PAIR(8));
|
||||
} else {
|
||||
wattroff(win, COLOR_PAIR(dir_content[i].color_pair));
|
||||
}
|
||||
|
||||
}
|
||||
free(hover_bg);
|
||||
free(bg);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user