diff --git a/dir.c b/dir.c index b431a14..264c927 100644 --- a/dir.c +++ b/dir.c @@ -192,42 +192,11 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file offset_vertical = selected_file_current - (terminal_height/3)*2; } } + } else { + offset_front = 0; } for (i = offset_vertical; i < *dir_file_count && i < (terminal_height + offset_vertical); i++) { - /* shortens the printed file name if it is too long - * example input: aaaaaaaa.txt - * example output: aaa~.txt - * if no extension is found, the name will truncate */ - char *file_name; - unsigned long file_name_width = strlen(dir_content[i].file_name); - if ((file_name_width + offset_front + is_selected) > line_width - 3) { - char *extension = strrchr(dir_content[i].file_name, '.'); - if (extension) { - int char_offset = (file_name_width + offset_front + is_selected) - (line_width - 3) ; - if ((file_name_width - char_offset - strlen(extension) - 1) > 1) { - file_name = malloc(file_name_width - char_offset + 1); - memcpy(file_name, dir_content[i].file_name, file_name_width - char_offset); - memcpy(file_name + (file_name_width - char_offset - strlen(extension)), extension, strlen(extension)); - file_name[file_name_width - char_offset - strlen(extension) - 1] = '~'; - file_name[file_name_width - char_offset] = '\0'; - } else { - file_name = malloc(strlen(extension)+1); - file_name[0] = '~'; - memcpy(file_name+1, extension, strlen(extension)); - file_name[strlen(extension)] = '\0'; - } - } else { - file_name = malloc(file_name_width+1); - memcpy(file_name, dir_content[i].file_name, file_name_width); - file_name[file_name_width] = '\0'; - } - - } else { - file_name = malloc(file_name_width+1); - memcpy(file_name, dir_content[i].file_name, file_name_width); - file_name[file_name_width] = '\0'; - } if (print_info) { @@ -248,7 +217,8 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file } else { offset_back = line_width - (snprintf(NULL,0,"%0.2lf %c", printed_size, size_char) + 1); } - + } else { + offset_back = line_width; } if (dir_content[i].status & FILE_STATUS_SELECTED) { @@ -267,6 +237,37 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file wattroff(win, A_REVERSE); } + + + /* shortens the printed file name if it is too long + * example input: aaaaaaaa.txt + * example output: aaa~.txt + * if no extension is found, the name will truncate */ + char *file_name; + unsigned long printable_size = (offset_back - is_selected - offset_front); + if (strlen(dir_content[i].file_name) > printable_size) { + char *extension = strrchr(dir_content[i].file_name, '.'); + if (extension && extension != dir_content[i].file_name) { + file_name = malloc(printable_size); + printable_size -= strlen(extension); + + memcpy(file_name, dir_content[i].file_name, printable_size); + memcpy(file_name + printable_size-1, extension, strlen(extension)); + file_name[printable_size + strlen(extension)-1] = '\0'; + file_name[printable_size - 2] = '~'; + } else { + file_name = malloc(printable_size-1); + memcpy(file_name, dir_content[i].file_name, printable_size); + file_name[printable_size-2] = '~'; + file_name[printable_size-1] = '\0'; + } + } else { + file_name = malloc(strlen(dir_content[i].file_name)+1); + memcpy(file_name, dir_content[i].file_name, strlen(dir_content[i].file_name)+1); + } + + + mvwaddstr(win, i-offset_vertical, 0, bg); if(print_info) { #if SETTINGS_LINE_NUMBERS == 2 @@ -300,7 +301,6 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file #endif mvwaddnstr(win, i-offset_vertical, offset_front+is_selected, file_name, line_width-offset_front-is_selected-2); - free(file_name); if (dir_content[i].file_type &= FILE_TYPE_DIR) { mvwprintw(win, i-offset_vertical, offset_back, "%ld", dir_content[i].file_size); @@ -311,8 +311,8 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file } } else { mvwaddnstr(win, i-offset_vertical, 0, file_name, line_width); - free(file_name); } + free(file_name); if (dir_content[i].status & FILE_STATUS_SELECTED) { wattroff(win, COLOR_PAIR(8));