88 lines
2.4 KiB
Diff
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));
|
|
--
|