diff options
| author | verdant <im@verdant.ee> | 2026-07-28 18:30:16 +0800 |
|---|---|---|
| committer | verdant <im@verdant.ee> | 2026-07-28 18:30:16 +0800 |
| commit | 9bffcafa9ae0c38103a8c64b3482bb099e792869 (patch) | |
| tree | 3cc18cabd99f9e300ca2539a9a48fb9c2d30e337 /src/wm.c | |
| parent | cbdc8462b6e982d3137b74d61bed6f8977405b8a (diff) | |
| download | sf-9bffcafa9ae0c38103a8c64b3482bb099e792869.tar.gz sf-9bffcafa9ae0c38103a8c64b3482bb099e792869.zip | |
Move source files to src/
Diffstat (limited to 'src/wm.c')
| -rw-r--r-- | src/wm.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/wm.c b/src/wm.c new file mode 100644 index 0000000..f25c6ba --- /dev/null +++ b/src/wm.c @@ -0,0 +1,78 @@ +#include "wm.h" + +#include <ncurses.h> +#include <string.h> + +#include "err.h" +#include "log.h" +#include "mem.h" + +window *wm_create_new_w(terminal *t, const char *name, int height, int width, + int start_y, int start_x) +{ + if (t->w_count >= WINDOWS_MAX) { + die("Windows count has arrived max"); + } + + WINDOW *win; + win = derwin(t->windows[0]->win, height, width, start_y, start_x); + + int current_idx = t->w_count; + + strncpy(t->windows[current_idx]->name, name, 31); + t->windows[current_idx]->win = win; + t->windows[current_idx]->start_y = start_y; + t->windows[current_idx]->start_x = start_x; + t->windows[current_idx]->width = width; + t->windows[current_idx]->height = height; + + t->w_count++; + + return t->windows[current_idx]; +} + +terminal *wm_init(void) +{ + terminal *t = xmalloc(sizeof(terminal)); + t->windows = xmalloc(sizeof(window *) * WINDOWS_MAX); + for (int i = 0; i < WINDOWS_MAX; i++) { + t->windows[i] = xmalloc(sizeof(window)); + } + t->w_count = 0; + getmaxyx(stdscr, t->maxy, t->maxx); + t->windows[0]->win = newwin(t->maxy, t->maxx, 0, 0); + t->windows[t->w_count]->start_y = 0; + t->windows[t->w_count]->start_x = 0; + t->windows[t->w_count]->height = t->maxy; + t->windows[t->w_count]->width = t->maxx; + t->w_count++; + + return t; +} + +int wm_fd_w_by_name(terminal *t, const char *name) +{ + log_write(LOG_INFO, "w_count = %d", t->w_count); + for (int i = 0; i < t->w_count; i++) { + if (strcmp(t->windows[i]->name, name) != 0) + continue; + return i; + } + + return -1; +} + +void wm_refresh_all(terminal *t) +{ + if (t->windows[0] && t->windows[0]->win) { + touchwin(t->windows[0]->win); + } + + for (int i = 1; i < t->w_count; i++) { + if (t->windows[i] && t->windows[i]->win) { + wnoutrefresh(t->windows[i]->win); + } + } + + doupdate(); +} |
