aboutsummaryrefslogtreecommitdiff
path: root/tmux.h
diff options
context:
space:
mode:
Diffstat (limited to 'tmux.h')
-rw-r--r--tmux.h583
1 files changed, 583 insertions, 0 deletions
diff --git a/tmux.h b/tmux.h
new file mode 100644
index 00000000..962ed98c
--- /dev/null
+++ b/tmux.h
@@ -0,0 +1,583 @@
+/* $Id: tmux.h,v 1.1.1.1 2007-07-09 19:03:50 nicm Exp $ */
+
+/*
+ * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef NSCR_H
+#define NSCR_H
+
+#include <sys/param.h>
+#include <sys/queue.h>
+
+#include <poll.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "array.h"
+
+extern char *__progname;
+
+#define MAXNAMELEN 32
+#define MAXTITLELEN 192
+
+/* Definition to shut gcc up about unused arguments. */
+#define unused __attribute__ ((unused))
+
+/* Attribute to make gcc check printf-like arguments. */
+#define printflike1 __attribute__ ((format (printf, 1, 2)))
+#define printflike2 __attribute__ ((format (printf, 2, 3)))
+#define printflike3 __attribute__ ((format (printf, 3, 4)))
+#define printflike4 __attribute__ ((format (printf, 4, 5)))
+
+/* Ensure buffer size. */
+#define ENSURE_SIZE(buf, len, size) do { \
+ (buf) = ensure_size(buf, &(len), 1, size); \
+} while (0)
+#define ENSURE_SIZE2(buf, len, nmemb, size) do { \
+ (buf) = ensure_size(buf, &(len), nmemb, size); \
+} while (0)
+#define ENSURE_FOR(buf, len, size, adj) do { \
+ (buf) = ensure_for(buf, &(len), size, adj); \
+} while (0)
+
+/* Buffer macros. */
+#define BUFFER_USED(b) ((b)->size)
+#define BUFFER_FREE(b) ((b)->space - (b)->off - (b)->size)
+#define BUFFER_IN(b) ((b)->base + (b)->off + (b)->size)
+#define BUFFER_OUT(b) ((b)->base + (b)->off)
+
+/* Buffer structure. */
+struct buffer {
+ u_char *base; /* buffer start */
+ size_t space; /* total size of buffer */
+
+ size_t size; /* size of data in buffer */
+ size_t off; /* offset of data in buffer */
+};
+
+/* Key codes. ncurses defines KEY_*. Grrr. */
+#define KEYC_NONE 256
+#define KEYC_A1 -1
+#define KEYC_A3 -2
+#define KEYC_B2 -3
+#define KEYC_BACKSPACE -4
+#define KEYC_BEG -5
+#define KEYC_BTAB -6
+#define KEYC_C1 -7
+#define KEYC_C3 -8
+#define KEYC_CANCEL -9
+#define KEYC_CATAB -10
+#define KEYC_CLEAR -11
+#define KEYC_CLOSE -12
+#define KEYC_COMMAND -13
+#define KEYC_COPY -14
+#define KEYC_CREATE -15
+#define KEYC_CTAB -16
+#define KEYC_DC -17
+#define KEYC_DL -18
+#define KEYC_DOWN -19
+#define KEYC_EIC -20
+#define KEYC_END -21
+#define KEYC_ENTER -22
+#define KEYC_EOL -23
+#define KEYC_EOS -24
+#define KEYC_EXIT -25
+#define KEYC_F0 -26
+#define KEYC_F1 -27
+#define KEYC_F10 -28
+#define KEYC_F11 -29
+#define KEYC_F12 -30
+#define KEYC_F13 -31
+#define KEYC_F14 -32
+#define KEYC_F15 -33
+#define KEYC_F16 -34
+#define KEYC_F17 -35
+#define KEYC_F18 -36
+#define KEYC_F19 -37
+#define KEYC_F2 -38
+#define KEYC_F20 -39
+#define KEYC_F21 -40
+#define KEYC_F22 -41
+#define KEYC_F23 -42
+#define KEYC_F24 -43
+#define KEYC_F25 -44
+#define KEYC_F26 -45
+#define KEYC_F27 -46
+#define KEYC_F28 -47
+#define KEYC_F29 -48
+#define KEYC_F3 -49
+#define KEYC_F30 -50
+#define KEYC_F31 -51
+#define KEYC_F32 -52
+#define KEYC_F33 -53
+#define KEYC_F34 -54
+#define KEYC_F35 -55
+#define KEYC_F36 -56
+#define KEYC_F37 -57
+#define KEYC_F38 -58
+#define KEYC_F39 -59
+#define KEYC_F4 -60
+#define KEYC_F40 -61
+#define KEYC_F41 -62
+#define KEYC_F42 -63
+#define KEYC_F43 -64
+#define KEYC_F44 -65
+#define KEYC_F45 -66
+#define KEYC_F46 -67
+#define KEYC_F47 -68
+#define KEYC_F48 -69
+#define KEYC_F49 -70
+#define KEYC_F5 -71
+#define KEYC_F50 -72
+#define KEYC_F51 -73
+#define KEYC_F52 -74
+#define KEYC_F53 -75
+#define KEYC_F54 -76
+#define KEYC_F55 -77
+#define KEYC_F56 -78
+#define KEYC_F57 -79
+#define KEYC_F58 -80
+#define KEYC_F59 -81
+#define KEYC_F6 -82
+#define KEYC_F60 -83
+#define KEYC_F61 -84
+#define KEYC_F62 -85
+#define KEYC_F63 -86
+#define KEYC_F7 -87
+#define KEYC_F8 -88
+#define KEYC_F9 -89
+#define KEYC_FIND -90
+#define KEYC_HELP -91
+#define KEYC_HOME -92
+#define KEYC_IC -93
+#define KEYC_IL -94
+#define KEYC_LEFT -95
+#define KEYC_LL -96
+#define KEYC_MARK -97
+#define KEYC_MESSAGE -98
+#define KEYC_MOVE -99
+#define KEYC_NEXT -100
+#define KEYC_NPAGE -101
+#define KEYC_OPEN -102
+#define KEYC_OPTIONS -103
+#define KEYC_PPAGE -104
+#define KEYC_PREVIOUS -105
+#define KEYC_PRINT -106
+#define KEYC_REDO -107
+#define KEYC_REFERENCE -108
+#define KEYC_REFRESH -109
+#define KEYC_REPLACE -110
+#define KEYC_RESTART -111
+#define KEYC_RESUME -112
+#define KEYC_RIGHT -113
+#define KEYC_SAVE -114
+#define KEYC_SBEG -115
+#define KEYC_SCANCEL -116
+#define KEYC_SCOMMAND -117
+#define KEYC_SCOPY -118
+#define KEYC_SCREATE -119
+#define KEYC_SDC -120
+#define KEYC_SDL -121
+#define KEYC_SELECT -122
+#define KEYC_SEND -123
+#define KEYC_SEOL -124
+#define KEYC_SEXIT -125
+#define KEYC_SF -126
+#define KEYC_SFIND -127
+#define KEYC_SHELP -128
+#define KEYC_SHOME -129
+#define KEYC_SIC -130
+#define KEYC_SLEFT -131
+#define KEYC_SMESSAGE -132
+#define KEYC_SMOVE -133
+#define KEYC_SNEXT -134
+#define KEYC_SOPTIONS -135
+#define KEYC_SPREVIOUS -136
+#define KEYC_SPRINT -137
+#define KEYC_SR -138
+#define KEYC_SREDO -139
+#define KEYC_SREPLACE -140
+#define KEYC_SRIGHT -141
+#define KEYC_SRSUME -142
+#define KEYC_SSAVE -143
+#define KEYC_SSUSPEND -144
+#define KEYC_STAB -145
+#define KEYC_SUNDO -146
+#define KEYC_SUSPEND -147
+#define KEYC_UNDO -148
+#define KEYC_UP -149
+#define KEYC_MOUSE -150
+
+/* Escape codes. */
+/*
+ AL=\E[%dL parm_insert_line
+ DC=\E[%dP parm_dch
+ DL=\E[%dM parm_delete_line
+ DO=\E[%dB parm_down_cursor
+ IC=\E[%d@ parm_ich
+ Km=\E[M key_mouse
+ LE=\E[%dD parm_left_cursor
+ RI=\E[%dC parm_right_cursor
+ UP=\E[%dA parm_up_cursor
+ ac=++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~
+ acs_chars
+ ae=^O exit_alt_charset_mode
+ al=\E[L insert_line
+ as=^N enter_alt_charset_mode
+ bl=^G bell
+ bt=\E[Z back_tab
+ cb=\E[1K clear_bol
+ cd=\E[J clear_eos
+ ce=\E[K clear_eol
+ cl=\E[H\E[J clear_screen
+ cm=\E[%i%d;%dH cursor_address
+ cr=^M carriage_return
+ cs=\E[%i%d;%dr change_scroll_region
+ ct=\E[3g clear_all_tabs
+ dc=\E[P delete_character
+ dl=\E[M delete_line
+ do=^J cursor_down
+ eA=\E(B\E)0 ena_acs
+ ei=\E[4l exit_insert_mode
+ ho=\E[H cursor_home
+ im=\E[4h enter_insert_mode
+ is=\E)0 init_2string
+ le=^H cursor_left
+ mb=\E[5m enter_blink_mode
+ md=\E[1m enter_bold_mode
+ me=\E[m exit_attrbute_mode
+ mr=\E[7m enter_reverse_mode
+ nd=\E[C cursor_right
+ nw=\EE newline
+ rc=\E8 restore_cursor
+ rs=\Ec reset_string
+ sc=\E7 save_cursor
+ se=\E[23m exit_standout_mode
+ sf=^J scroll_forward
+ so=\E[3m enter_standout_mode
+ sr=\EM scroll_reverse
+ st=\EH set_tab
+ ta=^I tab
+ ue=\E[24m exit_underline_mode
+ up=\EM cursor_up
+ s=\E[4m
+ vb=\Eg flash_screen
+ ve=\E[34h\E[?25h
+ cursor_normal
+ vi=\E[?25l cursor_invisible
+ vs=\E[34l cursor_visible
+ E0=\E(B
+ S0=\E(%p1%c
+ */
+
+/* Translated escape codes. */
+#define CODE_CURSORUP 0
+#define CODE_CURSORDOWN 1
+#define CODE_CURSORRIGHT 2
+#define CODE_CURSORLEFT 3
+#define CODE_INSERTCHARACTER 4
+#define CODE_DELETECHARACTER 5
+#define CODE_INSERTLINE 6
+#define CODE_DELETELINE 7
+#define CODE_CLEARLINE 8
+#define CODE_CLEARSCREEN 9
+#define CODE_CLEARENDOFLINE 10
+#define CODE_CLEARENDOFSCREEN 11
+#define CODE_CLEARSTARTOFLINE 12
+#define CODE_CURSORMOVE 13
+#define CODE_ATTRIBUTES 14
+#define CODE_CURSOROFF 15
+#define CODE_CURSORON 16
+#define CODE_CURSORUPSCROLL 17
+#define CODE_CURSORDOWNSCROLL 18
+#define CODE_SCROLLREGION 19
+#define CODE_INSERTON 20
+#define CODE_INSERTOFF 21
+#define CODE_KCURSOROFF 22
+#define CODE_KCURSORON 23
+#define CODE_KKEYPADOFF 24
+#define CODE_KKEYPADON 25
+#define CODE_TITLE 26
+
+/* Message codes. */
+#define MSG_IDENTIFY 0
+#define MSG_CREATE 1
+#define MSG_EXIT 2
+#define MSG_SIZE 3
+#define MSG_NEXT 4
+#define MSG_PREVIOUS 5
+#define MSG_INPUT 6 /* input from client to server */
+#define MSG_OUTPUT 7 /* output from server to client */
+#define MSG_REFRESH 8
+#define MSG_SELECT 9
+#define MSG_SESSIONS 10
+#define MSG_WINDOWS 11
+#define MSG_PAUSE 12
+#define MSG_RENAME 13
+
+struct identify_data {
+ char name[MAXNAMELEN];
+
+ u_int sx;
+ u_int sy;
+};
+
+struct sessions_data {
+ u_int sessions;
+};
+
+struct sessions_entry {
+ char name[MAXNAMELEN];
+ time_t tim;
+ u_int windows;
+};
+
+struct windows_data {
+ char name[MAXNAMELEN];
+ u_int windows;
+};
+
+struct windows_entry {
+ u_int idx;
+ char tty[TTY_NAME_MAX];
+
+ char name[MAXNAMELEN];
+ char title[MAXTITLELEN];
+};
+
+struct size_data {
+ u_int sx;
+ u_int sy;
+};
+
+struct select_data {
+ u_int idx;
+};
+
+struct refresh_data {
+ u_int py_upper;
+ u_int py_lower;
+};
+
+/* Message header structure. */
+struct hdr {
+ u_int code;
+ size_t size;
+};
+
+/* Attributes. */
+#define ATTR_BRIGHT 0x1
+#define ATTR_DIM 0x2
+#define ATTR_UNDERSCORE 0x4
+#define ATTR_BLINK 0x8
+#define ATTR_REVERSE 0x10
+#define ATTR_HIDDEN 0x20
+#define ATTR_ITALICS 0x40
+
+/* Modes. */
+#define MODE_CURSOR 0x1
+#define MODE_INSERT 0x2
+#define MODE_KCURSOR 0x4
+#define MODE_KKEYPAD 0x8
+
+/*
+ * Virtual screen. This is stored as three blocks of 8-bit values, one for
+ * the actual characters, one for attributes and one for colours. Three
+ * seperate blocks means memset and friends can be used.
+ *
+ * Each block is y by x in size, row then column order. Sizes are 0-based.
+ */
+struct screen {
+ char title[MAXTITLELEN];
+
+ u_char **grid_data;
+ u_char **grid_attr;
+ u_char **grid_colr;
+
+ u_int sx; /* size x */
+ u_int sy; /* size y */
+
+ u_int cx; /* cursor x */
+ u_int cy; /* cursor y */
+
+ u_int ry_upper; /* scroll region top */
+ u_int ry_lower; /* scroll region bottom */
+
+ u_char attr;
+ u_char colr; /* fg:bg */
+
+ int mode;
+};
+
+/* Window structure. */
+struct window {
+ char name[MAXNAMELEN];
+
+ int fd;
+ struct buffer *in;
+ struct buffer *out;
+
+ u_int references;
+
+ struct screen screen;
+};
+ARRAY_DECL(windows, struct window *);
+
+/* Client session. */
+struct session {
+ char name[MAXNAMELEN];
+ time_t tim;
+
+ struct window *window;
+ struct windows windows;
+};
+ARRAY_DECL(sessions, struct session *);
+
+/* Client connection. */
+struct client {
+ int fd;
+ struct buffer *in;
+ struct buffer *out;
+
+ u_int sx;
+ u_int sy;
+
+ struct session *session;
+
+ /* User input. */
+ const char *prompt;
+ char *buf;
+ size_t len;
+ size_t idx;
+ void (*callback)(struct client *, const char *);
+
+};
+ARRAY_DECL(clients, struct client *);
+
+/* tmux.c */
+volatile sig_atomic_t sigterm;
+extern int debug_level;
+extern char socket_path[MAXPATHLEN];
+
+/* server.c */
+int server_start(void);
+
+/* ansi.c */
+void input_key(struct buffer *, int);
+size_t input_parse(u_char *, size_t, struct buffer *, struct screen *);
+uint8_t input_extract8(struct buffer *);
+uint16_t input_extract16(struct buffer *);
+void input_store8(struct buffer *, uint8_t);
+void input_store16(struct buffer *, uint16_t);
+void input_store_zero(struct buffer *, u_char);
+void input_store_one(struct buffer *, u_char, uint16_t);
+void input_store_two(struct buffer *, u_char, uint16_t, uint16_t);
+
+/* screen.c */
+void screen_create(struct screen *, u_int, u_int);
+void screen_resize(struct screen *, u_int, u_int);
+void screen_draw(struct screen *, struct buffer *, u_int, u_int);
+void screen_character(struct screen *, u_char);
+void screen_sequence(struct screen *, u_char *);
+
+/* local.c */
+int local_init(struct buffer **, struct buffer **);
+void local_done(void);
+int local_key(size_t *);
+void local_output(struct buffer *, size_t);
+
+/* command.c */
+extern int cmd_prefix;
+int cmd_execute(int, struct buffer *);
+
+/* window.c */
+extern struct windows windows;
+struct window *window_create(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_input(struct window *, struct buffer *, size_t);
+void window_output(struct window *, struct buffer *);
+
+/* session.c */
+extern struct sessions sessions;
+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 *, u_int, u_int);
+void session_attach(struct session *, struct window *);
+int session_detach(struct session *, struct window *);
+int session_has(struct session *, struct window *);
+int session_next(struct session *);
+int session_previous(struct session *);
+int session_select(struct session *, u_int);
+
+/* buffer.c */
+struct buffer *buffer_create(size_t);
+void buffer_destroy(struct buffer *);
+void buffer_clear(struct buffer *);
+void buffer_ensure(struct buffer *, size_t);
+void buffer_add(struct buffer *, size_t);
+void buffer_reverse_add(struct buffer *, size_t);
+void buffer_remove(struct buffer *, size_t);
+void buffer_reverse_remove(struct buffer *, size_t);
+void buffer_insert_range(struct buffer *, size_t, size_t);
+void buffer_delete_range(struct buffer *, size_t, size_t);
+void buffer_write(struct buffer *, const void *, size_t);
+void buffer_read(struct buffer *, void *, size_t);
+
+/* buffer-poll.c */
+int buffer_poll(struct pollfd *, struct buffer *, struct buffer *);
+
+/* log.c */
+void log_open(FILE *, int, int);
+void log_close(void);
+void log_vwrite(FILE *, int, const char *, va_list);
+void log_write(FILE *, int, const char *, ...);
+void printflike1 log_warn(const char *, ...);
+void printflike1 log_warnx(const char *, ...);
+void printflike1 log_info(const char *, ...);
+void printflike1 log_debug(const char *, ...);
+void printflike1 log_debug2(const char *, ...);
+void printflike1 log_debug3(const char *, ...);
+__dead void log_vfatal(const char *, va_list);
+__dead void log_fatal(const char *, ...);
+__dead void log_fatalx(const char *, ...);
+
+/* xmalloc.c */
+void *ensure_size(void *, size_t *, size_t, size_t);
+void *ensure_for(void *, size_t *, size_t, size_t);
+char *xstrdup(const char *);
+void *xcalloc(size_t, size_t);
+void *xmalloc(size_t);
+void *xrealloc(void *, size_t, size_t);
+void xfree(void *);
+int printflike2 xasprintf(char **, const char *, ...);
+int xvasprintf(char **, const char *, va_list);
+int printflike3 xsnprintf(char *, size_t, const char *, ...);
+int xvsnprintf(char *, size_t, const char *, va_list);
+int printflike3 printpath(char *, size_t, const char *, ...);
+char *xdirname(const char *);
+char *xbasename(const char *);
+
+#endif