Reorg window data structures. Add an intermediate data type (struct winlink) to hold index and make sessions hold a RB tree of them rather than a fixed array.

This commit is contained in:
Nicholas Marriott
2007-10-26 12:29:07 +00:00
parent 9f06104c3a
commit 4ba3cf60be
18 changed files with 347 additions and 349 deletions

60
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.70 2007-10-25 17:44:24 nicm Exp $ */
/* $Id: tmux.h,v 1.71 2007-10-26 12:29:07 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -19,6 +19,9 @@
#ifndef TMUX_H
#define TMUX_H
/* Shut up gcc warnings about empty if bodies. */
#define RB_AUGMENT(x) do {} while (0)
#include <sys/param.h>
#include <sys/tree.h>
#include <sys/queue.h>
@ -385,9 +388,6 @@ struct input_ctx {
ARRAY_DECL(, struct input_arg) args;
};
/* Input context macros. */
#define INPUT_FLAGS(ictx) ((ictx)->flags)
/* Window structure. */
struct window {
char *name;
@ -396,17 +396,26 @@ struct window {
struct buffer *in;
struct buffer *out;
u_int references;
struct input_ctx ictx;
int flags;
#define WINDOW_BELL 0x1
struct screen screen;
u_int references;
};
ARRAY_DECL(windows, struct window *);
/* Entry on local window list. */
struct winlink {
int idx;
struct window *window;
RB_ENTRY(winlink) entry;
};
RB_HEAD(winlinks, winlink);
/* Client session. */
struct session {
char *name;
@ -415,11 +424,11 @@ struct session {
u_int sx;
u_int sy;
struct window *window;
struct window *last;
struct windows windows;
struct winlink *curw;
struct winlink *lastw;
struct winlinks windows;
struct windows bells; /* windows with bells */
ARRAY_DECL(, struct winlink *) bells; /* windows with bells */
#define SESSION_UNATTACHED 0x1 /* not attached to any clients */
int flags;
@ -665,33 +674,34 @@ void local_output(struct buffer *, size_t);
/* window.c */
extern struct windows windows;
int window_cmp(struct window *, struct window *);
int winlink_cmp(struct winlink *, struct winlink *);
RB_PROTOTYPE(windows, window, entry, window_cmp);
RB_PROTOTYPE(winlinks, winlink, entry, winlink_cmp);
struct winlink *winlink_find_by_index(struct winlinks *, int);
struct winlink *winlink_find_by_window(struct winlinks *, struct window *);
int winlink_next_index(struct winlinks *);
struct winlink *winlink_add(struct winlinks *, struct window *, int);
void winlink_remove(struct winlinks *, struct winlink *);
struct winlink *winlink_next(struct winlinks *, struct winlink *);
struct winlink *winlink_previous(struct winlinks *, struct winlink *);
struct window *window_create(
const char *, const char *, const char **, u_int, u_int);
int window_index(struct windows *, struct window *, u_int *);
void window_add(struct windows *, struct window *);
void window_remove(struct windows *, struct window *);
void window_destroy(struct window *);
struct window *window_next(struct windows *, struct window *);
struct window *window_previous(struct windows *, struct window *);
struct window *window_at(struct windows *, u_int);
int window_resize(struct window *, u_int, u_int);
int window_poll(struct window *, struct pollfd *);
void window_key(struct window *, int);
void window_data(struct window *, struct buffer *);
/* session.c */
extern struct sessions sessions;
void session_cancelbell(struct session *, struct window *);
void session_cancelbell(struct session *, struct winlink *);
void session_addbell(struct session *, struct window *);
int session_hasbell(struct session *, struct window *);
int session_hasbell(struct session *, struct winlink *);
struct session *session_find(const char *);
struct session *session_create(const char *, const char *, u_int, u_int);
void session_destroy(struct session *);
int session_index(struct session *, u_int *);
int session_new(
struct session *, const char *, const char *, u_int *);
void session_attach(struct session *, struct window *);
int session_detach(struct session *, struct window *);
struct winlink *session_new(struct session *, const char *, const char *, int);
struct winlink *session_attach(struct session *, struct window *, int);
int session_detach(struct session *, struct winlink *);
int session_has(struct session *, struct window *);
int session_next(struct session *);
int session_previous(struct session *);