ccc/patches/image-preview.patch
2024-11-21 12:06:27 +00:00

88 lines
2.4 KiB
Diff

From: night0721 <night@night0721.xyz>
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 <termios.h>
#include <time.h>
+#include <sixel.h>
+
#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));
--