From: night0721 Date: Thu, 21 Nov 2024 12:04:40 +0000 Subject: [PATCH] Image preview support with libsixel --- Makefile | 4 +++- ccc.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2d4cde2..b7d9f80 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,9 @@ PREFIX ?= /usr/local BINDIR = $(PREFIX)/bin MANDIR = $(PREFIX)/share/man/man1 -CFLAGS = -Os -march=native -mtune=native -pipe -s -flto -std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 +LDFLAGS != pkg-config --libs libsixel +INCFLAGS != pkg-config --cflags libsixel +CFLAGS = -Os -march=native -mtune=native -pipe -s -flto -std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 $(INCFLAGS) SRC = ccc.c util.c file.c icons.c diff --git a/ccc.c b/ccc.c index c3df5ff..2e3cc14 100644 --- a/ccc.c +++ b/ccc.c @@ -13,6 +13,8 @@ #include #include +#include + #include "icons.h" #include "file.h" #include "util.h" @@ -921,12 +923,14 @@ void show_file_content(void) int c; /* Check if its binary */ + if (strstr(current_file.name, ".jpg") == NULL && strstr(current_file.name, ".png") == NULL) { while ((c = fgetc(file)) != EOF) { if (c == '\0') { bprintf("binary"); return; } } + } int pipe_fd[2]; if (pipe(pipe_fd) == -1) { perror("pipe"); @@ -936,14 +940,26 @@ void show_file_content(void) if (pid == 0) { /* Child */ move_cursor(1, half_width); + if (strstr(current_file.name, ".jpg") || strstr(current_file.name, ".png")) { + sixel_encoder_t *encoder = NULL; + sixel_encoder_new(&encoder, NULL); + /* Should be enough for most terminal */ + char width[5]; + snprintf(width, 5, "%d", (cols - half_width) * 6); + sixel_encoder_setopt(encoder, 'w', width); + sixel_encoder_encode(encoder, current_file.name); + sixel_encoder_unref(encoder); + } else { close(pipe_fd[0]); dup2(pipe_fd[1], STDOUT_FILENO); dup2(pipe_fd[1], STDERR_FILENO); close(pipe_fd[1]); execlp("vip", "vip", "-c", current_file.name, NULL); + } _exit(1); } else if (pid > 0) { /* Parent */ + if (!strstr(current_file.name, ".jpg") && !strstr(current_file.name, ".png")) { close(pipe_fd[1]); char buffer[4096]; int row = 1; @@ -988,6 +1004,7 @@ void show_file_content(void) } } fclose(stream); + } waitpid(pid, NULL, 0); } else { wpprintw("fork failed: %s", strerror(errno)); --