aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorverdant <im@verdant.ee>2026-07-21 19:01:48 +0800
committerverdant <im@verdant.ee>2026-07-21 19:01:48 +0800
commitf77177e2f3ae27c48151a297dd0a4b36101038a2 (patch)
tree87de2e4ccba7b1ef17f0d1719ea6c966eb524cf9
parent015263141def1a33649fdb0e85c8c137a7d522f2 (diff)
downloadsf-f77177e2f3ae27c48151a297dd0a4b36101038a2.tar.gz
sf-f77177e2f3ae27c48151a297dd0a4b36101038a2.zip
Add display handing functions
Add these functions for initializing and drawing status bar, progress bar and status information
-rw-r--r--display.c53
-rw-r--r--display.h43
2 files changed, 96 insertions, 0 deletions
diff --git a/display.c b/display.c
new file mode 100644
index 0000000..43865a9
--- /dev/null
+++ b/display.c
@@ -0,0 +1,53 @@
+#include "display.h"
+
+#include <curses.h>
+
+#include "err.h"
+#include "log.h"
+#include "mem.h"
+#include "utils.h"
+#include "version.h"
+#include "wm.h"
+
+void color_pair_init() {
+ init_pair(COLOR_PAIR_STATUS_BAR, COLOR_BLACK, COLOR_WHITE);
+ init_pair(COLOR_PAIR_PROGRESS, COLOR_YELLOW, COLOR_BLUE);
+ init_pair(COLOR_PAIR_TEXT_INFO, COLOR_WHITE, COLOR_BLUE);
+ init_pair(COLOR_PAIR_FM_DIR, COLOR_CYAN, COLOR_BLUE);
+ init_pair(COLOR_PAIR_BORDER, COLOR_WHITE, COLOR_BLUE);
+}
+
+terminal *ncurses_init() {
+ initscr();
+ raw();
+ curs_set(0);
+ if (!has_colors()) {
+ log_write(LOG_WARN, "Terminal does not support colors");
+ }
+
+ start_color();
+ color_pair_init();
+ terminal *t = wm_init();
+ return t;
+}
+
+void draw_stat_bar(terminal *t, const char *sys_version) {
+ window *stat_bar =
+ wm_create_new_w(t, "stat_bar", 1, t->maxx, t->maxy - 1, 0);
+ if (!stat_bar || !stat_bar->win) return;
+ wattron(stat_bar->win, COLOR_PAIR(COLOR_PAIR_STATUS_BAR));
+ mvwprintw(stat_bar->win, 0, 0, "%*s", t->maxx, "");
+ mvwprintw(stat_bar->win, 0, 0, "SF v%s | %s", PROGRAM_VERSION, sys_version);
+ wattroff(stat_bar->win, COLOR_PAIR(COLOR_PAIR_STATUS_BAR));
+
+ wrefresh(stat_bar->win);
+}
+
+void wprintw_colorful(WINDOW *w, int attr, const char *format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ wattron(w, COLOR_PAIR(attr));
+ vw_printw(w, format, ap);
+ wattroff(w, COLOR_PAIR(attr));
+ va_end(ap);
+}
diff --git a/display.h b/display.h
new file mode 100644
index 0000000..6cc82f3
--- /dev/null
+++ b/display.h
@@ -0,0 +1,43 @@
+#ifndef SF_DISPLAY_H
+#define SF_DISPLAY_H
+
+#include <ncurses.h>
+#include <stdlib.h>
+
+#include "log.h"
+#include "mem.h"
+
+#define COLOR_PAIR_STATUS_BAR 1
+#define COLOR_PAIR_PROGRESS 2
+#define COLOR_PAIR_TEXT_INFO 3
+#define COLOR_PAIR_FM_DIR 4
+#define COLOR_PAIR_BORDER 5
+
+#define STAT_INFO_WIDTH 15
+#define BAR_LABEL_WIDTH 7
+#define STAT_BAR_HEIGHT 1
+
+#include "wm.h"
+
+void color_pair_init();
+terminal *ncurses_init();
+
+static inline WINDOW *get_root_win(const terminal *t) {
+ if (!t) {
+ log_write(LOG_ERR, "get_root_win: terminal is NULL");
+ return NULL;
+ }
+ if (t->w_count <= 0 || !t->windows[0]) {
+ log_write(LOG_ERR, "get_root_win: windows[0] is not allocated");
+ return NULL;
+ }
+ return t->windows[0]->win;
+}
+
+#define ROOT_WIN get_root_win(t)
+
+void draw_stat_bar(terminal *t, const char *sys_version);
+
+void wprintw_colorful(WINDOW *w, int attr, const char *format, ...);
+
+#endif /* SF_DISPLAY_H */