aboutsummaryrefslogtreecommitdiffstats
path: root/src/wm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wm.c')
-rw-r--r--src/wm.c78
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();
+}