aboutsummaryrefslogtreecommitdiffstats
path: root/wm.c
blob: 00bd0e0653938c79e073e578ddc0fdc1e619e64e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#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();
}