#include #include #include #include "defines.h" static FILE *ueberzug = NULL; extern unsigned int terminal_height; extern unsigned int terminal_width; char previewd; char* text(char *path, unsigned long *file_size); void images_print(char *file_name); void images_clear(); char* generic(char *path); char* get_mimetype(char *path){ static char *cmd_str = "file --mime-type -b ./\""; unsigned long cmd_len = strlen(cmd_str); unsigned int path_len = strlen(path); char *cmd = malloc((cmd_len + path_len) + 2); memset(cmd, ' ', cmd_len + path_len); memcpy(cmd, cmd_str, cmd_len); memcpy(cmd + cmd_len, path, path_len); cmd[cmd_len + path_len] = '\"'; cmd[cmd_len + path_len + 1] = '\0'; FILE *cmd_open = popen(cmd, "r"); char *line = NULL; size_t size = 0; if (getline(&line, &size, cmd_open) != -1){ pclose(cmd_open); return line; } else { pclose(cmd_open); return "unknown"; } } char* preview_file(char *file_name, unsigned long file_size){ /* this calls "file" on path */ char *file_buffer; char *mime = get_mimetype(file_name); if (strstr(mime, "text")) { file_buffer = text(file_name, &file_size); } else { file_buffer = generic(file_name); } if (strstr(mime, "image")) { images_print(file_name); previewd = 1; } else { images_clear(); } free(mime); return file_buffer; } char* text(char *path, unsigned long *file_size){ char *file_buffer = malloc(*file_size + 1); FILE *fp = fopen(path, "r"); if (fread(file_buffer, *file_size, 1, fp) != 0) { file_buffer[*file_size] = '\0'; return file_buffer; } else { return "failed reading file"; } } void images_clear() { if (previewd == 1) { fprintf(ueberzug, "{\"action\": \"remove\", \ \"identifier\": \"preview\"}\n"); fflush(ueberzug); previewd = 0; } } void images_print(char *file_name) { char *path=getcwd(NULL, 0); fprintf(ueberzug, "{\"action\": \"remove\", \ \"identifier\": \"preview\"}\n"); fprintf(ueberzug, "{\"action\":\"add\", \ \"identifier\":\"preview\", \ \"max_height\":%d, \ \"max_width\":%d, \ \"y\":0, \ \"x\":%d, \ \"path\":\"%s/%s\"}\n", terminal_height, terminal_width/2, terminal_width/2, path, file_name); fflush(ueberzug); free(path); } char* generic(char *path){ char *cmd = concat("file ./\"", path); cmd = concat(cmd, "\""); FILE *cmd_open = popen(cmd, "r"); char *line = NULL; size_t size = 0; if (getline(&line, &size, cmd_open) != -1) { pclose(cmd_open); return line; } else { pclose(cmd_open); return "failed executing shell command \"file\""; } } void ueberzug_init(){ ueberzug = popen("ueberzug layer -s ", "w"); }