1
/* Terminal windows stuff. */
2
/* $Id: window.c,v 1.13 2003/12/02 19:58:00 jonas Exp $ */
10
#include "terminal/event.h"
11
#include "terminal/tab.h"
12
#include "terminal/terminal.h"
13
#include "terminal/window.h"
14
#include "util/error.h"
15
#include "util/memory.h"
19
redraw_from_window(struct window *win)
21
struct terminal *term = win->term;
22
struct term_event ev = INIT_TERM_EVENT(EV_REDRAW, term->width, term->height, 0);
23
struct window *end = (void *) &term->windows;
25
if (term->redrawing != 0) return;
28
for (win = win->prev; win != end; win = win->prev) {
29
if (!inactive_tab(win))
30
win->handler(win, &ev, 0);
36
redraw_below_window(struct window *win)
38
struct terminal *term = win->term;
39
struct term_event ev = INIT_TERM_EVENT(EV_REDRAW, term->width, term->height, 0);
40
struct window *end = win;
41
int tr = term->redrawing;
43
if (term->redrawing > 1) return;
46
for (win = term->windows.prev; win != end; win = win->prev) {
47
if (!inactive_tab(win))
48
win->handler(win, &ev, 0);
54
add_window_at_pos(struct terminal *term,
55
void (*handler)(struct window *, struct term_event *, int),
56
void *data, struct window *at)
58
struct window *win = mem_calloc(1, sizeof(struct window));
59
struct term_event ev = INIT_TERM_EVENT(EV_INIT, term->width, term->height, 0);
62
if (data) mem_free(data);
66
win->handler = handler;
67
win->data = data; /* freed later in delete_window() */
69
win->type = WT_NORMAL;
71
win->handler(win, &ev, 0);
75
add_window(struct terminal *term,
76
void (*handler)(struct window *, struct term_event *, int),
79
add_window_at_pos(term, handler, data, (struct window *) &term->windows);
83
delete_window(struct window *win)
85
struct term_event ev = INIT_TERM_EVENT(EV_ABORT, 0, 0, 0);
87
/* Updating the status when destroying tabs needs this before the win
90
win->handler(win, &ev, 1);
91
if (win->data) mem_free(win->data);
92
redraw_terminal(win->term);
97
delete_window_ev(struct window *win, struct term_event *ev)
99
struct window *w = win->next;
101
if ((void *) w == &win->term->windows) w = NULL;
103
if (ev && w && w->next != w) w->handler(w, ev, 1);
107
get_parent_ptr(struct window *win, int *x, int *y)
109
struct window *parent = win->next;
112
if ((void*) parent == &win->term->windows)
117
parent = get_tab_by_number(win->term, win->term->current_tab);
136
empty_window_handler(struct window *win, struct term_event *ev, int fwd)
138
struct terminal *term = win->term;
139
struct ewd *ewd = win->data;
140
void (*fn)(void *) = ewd->fn;
141
void *data = ewd->data;
152
get_parent_ptr(win, &x, &y);
153
set_window_ptr(win, x, y);
161
/* Silence compiler warnings */
168
term_send_event(term, ev);
172
add_empty_window(struct terminal *term, void (*fn)(void *), void *data)
174
struct ewd *ewd = mem_alloc(sizeof(struct ewd));
180
add_window(term, empty_window_handler, ewd);