aboutsummaryrefslogtreecommitdiffstats
path: root/src/wm.c
blob: f25c6ba3945f18a6599132dfd0ad550b00d9c482 (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
74
75
76
77
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();
}