annotate config/st/st.c @ 1:f78c8a98f113

Add new stuff and remove useless overlay in home.nix
author Yasuri <yasuri@charliesmp.net>
date Fri, 02 Oct 2026 18:58:29 -0500
parents face7f4d84f7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1 /* See LICENSE for license details. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2 #include <ctype.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
3 #include <errno.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
4 #include <fcntl.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
5 #include <limits.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
6 #include <pwd.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
7 #include <stdarg.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
8 #include <stdio.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
9 #include <stdlib.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
10 #include <string.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
11 #include <signal.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
12 #include <sys/ioctl.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
13 #include <sys/select.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
14 #include <sys/types.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
15 #include <sys/wait.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
16 #include <termios.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
17 #include <unistd.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
18 #include <wchar.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
19
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
20 #include "st.h"
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
21 #include "win.h"
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
22
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
23 #if defined(__linux)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
24 #include <pty.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
25 #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
26 #include <util.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
27 #elif defined(__FreeBSD__) || defined(__DragonFly__)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
28 #include <libutil.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
29 #endif
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
30
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
31 /* Arbitrary sizes */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
32 #define UTF_INVALID 0xFFFD
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
33 #define UTF_SIZ 4
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
34 #define ESC_BUF_SIZ (128*UTF_SIZ)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
35 #define ESC_ARG_SIZ 16
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
36 #define STR_BUF_SIZ ESC_BUF_SIZ
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
37 #define STR_ARG_SIZ ESC_ARG_SIZ
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
38
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
39 /* macros */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
40 #define IS_SET(flag) ((term.mode & (flag)) != 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
41 #define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == 0x7f)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
42 #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
43 #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
44 #define ISDELIM(u) (u && wcschr(worddelimiters, u))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
45
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
46 enum term_mode {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
47 MODE_WRAP = 1 << 0,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
48 MODE_INSERT = 1 << 1,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
49 MODE_ALTSCREEN = 1 << 2,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
50 MODE_CRLF = 1 << 3,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
51 MODE_ECHO = 1 << 4,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
52 MODE_PRINT = 1 << 5,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
53 MODE_UTF8 = 1 << 6,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
54 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
55
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
56 enum cursor_movement {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
57 CURSOR_SAVE,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
58 CURSOR_LOAD
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
59 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
60
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
61 enum cursor_state {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
62 CURSOR_DEFAULT = 0,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
63 CURSOR_WRAPNEXT = 1,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
64 CURSOR_ORIGIN = 2
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
65 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
66
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
67 enum charset {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
68 CS_GRAPHIC0,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
69 CS_GRAPHIC1,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
70 CS_UK,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
71 CS_USA,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
72 CS_MULTI,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
73 CS_GER,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
74 CS_FIN
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
75 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
76
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
77 enum escape_state {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
78 ESC_START = 1,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
79 ESC_CSI = 2,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
80 ESC_STR = 4, /* DCS, OSC, PM, APC */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
81 ESC_ALTCHARSET = 8,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
82 ESC_STR_END = 16, /* a final string was encountered */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
83 ESC_TEST = 32, /* Enter in test mode */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
84 ESC_UTF8 = 64,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
85 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
86
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
87 typedef struct {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
88 Glyph attr; /* current char attributes */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
89 int x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
90 int y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
91 char state;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
92 } TCursor;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
93
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
94 typedef struct {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
95 int mode;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
96 int type;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
97 int snap;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
98 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
99 * Selection variables:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
100 * nb – normalized coordinates of the beginning of the selection
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
101 * ne – normalized coordinates of the end of the selection
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
102 * ob – original coordinates of the beginning of the selection
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
103 * oe – original coordinates of the end of the selection
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
104 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
105 struct {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
106 int x, y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
107 } nb, ne, ob, oe;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
108
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
109 int alt;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
110 } Selection;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
111
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
112 /* Internal representation of the screen */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
113 typedef struct {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
114 int row; /* nb row */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
115 int col; /* nb col */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
116 Line *line; /* screen */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
117 Line *alt; /* alternate screen */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
118 int *dirty; /* dirtyness of lines */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
119 TCursor c; /* cursor */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
120 int ocx; /* old cursor col */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
121 int ocy; /* old cursor row */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
122 int top; /* top scroll limit */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
123 int bot; /* bottom scroll limit */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
124 int mode; /* terminal mode flags */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
125 int esc; /* escape state flags */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
126 char trantbl[4]; /* charset table translation */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
127 int charset; /* current charset */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
128 int icharset; /* selected charset for sequence */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
129 int *tabs;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
130 Rune lastc; /* last printed char outside of sequence, 0 if control */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
131 } Term;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
132
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
133 /* CSI Escape sequence structs */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
134 /* ESC '[' [[ [<priv>] <arg> [;]] <mode> [<mode>]] */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
135 typedef struct {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
136 char buf[ESC_BUF_SIZ]; /* raw string */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
137 size_t len; /* raw string length */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
138 char priv;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
139 int arg[ESC_ARG_SIZ];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
140 int narg; /* nb of args */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
141 char mode[2];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
142 } CSIEscape;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
143
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
144 /* STR Escape sequence structs */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
145 /* ESC type [[ [<priv>] <arg> [;]] <mode>] ESC '\' */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
146 typedef struct {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
147 char type; /* ESC type ... */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
148 char *buf; /* allocated raw string */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
149 size_t siz; /* allocation size */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
150 size_t len; /* raw string length */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
151 char *args[STR_ARG_SIZ];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
152 int narg; /* nb of args */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
153 } STREscape;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
154
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
155 static void execsh(char *, char **);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
156 static void stty(char **);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
157 static void sigchld(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
158 static void ttywriteraw(const char *, size_t);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
159
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
160 static void csidump(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
161 static void csihandle(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
162 static void csiparse(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
163 static void csireset(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
164 static void osc_color_response(int, int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
165 static int eschandle(uchar);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
166 static void strdump(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
167 static void strhandle(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
168 static void strparse(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
169 static void strreset(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
170
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
171 static void tprinter(char *, size_t);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
172 static void tdumpsel(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
173 static void tdumpline(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
174 static void tdump(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
175 static void tclearregion(int, int, int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
176 static void tcursor(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
177 static void tdeletechar(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
178 static void tdeleteline(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
179 static void tinsertblank(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
180 static void tinsertblankline(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
181 static int tlinelen(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
182 static void tmoveto(int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
183 static void tmoveato(int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
184 static void tnewline(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
185 static void tputtab(int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
186 static void tputc(Rune);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
187 static void treset(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
188 static void tscrollup(int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
189 static void tscrolldown(int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
190 static void tsetattr(const int *, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
191 static void tsetchar(Rune, const Glyph *, int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
192 static void tsetdirt(int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
193 static void tsetscroll(int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
194 static void tswapscreen(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
195 static void tsetmode(int, int, const int *, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
196 static int twrite(const char *, int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
197 static void tfulldirt(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
198 static void tcontrolcode(uchar );
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
199 static void tdectest(char );
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
200 static void tdefutf8(char);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
201 static int32_t tdefcolor(const int *, int *, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
202 static void tdeftran(char);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
203 static void tstrsequence(uchar);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
204
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
205 static void drawregion(int, int, int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
206
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
207 static void selnormalize(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
208 static void selscroll(int, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
209 static void selsnap(int *, int *, int);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
210
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
211 static size_t utf8decode(const char *, Rune *, size_t);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
212 static Rune utf8decodebyte(char, size_t *);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
213 static char utf8encodebyte(Rune, size_t);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
214 static size_t utf8validate(Rune *, size_t);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
215
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
216 static char *base64dec(const char *);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
217 static char base64dec_getc(const char **);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
218
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
219 static ssize_t xwrite(int, const char *, size_t);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
220
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
221 /* Globals */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
222 static Term term;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
223 static Selection sel;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
224 static CSIEscape csiescseq;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
225 static STREscape strescseq;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
226 static int iofd = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
227 static int cmdfd;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
228 static pid_t pid;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
229
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
230 static const uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
231 static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
232 static const Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
233 static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
234
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
235 ssize_t
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
236 xwrite(int fd, const char *s, size_t len)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
237 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
238 size_t aux = len;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
239 ssize_t r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
240
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
241 while (len > 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
242 r = write(fd, s, len);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
243 if (r < 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
244 return r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
245 len -= r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
246 s += r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
247 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
248
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
249 return aux;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
250 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
251
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
252 void *
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
253 xmalloc(size_t len)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
254 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
255 void *p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
256
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
257 if (!(p = malloc(len)))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
258 die("malloc: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
259
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
260 return p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
261 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
262
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
263 void *
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
264 xrealloc(void *p, size_t len)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
265 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
266 if ((p = realloc(p, len)) == NULL)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
267 die("realloc: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
268
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
269 return p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
270 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
271
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
272 char *
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
273 xstrdup(const char *s)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
274 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
275 char *p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
276
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
277 if ((p = strdup(s)) == NULL)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
278 die("strdup: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
279
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
280 return p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
281 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
282
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
283 size_t
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
284 utf8decode(const char *c, Rune *u, size_t clen)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
285 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
286 size_t i, j, len, type;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
287 Rune udecoded;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
288
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
289 *u = UTF_INVALID;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
290 if (!clen)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
291 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
292 udecoded = utf8decodebyte(c[0], &len);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
293 if (!BETWEEN(len, 1, UTF_SIZ))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
294 return 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
295 for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
296 udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
297 if (type != 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
298 return j;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
299 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
300 if (j < len)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
301 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
302 *u = udecoded;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
303 utf8validate(u, len);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
304
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
305 return len;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
306 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
307
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
308 Rune
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
309 utf8decodebyte(char c, size_t *i)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
310 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
311 for (*i = 0; *i < LEN(utfmask); ++(*i))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
312 if (((uchar)c & utfmask[*i]) == utfbyte[*i])
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
313 return (uchar)c & ~utfmask[*i];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
314
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
315 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
316 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
317
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
318 size_t
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
319 utf8encode(Rune u, char *c)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
320 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
321 size_t len, i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
322
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
323 len = utf8validate(&u, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
324 if (len > UTF_SIZ)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
325 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
326
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
327 for (i = len - 1; i != 0; --i) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
328 c[i] = utf8encodebyte(u, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
329 u >>= 6;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
330 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
331 c[0] = utf8encodebyte(u, len);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
332
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
333 return len;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
334 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
335
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
336 char
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
337 utf8encodebyte(Rune u, size_t i)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
338 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
339 return utfbyte[i] | (u & ~utfmask[i]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
340 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
341
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
342 size_t
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
343 utf8validate(Rune *u, size_t i)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
344 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
345 if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
346 *u = UTF_INVALID;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
347 for (i = 1; *u > utfmax[i]; ++i)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
348 ;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
349
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
350 return i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
351 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
352
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
353 char
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
354 base64dec_getc(const char **src)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
355 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
356 while (**src && !isprint((unsigned char)**src))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
357 (*src)++;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
358 return **src ? *((*src)++) : '='; /* emulate padding if string ends */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
359 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
360
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
361 char *
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
362 base64dec(const char *src)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
363 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
364 size_t in_len = strlen(src);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
365 char *result, *dst;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
366 static const char base64_digits[256] = {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
367 [43] = 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
368 0, 0, 0, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
369 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
370 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
371 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
372 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
373
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
374 if (in_len % 4)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
375 in_len += 4 - (in_len % 4);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
376 result = dst = xmalloc(in_len / 4 * 3 + 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
377 while (*src) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
378 int a = base64_digits[(unsigned char) base64dec_getc(&src)];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
379 int b = base64_digits[(unsigned char) base64dec_getc(&src)];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
380 int c = base64_digits[(unsigned char) base64dec_getc(&src)];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
381 int d = base64_digits[(unsigned char) base64dec_getc(&src)];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
382
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
383 /* invalid input. 'a' can be -1, e.g. if src is "\n" (c-str) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
384 if (a == -1 || b == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
385 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
386
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
387 *dst++ = (a << 2) | ((b & 0x30) >> 4);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
388 if (c == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
389 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
390 *dst++ = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
391 if (d == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
392 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
393 *dst++ = ((c & 0x03) << 6) | d;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
394 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
395 *dst = '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
396 return result;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
397 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
398
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
399 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
400 selinit(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
401 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
402 sel.mode = SEL_IDLE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
403 sel.snap = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
404 sel.ob.x = -1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
405 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
406
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
407 int
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
408 tlinelen(int y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
409 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
410 int i = term.col;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
411
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
412 if (term.line[y][i - 1].mode & ATTR_WRAP)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
413 return i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
414
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
415 while (i > 0 && term.line[y][i - 1].u == ' ')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
416 --i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
417
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
418 return i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
419 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
420
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
421 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
422 selstart(int col, int row, int snap)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
423 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
424 selclear();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
425 sel.mode = SEL_EMPTY;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
426 sel.type = SEL_REGULAR;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
427 sel.alt = IS_SET(MODE_ALTSCREEN);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
428 sel.snap = snap;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
429 sel.oe.x = sel.ob.x = col;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
430 sel.oe.y = sel.ob.y = row;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
431 selnormalize();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
432
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
433 if (sel.snap != 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
434 sel.mode = SEL_READY;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
435 tsetdirt(sel.nb.y, sel.ne.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
436 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
437
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
438 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
439 selextend(int col, int row, int type, int done)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
440 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
441 int oldey, oldex, oldsby, oldsey, oldtype;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
442
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
443 if (sel.mode == SEL_IDLE)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
444 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
445 if (done && sel.mode == SEL_EMPTY) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
446 selclear();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
447 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
448 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
449
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
450 oldey = sel.oe.y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
451 oldex = sel.oe.x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
452 oldsby = sel.nb.y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
453 oldsey = sel.ne.y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
454 oldtype = sel.type;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
455
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
456 sel.oe.x = col;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
457 sel.oe.y = row;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
458 selnormalize();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
459 sel.type = type;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
460
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
461 if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type || sel.mode == SEL_EMPTY)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
462 tsetdirt(MIN(sel.nb.y, oldsby), MAX(sel.ne.y, oldsey));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
463
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
464 sel.mode = done ? SEL_IDLE : SEL_READY;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
465 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
466
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
467 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
468 selnormalize(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
469 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
470 int i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
471
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
472 if (sel.type == SEL_REGULAR && sel.ob.y != sel.oe.y) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
473 sel.nb.x = sel.ob.y < sel.oe.y ? sel.ob.x : sel.oe.x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
474 sel.ne.x = sel.ob.y < sel.oe.y ? sel.oe.x : sel.ob.x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
475 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
476 sel.nb.x = MIN(sel.ob.x, sel.oe.x);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
477 sel.ne.x = MAX(sel.ob.x, sel.oe.x);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
478 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
479 sel.nb.y = MIN(sel.ob.y, sel.oe.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
480 sel.ne.y = MAX(sel.ob.y, sel.oe.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
481
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
482 selsnap(&sel.nb.x, &sel.nb.y, -1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
483 selsnap(&sel.ne.x, &sel.ne.y, +1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
484
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
485 /* expand selection over line breaks */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
486 if (sel.type == SEL_RECTANGULAR)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
487 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
488 i = tlinelen(sel.nb.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
489 if (i < sel.nb.x)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
490 sel.nb.x = i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
491 if (tlinelen(sel.ne.y) <= sel.ne.x)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
492 sel.ne.x = term.col - 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
493 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
494
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
495 int
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
496 selected(int x, int y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
497 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
498 if (sel.mode == SEL_EMPTY || sel.ob.x == -1 ||
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
499 sel.alt != IS_SET(MODE_ALTSCREEN))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
500 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
501
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
502 if (sel.type == SEL_RECTANGULAR)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
503 return BETWEEN(y, sel.nb.y, sel.ne.y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
504 && BETWEEN(x, sel.nb.x, sel.ne.x);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
505
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
506 return BETWEEN(y, sel.nb.y, sel.ne.y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
507 && (y != sel.nb.y || x >= sel.nb.x)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
508 && (y != sel.ne.y || x <= sel.ne.x);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
509 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
510
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
511 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
512 selsnap(int *x, int *y, int direction)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
513 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
514 int newx, newy, xt, yt;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
515 int delim, prevdelim;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
516 const Glyph *gp, *prevgp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
517
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
518 switch (sel.snap) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
519 case SNAP_WORD:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
520 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
521 * Snap around if the word wraps around at the end or
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
522 * beginning of a line.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
523 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
524 prevgp = &term.line[*y][*x];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
525 prevdelim = ISDELIM(prevgp->u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
526 for (;;) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
527 newx = *x + direction;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
528 newy = *y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
529 if (!BETWEEN(newx, 0, term.col - 1)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
530 newy += direction;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
531 newx = (newx + term.col) % term.col;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
532 if (!BETWEEN(newy, 0, term.row - 1))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
533 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
534
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
535 if (direction > 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
536 yt = *y, xt = *x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
537 else
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
538 yt = newy, xt = newx;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
539 if (!(term.line[yt][xt].mode & ATTR_WRAP))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
540 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
541 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
542
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
543 if (newx >= tlinelen(newy))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
544 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
545
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
546 gp = &term.line[newy][newx];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
547 delim = ISDELIM(gp->u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
548 if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
549 || (delim && gp->u != prevgp->u)))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
550 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
551
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
552 *x = newx;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
553 *y = newy;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
554 prevgp = gp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
555 prevdelim = delim;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
556 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
557 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
558 case SNAP_LINE:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
559 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
560 * Snap around if the the previous line or the current one
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
561 * has set ATTR_WRAP at its end. Then the whole next or
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
562 * previous line will be selected.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
563 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
564 *x = (direction < 0) ? 0 : term.col - 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
565 if (direction < 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
566 for (; *y > 0; *y += direction) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
567 if (!(term.line[*y-1][term.col-1].mode
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
568 & ATTR_WRAP)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
569 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
570 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
571 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
572 } else if (direction > 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
573 for (; *y < term.row-1; *y += direction) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
574 if (!(term.line[*y][term.col-1].mode
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
575 & ATTR_WRAP)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
576 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
577 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
578 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
579 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
580 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
581 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
582 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
583
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
584 char *
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
585 getsel(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
586 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
587 char *str, *ptr;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
588 int y, bufsize, lastx, linelen;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
589 const Glyph *gp, *last;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
590
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
591 if (sel.ob.x == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
592 return NULL;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
593
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
594 bufsize = (term.col+1) * (sel.ne.y-sel.nb.y+1) * UTF_SIZ;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
595 ptr = str = xmalloc(bufsize);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
596
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
597 /* append every set & selected glyph to the selection */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
598 for (y = sel.nb.y; y <= sel.ne.y; y++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
599 if ((linelen = tlinelen(y)) == 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
600 *ptr++ = '\n';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
601 continue;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
602 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
603
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
604 if (sel.type == SEL_RECTANGULAR) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
605 gp = &term.line[y][sel.nb.x];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
606 lastx = sel.ne.x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
607 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
608 gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
609 lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
610 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
611 last = &term.line[y][MIN(lastx, linelen-1)];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
612 while (last >= gp && last->u == ' ')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
613 --last;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
614
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
615 for ( ; gp <= last; ++gp) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
616 if (gp->mode & ATTR_WDUMMY)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
617 continue;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
618
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
619 ptr += utf8encode(gp->u, ptr);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
620 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
621
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
622 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
623 * Copy and pasting of line endings is inconsistent
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
624 * in the inconsistent terminal and GUI world.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
625 * The best solution seems like to produce '\n' when
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
626 * something is copied from st and convert '\n' to
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
627 * '\r', when something to be pasted is received by
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
628 * st.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
629 * FIXME: Fix the computer world.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
630 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
631 if ((y < sel.ne.y || lastx >= linelen) &&
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
632 (!(last->mode & ATTR_WRAP) || sel.type == SEL_RECTANGULAR))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
633 *ptr++ = '\n';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
634 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
635 *ptr = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
636 return str;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
637 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
638
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
639 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
640 selclear(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
641 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
642 if (sel.ob.x == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
643 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
644 sel.mode = SEL_IDLE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
645 sel.ob.x = -1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
646 tsetdirt(sel.nb.y, sel.ne.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
647 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
648
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
649 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
650 die(const char *errstr, ...)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
651 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
652 va_list ap;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
653
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
654 va_start(ap, errstr);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
655 vfprintf(stderr, errstr, ap);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
656 va_end(ap);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
657 exit(1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
658 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
659
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
660 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
661 execsh(char *cmd, char **args)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
662 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
663 char *sh, *prog, *arg;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
664 const struct passwd *pw;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
665
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
666 errno = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
667 if ((pw = getpwuid(getuid())) == NULL) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
668 if (errno)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
669 die("getpwuid: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
670 else
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
671 die("who are you?\n");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
672 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
673
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
674 if ((sh = getenv("SHELL")) == NULL)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
675 sh = (pw->pw_shell[0]) ? pw->pw_shell : cmd;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
676
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
677 if (args) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
678 prog = args[0];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
679 arg = NULL;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
680 } else if (scroll) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
681 prog = scroll;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
682 arg = utmp ? utmp : sh;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
683 } else if (utmp) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
684 prog = utmp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
685 arg = NULL;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
686 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
687 prog = sh;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
688 arg = NULL;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
689 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
690 DEFAULT(args, ((char *[]) {prog, arg, NULL}));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
691
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
692 unsetenv("COLUMNS");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
693 unsetenv("LINES");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
694 unsetenv("TERMCAP");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
695 setenv("LOGNAME", pw->pw_name, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
696 setenv("USER", pw->pw_name, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
697 setenv("SHELL", sh, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
698 setenv("HOME", pw->pw_dir, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
699 setenv("TERM", termname, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
700
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
701 signal(SIGCHLD, SIG_DFL);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
702 signal(SIGHUP, SIG_DFL);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
703 signal(SIGINT, SIG_DFL);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
704 signal(SIGQUIT, SIG_DFL);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
705 signal(SIGTERM, SIG_DFL);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
706 signal(SIGALRM, SIG_DFL);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
707
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
708 execvp(prog, args);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
709 _exit(1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
710 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
711
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
712 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
713 sigchld(int a)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
714 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
715 int stat, olderrno;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
716 pid_t p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
717
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
718 olderrno = errno;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
719 do {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
720 p = waitpid(pid, &stat, WNOHANG);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
721 } while (p < 0 && errno == EINTR);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
722
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
723 if (p < 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
724 _exit(1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
725
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
726 if (pid != p) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
727 errno = olderrno;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
728 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
729 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
730
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
731 if ((WIFEXITED(stat) && WEXITSTATUS(stat)) || WIFSIGNALED(stat))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
732 _exit(1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
733 _exit(0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
734 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
735
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
736 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
737 stty(char **args)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
738 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
739 char cmd[_POSIX_ARG_MAX], **p, *q, *s;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
740 size_t n, siz;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
741
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
742 if ((n = strlen(stty_args)) > sizeof(cmd)-1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
743 die("incorrect stty parameters\n");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
744 memcpy(cmd, stty_args, n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
745 q = cmd + n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
746 siz = sizeof(cmd) - n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
747 for (p = args; p && (s = *p); ++p) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
748 if ((n = strlen(s)) > siz-1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
749 die("stty parameter length too long\n");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
750 *q++ = ' ';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
751 memcpy(q, s, n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
752 q += n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
753 siz -= n + 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
754 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
755 *q = '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
756 if (system(cmd) != 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
757 perror("Couldn't call stty");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
758 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
759
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
760 int
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
761 ttynew(const char *line, char *cmd, const char *out, char **args)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
762 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
763 int m, s;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
764
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
765 if (out) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
766 term.mode |= MODE_PRINT;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
767 iofd = (!strcmp(out, "-")) ?
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
768 1 : open(out, O_WRONLY | O_CREAT, 0666);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
769 if (iofd < 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
770 fprintf(stderr, "Error opening %s:%s\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
771 out, strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
772 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
773 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
774
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
775 if (line) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
776 if ((cmdfd = open(line, O_RDWR)) < 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
777 die("open line '%s' failed: %s\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
778 line, strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
779 dup2(cmdfd, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
780 stty(args);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
781 return cmdfd;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
782 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
783
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
784 /* seems to work fine on linux, openbsd and freebsd */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
785 if (openpty(&m, &s, NULL, NULL, NULL) < 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
786 die("openpty failed: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
787
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
788 switch (pid = fork()) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
789 case -1:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
790 die("fork failed: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
791 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
792 case 0:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
793 close(iofd);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
794 close(m);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
795 setsid(); /* create a new process group */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
796 dup2(s, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
797 dup2(s, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
798 dup2(s, 2);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
799 if (ioctl(s, TIOCSCTTY, NULL) < 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
800 die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
801 if (s > 2)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
802 close(s);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
803 #ifdef __OpenBSD__
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
804 if (pledge("stdio getpw proc exec", NULL) == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
805 die("pledge\n");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
806 #endif
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
807 execsh(cmd, args);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
808 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
809 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
810 #ifdef __OpenBSD__
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
811 if (pledge("stdio rpath tty proc", NULL) == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
812 die("pledge\n");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
813 #endif
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
814 close(s);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
815 cmdfd = m;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
816 signal(SIGCHLD, sigchld);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
817 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
818 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
819 return cmdfd;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
820 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
821
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
822 size_t
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
823 ttyread(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
824 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
825 static char buf[BUFSIZ];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
826 static int buflen = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
827 int ret, written;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
828
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
829 /* append read bytes to unprocessed bytes */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
830 ret = read(cmdfd, buf+buflen, LEN(buf)-buflen);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
831
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
832 switch (ret) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
833 case 0:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
834 exit(0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
835 case -1:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
836 die("couldn't read from shell: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
837 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
838 buflen += ret;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
839 written = twrite(buf, buflen, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
840 buflen -= written;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
841 /* keep any incomplete UTF-8 byte sequence for the next call */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
842 if (buflen > 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
843 memmove(buf, buf + written, buflen);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
844 return ret;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
845 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
846 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
847
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
848 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
849 ttywrite(const char *s, size_t n, int may_echo)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
850 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
851 const char *next;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
852
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
853 if (may_echo && IS_SET(MODE_ECHO))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
854 twrite(s, n, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
855
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
856 if (!IS_SET(MODE_CRLF)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
857 ttywriteraw(s, n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
858 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
859 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
860
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
861 /* This is similar to how the kernel handles ONLCR for ttys */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
862 while (n > 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
863 if (*s == '\r') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
864 next = s + 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
865 ttywriteraw("\r\n", 2);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
866 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
867 next = memchr(s, '\r', n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
868 DEFAULT(next, s + n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
869 ttywriteraw(s, next - s);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
870 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
871 n -= next - s;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
872 s = next;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
873 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
874 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
875
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
876 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
877 ttywriteraw(const char *s, size_t n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
878 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
879 fd_set wfd, rfd;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
880 ssize_t r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
881 size_t lim = 256;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
882
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
883 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
884 * Remember that we are using a pty, which might be a modem line.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
885 * Writing too much will clog the line. That's why we are doing this
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
886 * dance.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
887 * FIXME: Migrate the world to Plan 9.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
888 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
889 while (n > 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
890 FD_ZERO(&wfd);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
891 FD_ZERO(&rfd);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
892 FD_SET(cmdfd, &wfd);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
893 FD_SET(cmdfd, &rfd);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
894
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
895 /* Check if we can write. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
896 if (pselect(cmdfd+1, &rfd, &wfd, NULL, NULL, NULL) < 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
897 if (errno == EINTR)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
898 continue;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
899 die("select failed: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
900 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
901 if (FD_ISSET(cmdfd, &wfd)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
902 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
903 * Only write the bytes written by ttywrite() or the
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
904 * default of 256. This seems to be a reasonable value
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
905 * for a serial line. Bigger values might clog the I/O.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
906 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
907 if ((r = write(cmdfd, s, (n < lim)? n : lim)) < 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
908 goto write_error;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
909 if (r < n) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
910 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
911 * We weren't able to write out everything.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
912 * This means the buffer is getting full
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
913 * again. Empty it.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
914 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
915 if (n < lim)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
916 lim = ttyread();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
917 n -= r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
918 s += r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
919 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
920 /* All bytes have been written. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
921 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
922 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
923 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
924 if (FD_ISSET(cmdfd, &rfd))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
925 lim = ttyread();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
926 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
927 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
928
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
929 write_error:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
930 die("write error on tty: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
931 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
932
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
933 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
934 ttyresize(int tw, int th)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
935 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
936 struct winsize w;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
937
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
938 w.ws_row = term.row;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
939 w.ws_col = term.col;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
940 w.ws_xpixel = tw;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
941 w.ws_ypixel = th;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
942 if (ioctl(cmdfd, TIOCSWINSZ, &w) < 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
943 fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
944 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
945
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
946 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
947 ttyhangup(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
948 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
949 /* Send SIGHUP to shell */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
950 kill(pid, SIGHUP);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
951 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
952
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
953 int
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
954 tattrset(int attr)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
955 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
956 int i, j;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
957
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
958 for (i = 0; i < term.row-1; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
959 for (j = 0; j < term.col-1; j++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
960 if (term.line[i][j].mode & attr)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
961 return 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
962 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
963 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
964
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
965 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
966 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
967
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
968 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
969 tsetdirt(int top, int bot)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
970 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
971 int i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
972
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
973 if (term.row <= 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
974 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
975
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
976 LIMIT(top, 0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
977 LIMIT(bot, 0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
978
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
979 for (i = top; i <= bot; i++)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
980 term.dirty[i] = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
981 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
982
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
983 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
984 tsetdirtattr(int attr)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
985 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
986 int i, j;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
987
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
988 for (i = 0; i < term.row-1; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
989 for (j = 0; j < term.col-1; j++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
990 if (term.line[i][j].mode & attr) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
991 tsetdirt(i, i);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
992 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
993 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
994 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
995 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
996 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
997
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
998 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
999 tfulldirt(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1000 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1001 tsetdirt(0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1002 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1003
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1004 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1005 tcursor(int mode)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1006 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1007 static TCursor c[2];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1008 int alt = IS_SET(MODE_ALTSCREEN);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1009
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1010 if (mode == CURSOR_SAVE) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1011 c[alt] = term.c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1012 } else if (mode == CURSOR_LOAD) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1013 term.c = c[alt];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1014 tmoveto(c[alt].x, c[alt].y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1015 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1016 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1017
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1018 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1019 treset(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1020 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1021 uint i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1022
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1023 term.c = (TCursor){{
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1024 .mode = ATTR_NULL,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1025 .fg = defaultfg,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1026 .bg = defaultbg
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1027 }, .x = 0, .y = 0, .state = CURSOR_DEFAULT};
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1028
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1029 memset(term.tabs, 0, term.col * sizeof(*term.tabs));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1030 for (i = tabspaces; i < term.col; i += tabspaces)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1031 term.tabs[i] = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1032 term.top = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1033 term.bot = term.row - 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1034 term.mode = MODE_WRAP|MODE_UTF8;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1035 memset(term.trantbl, CS_USA, sizeof(term.trantbl));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1036 term.charset = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1037
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1038 for (i = 0; i < 2; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1039 tmoveto(0, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1040 tcursor(CURSOR_SAVE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1041 tclearregion(0, 0, term.col-1, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1042 tswapscreen();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1043 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1044 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1045
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1046 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1047 tnew(int col, int row)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1048 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1049 term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1050 tresize(col, row);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1051 treset();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1052 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1053
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1054 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1055 tswapscreen(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1056 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1057 Line *tmp = term.line;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1058
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1059 term.line = term.alt;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1060 term.alt = tmp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1061 term.mode ^= MODE_ALTSCREEN;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1062 tfulldirt();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1063 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1064
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1065 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1066 tscrolldown(int orig, int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1067 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1068 int i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1069 Line temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1070
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1071 LIMIT(n, 0, term.bot-orig+1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1072
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1073 tsetdirt(orig, term.bot-n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1074 tclearregion(0, term.bot-n+1, term.col-1, term.bot);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1075
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1076 for (i = term.bot; i >= orig+n; i--) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1077 temp = term.line[i];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1078 term.line[i] = term.line[i-n];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1079 term.line[i-n] = temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1080 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1081
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1082 selscroll(orig, n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1083 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1084
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1085 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1086 tscrollup(int orig, int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1087 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1088 int i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1089 Line temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1090
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1091 LIMIT(n, 0, term.bot-orig+1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1092
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1093 tclearregion(0, orig, term.col-1, orig+n-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1094 tsetdirt(orig+n, term.bot);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1095
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1096 for (i = orig; i <= term.bot-n; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1097 temp = term.line[i];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1098 term.line[i] = term.line[i+n];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1099 term.line[i+n] = temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1100 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1101
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1102 selscroll(orig, -n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1103 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1104
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1105 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1106 selscroll(int orig, int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1107 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1108 if (sel.ob.x == -1 || sel.alt != IS_SET(MODE_ALTSCREEN))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1109 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1110
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1111 if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, term.bot)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1112 selclear();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1113 } else if (BETWEEN(sel.nb.y, orig, term.bot)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1114 sel.ob.y += n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1115 sel.oe.y += n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1116 if (sel.ob.y < term.top || sel.ob.y > term.bot ||
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1117 sel.oe.y < term.top || sel.oe.y > term.bot) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1118 selclear();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1119 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1120 selnormalize();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1121 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1122 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1123 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1124
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1125 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1126 tnewline(int first_col)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1127 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1128 int y = term.c.y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1129
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1130 if (y == term.bot) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1131 tscrollup(term.top, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1132 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1133 y++;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1134 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1135 tmoveto(first_col ? 0 : term.c.x, y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1136 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1137
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1138 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1139 csiparse(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1140 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1141 char *p = csiescseq.buf, *np;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1142 long int v;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1143 int sep = ';'; /* colon or semi-colon, but not both */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1144
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1145 csiescseq.narg = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1146 if (*p == '?') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1147 csiescseq.priv = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1148 p++;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1149 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1150
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1151 csiescseq.buf[csiescseq.len] = '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1152 while (p < csiescseq.buf+csiescseq.len) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1153 np = NULL;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1154 v = strtol(p, &np, 10);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1155 if (np == p)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1156 v = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1157 if (v == LONG_MAX || v == LONG_MIN)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1158 v = -1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1159 csiescseq.arg[csiescseq.narg++] = v;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1160 p = np;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1161 if (sep == ';' && *p == ':')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1162 sep = ':'; /* allow override to colon once */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1163 if (*p != sep || csiescseq.narg == ESC_ARG_SIZ)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1164 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1165 p++;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1166 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1167 csiescseq.mode[0] = *p++;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1168 csiescseq.mode[1] = (p < csiescseq.buf+csiescseq.len) ? *p : '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1169 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1170
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1171 /* for absolute user moves, when decom is set */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1172 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1173 tmoveato(int x, int y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1174 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1175 tmoveto(x, y + ((term.c.state & CURSOR_ORIGIN) ? term.top: 0));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1176 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1177
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1178 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1179 tmoveto(int x, int y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1180 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1181 int miny, maxy;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1182
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1183 if (term.c.state & CURSOR_ORIGIN) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1184 miny = term.top;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1185 maxy = term.bot;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1186 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1187 miny = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1188 maxy = term.row - 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1189 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1190 term.c.state &= ~CURSOR_WRAPNEXT;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1191 term.c.x = LIMIT(x, 0, term.col-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1192 term.c.y = LIMIT(y, miny, maxy);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1193 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1194
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1195 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1196 tsetchar(Rune u, const Glyph *attr, int x, int y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1197 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1198 static const char *vt100_0[62] = { /* 0x41 - 0x7e */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1199 "↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1200 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1201 0, 0, 0, 0, 0, 0, 0, 0, /* P - W */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1202 0, 0, 0, 0, 0, 0, 0, " ", /* X - _ */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1203 "◆", "▒", "␉", "␌", "␍", "␊", "°", "±", /* ` - g */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1204 "␤", "␋", "┘", "┐", "┌", "└", "┼", "⎺", /* h - o */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1205 "⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1206 "│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1207 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1208
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1209 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1210 * The table is proudly stolen from rxvt.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1211 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1212 if (term.trantbl[term.charset] == CS_GRAPHIC0 &&
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1213 BETWEEN(u, 0x41, 0x7e) && vt100_0[u - 0x41])
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1214 utf8decode(vt100_0[u - 0x41], &u, UTF_SIZ);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1215
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1216 if (term.line[y][x].mode & ATTR_WIDE) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1217 if (x+1 < term.col) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1218 term.line[y][x+1].u = ' ';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1219 term.line[y][x+1].mode &= ~ATTR_WDUMMY;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1220 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1221 } else if (term.line[y][x].mode & ATTR_WDUMMY) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1222 term.line[y][x-1].u = ' ';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1223 term.line[y][x-1].mode &= ~ATTR_WIDE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1224 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1225
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1226 term.dirty[y] = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1227 term.line[y][x] = *attr;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1228 term.line[y][x].u = u;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1229 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1230
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1231 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1232 tclearregion(int x1, int y1, int x2, int y2)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1233 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1234 int x, y, temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1235 Glyph *gp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1236
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1237 if (x1 > x2)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1238 temp = x1, x1 = x2, x2 = temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1239 if (y1 > y2)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1240 temp = y1, y1 = y2, y2 = temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1241
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1242 LIMIT(x1, 0, term.col-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1243 LIMIT(x2, 0, term.col-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1244 LIMIT(y1, 0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1245 LIMIT(y2, 0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1246
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1247 for (y = y1; y <= y2; y++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1248 term.dirty[y] = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1249 for (x = x1; x <= x2; x++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1250 gp = &term.line[y][x];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1251 if (selected(x, y))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1252 selclear();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1253 gp->fg = term.c.attr.fg;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1254 gp->bg = term.c.attr.bg;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1255 gp->mode = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1256 gp->u = ' ';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1257 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1258 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1259 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1260
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1261 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1262 tdeletechar(int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1263 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1264 int dst, src, size;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1265 Glyph *line;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1266
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1267 LIMIT(n, 0, term.col - term.c.x);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1268
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1269 dst = term.c.x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1270 src = term.c.x + n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1271 size = term.col - src;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1272 line = term.line[term.c.y];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1273
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1274 memmove(&line[dst], &line[src], size * sizeof(Glyph));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1275 tclearregion(term.col-n, term.c.y, term.col-1, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1276 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1277
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1278 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1279 tinsertblank(int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1280 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1281 int dst, src, size;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1282 Glyph *line;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1283
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1284 LIMIT(n, 0, term.col - term.c.x);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1285
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1286 dst = term.c.x + n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1287 src = term.c.x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1288 size = term.col - dst;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1289 line = term.line[term.c.y];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1290
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1291 memmove(&line[dst], &line[src], size * sizeof(Glyph));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1292 tclearregion(src, term.c.y, dst - 1, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1293 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1294
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1295 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1296 tinsertblankline(int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1297 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1298 if (BETWEEN(term.c.y, term.top, term.bot))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1299 tscrolldown(term.c.y, n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1300 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1301
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1302 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1303 tdeleteline(int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1304 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1305 if (BETWEEN(term.c.y, term.top, term.bot))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1306 tscrollup(term.c.y, n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1307 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1308
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1309 int32_t
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1310 tdefcolor(const int *attr, int *npar, int l)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1311 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1312 int32_t idx = -1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1313 uint r, g, b;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1314
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1315 switch (attr[*npar + 1]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1316 case 2: /* direct color in RGB space */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1317 if (*npar + 4 >= l) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1318 fprintf(stderr,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1319 "erresc(38): Incorrect number of parameters (%d)\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1320 *npar);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1321 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1322 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1323 r = attr[*npar + 2];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1324 g = attr[*npar + 3];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1325 b = attr[*npar + 4];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1326 *npar += 4;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1327 if (!BETWEEN(r, 0, 255) || !BETWEEN(g, 0, 255) || !BETWEEN(b, 0, 255))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1328 fprintf(stderr, "erresc: bad rgb color (%u,%u,%u)\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1329 r, g, b);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1330 else
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1331 idx = TRUECOLOR(r, g, b);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1332 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1333 case 5: /* indexed color */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1334 if (*npar + 2 >= l) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1335 fprintf(stderr,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1336 "erresc(38): Incorrect number of parameters (%d)\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1337 *npar);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1338 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1339 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1340 *npar += 2;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1341 if (!BETWEEN(attr[*npar], 0, 255))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1342 fprintf(stderr, "erresc: bad fgcolor %d\n", attr[*npar]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1343 else
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1344 idx = attr[*npar];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1345 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1346 case 0: /* implemented defined (only foreground) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1347 case 1: /* transparent */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1348 case 3: /* direct color in CMY space */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1349 case 4: /* direct color in CMYK space */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1350 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1351 fprintf(stderr,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1352 "erresc(38): gfx attr %d unknown\n", attr[*npar]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1353 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1354 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1355
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1356 return idx;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1357 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1358
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1359 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1360 tsetattr(const int *attr, int l)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1361 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1362 int i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1363 int32_t idx;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1364
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1365 for (i = 0; i < l; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1366 switch (attr[i]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1367 case 0:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1368 term.c.attr.mode &= ~(
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1369 ATTR_BOLD |
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1370 ATTR_FAINT |
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1371 ATTR_ITALIC |
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1372 ATTR_UNDERLINE |
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1373 ATTR_BLINK |
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1374 ATTR_REVERSE |
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1375 ATTR_INVISIBLE |
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1376 ATTR_STRUCK );
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1377 term.c.attr.fg = defaultfg;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1378 term.c.attr.bg = defaultbg;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1379 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1380 case 1:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1381 term.c.attr.mode |= ATTR_BOLD;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1382 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1383 case 2:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1384 term.c.attr.mode |= ATTR_FAINT;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1385 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1386 case 3:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1387 term.c.attr.mode |= ATTR_ITALIC;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1388 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1389 case 4:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1390 term.c.attr.mode |= ATTR_UNDERLINE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1391 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1392 case 5: /* slow blink */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1393 /* FALLTHROUGH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1394 case 6: /* rapid blink */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1395 term.c.attr.mode |= ATTR_BLINK;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1396 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1397 case 7:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1398 term.c.attr.mode |= ATTR_REVERSE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1399 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1400 case 8:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1401 term.c.attr.mode |= ATTR_INVISIBLE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1402 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1403 case 9:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1404 term.c.attr.mode |= ATTR_STRUCK;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1405 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1406 case 22:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1407 term.c.attr.mode &= ~(ATTR_BOLD | ATTR_FAINT);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1408 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1409 case 23:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1410 term.c.attr.mode &= ~ATTR_ITALIC;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1411 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1412 case 24:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1413 term.c.attr.mode &= ~ATTR_UNDERLINE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1414 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1415 case 25:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1416 term.c.attr.mode &= ~ATTR_BLINK;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1417 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1418 case 27:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1419 term.c.attr.mode &= ~ATTR_REVERSE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1420 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1421 case 28:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1422 term.c.attr.mode &= ~ATTR_INVISIBLE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1423 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1424 case 29:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1425 term.c.attr.mode &= ~ATTR_STRUCK;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1426 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1427 case 38:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1428 if ((idx = tdefcolor(attr, &i, l)) >= 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1429 term.c.attr.fg = idx;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1430 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1431 case 39: /* set foreground color to default */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1432 term.c.attr.fg = defaultfg;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1433 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1434 case 48:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1435 if ((idx = tdefcolor(attr, &i, l)) >= 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1436 term.c.attr.bg = idx;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1437 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1438 case 49: /* set background color to default */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1439 term.c.attr.bg = defaultbg;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1440 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1441 case 58:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1442 /* This starts a sequence to change the color of
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1443 * "underline" pixels. We don't support that and
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1444 * instead eat up a following "5;n" or "2;r;g;b". */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1445 tdefcolor(attr, &i, l);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1446 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1447 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1448 if (BETWEEN(attr[i], 30, 37)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1449 term.c.attr.fg = attr[i] - 30;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1450 } else if (BETWEEN(attr[i], 40, 47)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1451 term.c.attr.bg = attr[i] - 40;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1452 } else if (BETWEEN(attr[i], 90, 97)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1453 term.c.attr.fg = attr[i] - 90 + 8;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1454 } else if (BETWEEN(attr[i], 100, 107)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1455 term.c.attr.bg = attr[i] - 100 + 8;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1456 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1457 fprintf(stderr,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1458 "erresc(default): gfx attr %d unknown\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1459 attr[i]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1460 csidump();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1461 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1462 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1463 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1464 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1465 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1466
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1467 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1468 tsetscroll(int t, int b)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1469 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1470 int temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1471
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1472 LIMIT(t, 0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1473 LIMIT(b, 0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1474 if (t > b) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1475 temp = t;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1476 t = b;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1477 b = temp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1478 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1479 term.top = t;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1480 term.bot = b;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1481 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1482
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1483 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1484 tsetmode(int priv, int set, const int *args, int narg)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1485 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1486 int alt; const int *lim;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1487
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1488 for (lim = args + narg; args < lim; ++args) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1489 if (priv) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1490 switch (*args) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1491 case 1: /* DECCKM -- Cursor key */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1492 xsetmode(set, MODE_APPCURSOR);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1493 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1494 case 5: /* DECSCNM -- Reverse video */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1495 xsetmode(set, MODE_REVERSE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1496 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1497 case 6: /* DECOM -- Origin */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1498 MODBIT(term.c.state, set, CURSOR_ORIGIN);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1499 tmoveato(0, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1500 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1501 case 7: /* DECAWM -- Auto wrap */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1502 MODBIT(term.mode, set, MODE_WRAP);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1503 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1504 case 0: /* Error (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1505 case 2: /* DECANM -- ANSI/VT52 (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1506 case 3: /* DECCOLM -- Column (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1507 case 4: /* DECSCLM -- Scroll (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1508 case 8: /* DECARM -- Auto repeat (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1509 case 18: /* DECPFF -- Printer feed (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1510 case 19: /* DECPEX -- Printer extent (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1511 case 42: /* DECNRCM -- National characters (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1512 case 12: /* att610 -- Start blinking cursor (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1513 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1514 case 25: /* DECTCEM -- Text Cursor Enable Mode */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1515 xsetmode(!set, MODE_HIDE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1516 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1517 case 9: /* X10 mouse compatibility mode */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1518 xsetpointermotion(0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1519 xsetmode(0, MODE_MOUSE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1520 xsetmode(set, MODE_MOUSEX10);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1521 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1522 case 1000: /* 1000: report button press */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1523 xsetpointermotion(0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1524 xsetmode(0, MODE_MOUSE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1525 xsetmode(set, MODE_MOUSEBTN);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1526 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1527 case 1002: /* 1002: report motion on button press */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1528 xsetpointermotion(0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1529 xsetmode(0, MODE_MOUSE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1530 xsetmode(set, MODE_MOUSEMOTION);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1531 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1532 case 1003: /* 1003: enable all mouse motions */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1533 xsetpointermotion(set);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1534 xsetmode(0, MODE_MOUSE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1535 xsetmode(set, MODE_MOUSEMANY);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1536 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1537 case 1004: /* 1004: send focus events to tty */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1538 xsetmode(set, MODE_FOCUS);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1539 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1540 case 1006: /* 1006: extended reporting mode */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1541 xsetmode(set, MODE_MOUSESGR);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1542 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1543 case 1034: /* 1034: enable 8-bit mode for keyboard input */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1544 xsetmode(set, MODE_8BIT);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1545 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1546 case 1049: /* swap screen & set/restore cursor as xterm */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1547 if (!allowaltscreen)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1548 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1549 tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1550 /* FALLTHROUGH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1551 case 47: /* swap screen buffer */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1552 case 1047: /* swap screen buffer */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1553 if (!allowaltscreen)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1554 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1555 alt = IS_SET(MODE_ALTSCREEN);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1556 if (alt) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1557 tclearregion(0, 0, term.col-1,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1558 term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1559 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1560 if (set ^ alt) /* set is always 1 or 0 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1561 tswapscreen();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1562 if (*args != 1049)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1563 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1564 /* FALLTHROUGH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1565 case 1048: /* save/restore cursor (like DECSC/DECRC) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1566 tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1567 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1568 case 2004: /* 2004: bracketed paste mode */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1569 xsetmode(set, MODE_BRCKTPASTE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1570 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1571 /* Not implemented mouse modes. See comments there. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1572 case 1001: /* mouse highlight mode; can hang the
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1573 terminal by design when implemented. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1574 case 1005: /* UTF-8 mouse mode; will confuse
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1575 applications not supporting UTF-8
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1576 and luit. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1577 case 1015: /* urxvt mangled mouse mode; incompatible
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1578 and can be mistaken for other control
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1579 codes. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1580 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1581 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1582 fprintf(stderr,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1583 "erresc: unknown private set/reset mode %d\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1584 *args);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1585 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1586 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1587 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1588 switch (*args) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1589 case 0: /* Error (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1590 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1591 case 2:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1592 xsetmode(set, MODE_KBDLOCK);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1593 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1594 case 4: /* IRM -- Insertion-replacement */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1595 MODBIT(term.mode, set, MODE_INSERT);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1596 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1597 case 12: /* SRM -- Send/Receive */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1598 MODBIT(term.mode, !set, MODE_ECHO);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1599 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1600 case 20: /* LNM -- Linefeed/new line */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1601 MODBIT(term.mode, set, MODE_CRLF);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1602 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1603 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1604 fprintf(stderr,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1605 "erresc: unknown set/reset mode %d\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1606 *args);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1607 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1608 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1609 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1610 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1611 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1612
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1613 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1614 csihandle(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1615 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1616 char buf[40];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1617 int len;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1618
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1619 switch (csiescseq.mode[0]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1620 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1621 unknown:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1622 fprintf(stderr, "erresc: unknown csi ");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1623 csidump();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1624 /* die(""); */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1625 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1626 case '@': /* ICH -- Insert <n> blank char */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1627 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1628 tinsertblank(csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1629 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1630 case 'A': /* CUU -- Cursor <n> Up */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1631 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1632 tmoveto(term.c.x, term.c.y-csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1633 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1634 case 'B': /* CUD -- Cursor <n> Down */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1635 case 'e': /* VPR --Cursor <n> Down */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1636 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1637 tmoveto(term.c.x, term.c.y+csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1638 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1639 case 'i': /* MC -- Media Copy */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1640 switch (csiescseq.arg[0]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1641 case 0:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1642 tdump();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1643 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1644 case 1:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1645 tdumpline(term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1646 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1647 case 2:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1648 tdumpsel();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1649 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1650 case 4:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1651 term.mode &= ~MODE_PRINT;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1652 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1653 case 5:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1654 term.mode |= MODE_PRINT;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1655 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1656 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1657 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1658 case 'c': /* DA -- Device Attributes */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1659 if (csiescseq.arg[0] == 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1660 ttywrite(vtiden, strlen(vtiden), 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1661 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1662 case 'b': /* REP -- if last char is printable print it <n> more times */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1663 LIMIT(csiescseq.arg[0], 1, 65535);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1664 if (term.lastc)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1665 while (csiescseq.arg[0]-- > 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1666 tputc(term.lastc);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1667 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1668 case 'C': /* CUF -- Cursor <n> Forward */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1669 case 'a': /* HPR -- Cursor <n> Forward */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1670 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1671 tmoveto(term.c.x+csiescseq.arg[0], term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1672 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1673 case 'D': /* CUB -- Cursor <n> Backward */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1674 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1675 tmoveto(term.c.x-csiescseq.arg[0], term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1676 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1677 case 'E': /* CNL -- Cursor <n> Down and first col */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1678 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1679 tmoveto(0, term.c.y+csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1680 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1681 case 'F': /* CPL -- Cursor <n> Up and first col */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1682 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1683 tmoveto(0, term.c.y-csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1684 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1685 case 'g': /* TBC -- Tabulation clear */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1686 switch (csiescseq.arg[0]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1687 case 0: /* clear current tab stop */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1688 term.tabs[term.c.x] = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1689 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1690 case 3: /* clear all the tabs */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1691 memset(term.tabs, 0, term.col * sizeof(*term.tabs));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1692 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1693 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1694 goto unknown;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1695 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1696 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1697 case 'G': /* CHA -- Move to <col> */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1698 case '`': /* HPA */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1699 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1700 tmoveto(csiescseq.arg[0]-1, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1701 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1702 case 'H': /* CUP -- Move to <row> <col> */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1703 case 'f': /* HVP */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1704 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1705 DEFAULT(csiescseq.arg[1], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1706 tmoveato(csiescseq.arg[1]-1, csiescseq.arg[0]-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1707 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1708 case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1709 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1710 tputtab(csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1711 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1712 case 'J': /* ED -- Clear screen */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1713 switch (csiescseq.arg[0]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1714 case 0: /* below */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1715 tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1716 if (term.c.y < term.row-1) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1717 tclearregion(0, term.c.y+1, term.col-1,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1718 term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1719 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1720 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1721 case 1: /* above */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1722 if (term.c.y > 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1723 tclearregion(0, 0, term.col-1, term.c.y-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1724 tclearregion(0, term.c.y, term.c.x, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1725 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1726 case 2: /* all */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1727 tclearregion(0, 0, term.col-1, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1728 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1729 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1730 goto unknown;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1731 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1732 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1733 case 'K': /* EL -- Clear line */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1734 switch (csiescseq.arg[0]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1735 case 0: /* right */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1736 tclearregion(term.c.x, term.c.y, term.col-1,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1737 term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1738 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1739 case 1: /* left */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1740 tclearregion(0, term.c.y, term.c.x, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1741 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1742 case 2: /* all */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1743 tclearregion(0, term.c.y, term.col-1, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1744 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1745 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1746 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1747 case 'S': /* SU -- Scroll <n> line up */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1748 if (csiescseq.priv) break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1749 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1750 tscrollup(term.top, csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1751 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1752 case 'T': /* SD -- Scroll <n> line down */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1753 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1754 tscrolldown(term.top, csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1755 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1756 case 'L': /* IL -- Insert <n> blank lines */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1757 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1758 tinsertblankline(csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1759 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1760 case 'l': /* RM -- Reset Mode */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1761 tsetmode(csiescseq.priv, 0, csiescseq.arg, csiescseq.narg);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1762 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1763 case 'M': /* DL -- Delete <n> lines */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1764 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1765 tdeleteline(csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1766 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1767 case 'X': /* ECH -- Erase <n> char */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1768 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1769 tclearregion(term.c.x, term.c.y,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1770 term.c.x + csiescseq.arg[0] - 1, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1771 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1772 case 'P': /* DCH -- Delete <n> char */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1773 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1774 tdeletechar(csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1775 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1776 case 'Z': /* CBT -- Cursor Backward Tabulation <n> tab stops */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1777 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1778 tputtab(-csiescseq.arg[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1779 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1780 case 'd': /* VPA -- Move to <row> */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1781 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1782 tmoveato(term.c.x, csiescseq.arg[0]-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1783 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1784 case 'h': /* SM -- Set terminal mode */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1785 tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1786 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1787 case 'm': /* SGR -- Terminal attribute (color) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1788 tsetattr(csiescseq.arg, csiescseq.narg);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1789 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1790 case 'n': /* DSR -- Device Status Report */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1791 switch (csiescseq.arg[0]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1792 case 5: /* Status Report "OK" `0n` */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1793 ttywrite("\033[0n", sizeof("\033[0n") - 1, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1794 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1795 case 6: /* Report Cursor Position (CPR) "<row>;<column>R" */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1796 len = snprintf(buf, sizeof(buf), "\033[%i;%iR",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1797 term.c.y+1, term.c.x+1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1798 ttywrite(buf, len, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1799 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1800 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1801 goto unknown;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1802 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1803 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1804 case 'r': /* DECSTBM -- Set Scrolling Region */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1805 if (csiescseq.priv) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1806 goto unknown;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1807 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1808 DEFAULT(csiescseq.arg[0], 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1809 DEFAULT(csiescseq.arg[1], term.row);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1810 tsetscroll(csiescseq.arg[0]-1, csiescseq.arg[1]-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1811 tmoveato(0, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1812 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1813 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1814 case 's': /* DECSC -- Save cursor position (ANSI.SYS) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1815 tcursor(CURSOR_SAVE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1816 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1817 case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1818 if (csiescseq.priv) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1819 goto unknown;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1820 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1821 tcursor(CURSOR_LOAD);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1822 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1823 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1824 case ' ':
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1825 switch (csiescseq.mode[1]) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1826 case 'q': /* DECSCUSR -- Set Cursor Style */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1827 if (xsetcursor(csiescseq.arg[0]))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1828 goto unknown;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1829 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1830 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1831 goto unknown;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1832 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1833 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1834 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1835 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1836
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1837 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1838 csidump(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1839 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1840 size_t i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1841 uint c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1842
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1843 fprintf(stderr, "ESC[");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1844 for (i = 0; i < csiescseq.len; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1845 c = csiescseq.buf[i] & 0xff;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1846 if (isprint(c)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1847 putc(c, stderr);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1848 } else if (c == '\n') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1849 fprintf(stderr, "(\\n)");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1850 } else if (c == '\r') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1851 fprintf(stderr, "(\\r)");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1852 } else if (c == 0x1b) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1853 fprintf(stderr, "(\\e)");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1854 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1855 fprintf(stderr, "(%02x)", c);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1856 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1857 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1858 putc('\n', stderr);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1859 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1860
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1861 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1862 csireset(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1863 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1864 memset(&csiescseq, 0, sizeof(csiescseq));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1865 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1866
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1867 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1868 osc_color_response(int num, int index, int is_osc4)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1869 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1870 int n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1871 char buf[32];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1872 unsigned char r, g, b;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1873
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1874 if (xgetcolor(is_osc4 ? num : index, &r, &g, &b)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1875 fprintf(stderr, "erresc: failed to fetch %s color %d\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1876 is_osc4 ? "osc4" : "osc",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1877 is_osc4 ? num : index);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1878 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1879 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1880
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1881 n = snprintf(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1882 is_osc4 ? "4;" : "", num, r, r, g, g, b, b);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1883 if (n < 0 || n >= sizeof(buf)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1884 fprintf(stderr, "error: %s while printing %s response\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1885 n < 0 ? "snprintf failed" : "truncation occurred",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1886 is_osc4 ? "osc4" : "osc");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1887 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1888 ttywrite(buf, n, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1889 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1890 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1891
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1892 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1893 strhandle(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1894 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1895 char *p = NULL, *dec;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1896 int j, narg, par;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1897 const struct { int idx; char *str; } osc_table[] = {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1898 { defaultfg, "foreground" },
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1899 { defaultbg, "background" },
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1900 { defaultcs, "cursor" }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1901 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1902
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1903 term.esc &= ~(ESC_STR_END|ESC_STR);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1904 strparse();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1905 par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1906
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1907 switch (strescseq.type) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1908 case ']': /* OSC -- Operating System Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1909 switch (par) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1910 case 0:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1911 if (narg > 1) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1912 xsettitle(strescseq.args[1]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1913 xseticontitle(strescseq.args[1]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1914 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1915 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1916 case 1:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1917 if (narg > 1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1918 xseticontitle(strescseq.args[1]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1919 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1920 case 2:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1921 if (narg > 1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1922 xsettitle(strescseq.args[1]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1923 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1924 case 52: /* manipulate selection data */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1925 if (narg > 2 && allowwindowops) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1926 dec = base64dec(strescseq.args[2]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1927 if (dec) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1928 xsetsel(dec);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1929 xclipcopy();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1930 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1931 fprintf(stderr, "erresc: invalid base64\n");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1932 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1933 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1934 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1935 case 10: /* set dynamic VT100 text foreground color */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1936 case 11: /* set dynamic VT100 text background color */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1937 case 12: /* set dynamic text cursor color */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1938 if (narg < 2)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1939 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1940 p = strescseq.args[1];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1941 if ((j = par - 10) < 0 || j >= LEN(osc_table))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1942 break; /* shouldn't be possible */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1943
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1944 if (!strcmp(p, "?")) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1945 osc_color_response(par, osc_table[j].idx, 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1946 } else if (xsetcolorname(osc_table[j].idx, p)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1947 fprintf(stderr, "erresc: invalid %s color: %s\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1948 osc_table[j].str, p);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1949 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1950 tfulldirt();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1951 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1952 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1953 case 4: /* color set */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1954 if (narg < 3)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1955 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1956 p = strescseq.args[2];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1957 /* FALLTHROUGH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1958 case 104: /* color reset */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1959 j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1960
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1961 if (p && !strcmp(p, "?")) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1962 osc_color_response(j, 0, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1963 } else if (xsetcolorname(j, p)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1964 if (par == 104 && narg <= 1) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1965 xloadcols();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1966 return; /* color reset without parameter */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1967 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1968 fprintf(stderr, "erresc: invalid color j=%d, p=%s\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1969 j, p ? p : "(null)");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1970 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1971 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1972 * TODO if defaultbg color is changed, borders
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1973 * are dirty
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1974 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1975 tfulldirt();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1976 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1977 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1978 case 110: /* reset dynamic VT100 text foreground color */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1979 case 111: /* reset dynamic VT100 text background color */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1980 case 112: /* reset dynamic text cursor color */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1981 if (narg != 1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1982 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1983 if ((j = par - 110) < 0 || j >= LEN(osc_table))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1984 break; /* shouldn't be possible */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1985 if (xsetcolorname(osc_table[j].idx, NULL)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1986 fprintf(stderr, "erresc: %s color not found\n", osc_table[j].str);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1987 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1988 tfulldirt();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1989 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1990 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1991 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1992 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1993 case 'k': /* old title set compatibility */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1994 xsettitle(strescseq.args[0]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1995 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1996 case 'P': /* DCS -- Device Control String */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1997 case '_': /* APC -- Application Program Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1998 case '^': /* PM -- Privacy Message */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1999 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2000 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2001
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2002 fprintf(stderr, "erresc: unknown str ");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2003 strdump();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2004 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2005
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2006 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2007 strparse(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2008 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2009 int c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2010 char *p = strescseq.buf;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2011
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2012 strescseq.narg = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2013 strescseq.buf[strescseq.len] = '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2014
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2015 if (*p == '\0')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2016 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2017
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2018 while (strescseq.narg < STR_ARG_SIZ) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2019 strescseq.args[strescseq.narg++] = p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2020 while ((c = *p) != ';' && c != '\0')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2021 ++p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2022 if (c == '\0')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2023 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2024 *p++ = '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2025 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2026 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2027
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2028 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2029 strdump(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2030 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2031 size_t i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2032 uint c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2033
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2034 fprintf(stderr, "ESC%c", strescseq.type);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2035 for (i = 0; i < strescseq.len; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2036 c = strescseq.buf[i] & 0xff;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2037 if (c == '\0') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2038 putc('\n', stderr);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2039 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2040 } else if (isprint(c)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2041 putc(c, stderr);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2042 } else if (c == '\n') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2043 fprintf(stderr, "(\\n)");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2044 } else if (c == '\r') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2045 fprintf(stderr, "(\\r)");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2046 } else if (c == 0x1b) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2047 fprintf(stderr, "(\\e)");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2048 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2049 fprintf(stderr, "(%02x)", c);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2050 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2051 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2052 fprintf(stderr, "ESC\\\n");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2053 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2054
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2055 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2056 strreset(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2057 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2058 strescseq = (STREscape){
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2059 .buf = xrealloc(strescseq.buf, STR_BUF_SIZ),
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2060 .siz = STR_BUF_SIZ,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2061 };
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2062 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2063
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2064 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2065 sendbreak(const Arg *arg)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2066 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2067 if (tcsendbreak(cmdfd, 0))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2068 perror("Error sending break");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2069 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2070
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2071 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2072 tprinter(char *s, size_t len)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2073 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2074 if (iofd != -1 && xwrite(iofd, s, len) < 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2075 perror("Error writing to output file");
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2076 close(iofd);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2077 iofd = -1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2078 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2079 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2080
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2081 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2082 toggleprinter(const Arg *arg)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2083 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2084 term.mode ^= MODE_PRINT;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2085 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2086
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2087 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2088 printscreen(const Arg *arg)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2089 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2090 tdump();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2091 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2092
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2093 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2094 printsel(const Arg *arg)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2095 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2096 tdumpsel();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2097 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2098
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2099 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2100 tdumpsel(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2101 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2102 char *ptr;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2103
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2104 if ((ptr = getsel())) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2105 tprinter(ptr, strlen(ptr));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2106 free(ptr);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2107 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2108 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2109
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2110 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2111 tdumpline(int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2112 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2113 char buf[UTF_SIZ];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2114 const Glyph *bp, *end;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2115
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2116 bp = &term.line[n][0];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2117 end = &bp[MIN(tlinelen(n), term.col) - 1];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2118 if (bp != end || bp->u != ' ') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2119 for ( ; bp <= end; ++bp)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2120 tprinter(buf, utf8encode(bp->u, buf));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2121 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2122 tprinter("\n", 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2123 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2124
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2125 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2126 tdump(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2127 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2128 int i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2129
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2130 for (i = 0; i < term.row; ++i)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2131 tdumpline(i);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2132 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2133
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2134 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2135 tputtab(int n)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2136 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2137 uint x = term.c.x;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2138
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2139 if (n > 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2140 while (x < term.col && n--)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2141 for (++x; x < term.col && !term.tabs[x]; ++x)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2142 /* nothing */ ;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2143 } else if (n < 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2144 while (x > 0 && n++)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2145 for (--x; x > 0 && !term.tabs[x]; --x)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2146 /* nothing */ ;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2147 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2148 term.c.x = LIMIT(x, 0, term.col-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2149 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2150
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2151 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2152 tdefutf8(char ascii)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2153 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2154 if (ascii == 'G')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2155 term.mode |= MODE_UTF8;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2156 else if (ascii == '@')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2157 term.mode &= ~MODE_UTF8;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2158 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2159
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2160 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2161 tdeftran(char ascii)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2162 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2163 static char cs[] = "0B";
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2164 static int vcs[] = {CS_GRAPHIC0, CS_USA};
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2165 char *p;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2166
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2167 if ((p = strchr(cs, ascii)) == NULL) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2168 fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2169 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2170 term.trantbl[term.icharset] = vcs[p - cs];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2171 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2172 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2173
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2174 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2175 tdectest(char c)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2176 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2177 int x, y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2178
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2179 if (c == '8') { /* DEC screen alignment test. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2180 for (x = 0; x < term.col; ++x) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2181 for (y = 0; y < term.row; ++y)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2182 tsetchar('E', &term.c.attr, x, y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2183 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2184 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2185 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2186
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2187 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2188 tstrsequence(uchar c)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2189 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2190 switch (c) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2191 case 0x90: /* DCS -- Device Control String */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2192 c = 'P';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2193 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2194 case 0x9f: /* APC -- Application Program Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2195 c = '_';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2196 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2197 case 0x9e: /* PM -- Privacy Message */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2198 c = '^';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2199 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2200 case 0x9d: /* OSC -- Operating System Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2201 c = ']';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2202 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2203 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2204 strreset();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2205 strescseq.type = c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2206 term.esc |= ESC_STR;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2207 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2208
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2209 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2210 tcontrolcode(uchar ascii)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2211 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2212 switch (ascii) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2213 case '\t': /* HT */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2214 tputtab(1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2215 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2216 case '\b': /* BS */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2217 tmoveto(term.c.x-1, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2218 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2219 case '\r': /* CR */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2220 tmoveto(0, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2221 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2222 case '\f': /* LF */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2223 case '\v': /* VT */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2224 case '\n': /* LF */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2225 /* go to first col if the mode is set */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2226 tnewline(IS_SET(MODE_CRLF));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2227 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2228 case '\a': /* BEL */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2229 if (term.esc & ESC_STR_END) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2230 /* backwards compatibility to xterm */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2231 strhandle();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2232 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2233 xbell();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2234 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2235 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2236 case '\033': /* ESC */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2237 csireset();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2238 term.esc &= ~(ESC_CSI|ESC_ALTCHARSET|ESC_TEST);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2239 term.esc |= ESC_START;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2240 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2241 case '\016': /* SO (LS1 -- Locking shift 1) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2242 case '\017': /* SI (LS0 -- Locking shift 0) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2243 term.charset = 1 - (ascii - '\016');
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2244 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2245 case '\032': /* SUB */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2246 tsetchar('?', &term.c.attr, term.c.x, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2247 /* FALLTHROUGH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2248 case '\030': /* CAN */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2249 csireset();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2250 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2251 case '\005': /* ENQ (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2252 case '\000': /* NUL (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2253 case '\021': /* XON (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2254 case '\023': /* XOFF (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2255 case 0177: /* DEL (IGNORED) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2256 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2257 case 0x80: /* TODO: PAD */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2258 case 0x81: /* TODO: HOP */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2259 case 0x82: /* TODO: BPH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2260 case 0x83: /* TODO: NBH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2261 case 0x84: /* TODO: IND */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2262 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2263 case 0x85: /* NEL -- Next line */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2264 tnewline(1); /* always go to first col */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2265 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2266 case 0x86: /* TODO: SSA */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2267 case 0x87: /* TODO: ESA */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2268 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2269 case 0x88: /* HTS -- Horizontal tab stop */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2270 term.tabs[term.c.x] = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2271 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2272 case 0x89: /* TODO: HTJ */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2273 case 0x8a: /* TODO: VTS */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2274 case 0x8b: /* TODO: PLD */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2275 case 0x8c: /* TODO: PLU */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2276 case 0x8d: /* TODO: RI */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2277 case 0x8e: /* TODO: SS2 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2278 case 0x8f: /* TODO: SS3 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2279 case 0x91: /* TODO: PU1 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2280 case 0x92: /* TODO: PU2 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2281 case 0x93: /* TODO: STS */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2282 case 0x94: /* TODO: CCH */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2283 case 0x95: /* TODO: MW */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2284 case 0x96: /* TODO: SPA */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2285 case 0x97: /* TODO: EPA */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2286 case 0x98: /* TODO: SOS */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2287 case 0x99: /* TODO: SGCI */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2288 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2289 case 0x9a: /* DECID -- Identify Terminal */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2290 ttywrite(vtiden, strlen(vtiden), 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2291 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2292 case 0x9b: /* TODO: CSI */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2293 case 0x9c: /* TODO: ST */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2294 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2295 case 0x90: /* DCS -- Device Control String */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2296 case 0x9d: /* OSC -- Operating System Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2297 case 0x9e: /* PM -- Privacy Message */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2298 case 0x9f: /* APC -- Application Program Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2299 tstrsequence(ascii);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2300 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2301 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2302 /* only CAN, SUB, \a and C1 chars interrupt a sequence */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2303 term.esc &= ~(ESC_STR_END|ESC_STR);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2304 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2305
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2306 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2307 * returns 1 when the sequence is finished and it hasn't to read
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2308 * more characters for this sequence, otherwise 0
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2309 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2310 int
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2311 eschandle(uchar ascii)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2312 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2313 switch (ascii) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2314 case '[':
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2315 term.esc |= ESC_CSI;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2316 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2317 case '#':
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2318 term.esc |= ESC_TEST;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2319 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2320 case '%':
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2321 term.esc |= ESC_UTF8;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2322 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2323 case 'P': /* DCS -- Device Control String */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2324 case '_': /* APC -- Application Program Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2325 case '^': /* PM -- Privacy Message */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2326 case ']': /* OSC -- Operating System Command */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2327 case 'k': /* old title set compatibility */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2328 tstrsequence(ascii);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2329 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2330 case 'n': /* LS2 -- Locking shift 2 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2331 case 'o': /* LS3 -- Locking shift 3 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2332 term.charset = 2 + (ascii - 'n');
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2333 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2334 case '(': /* GZD4 -- set primary charset G0 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2335 case ')': /* G1D4 -- set secondary charset G1 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2336 case '*': /* G2D4 -- set tertiary charset G2 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2337 case '+': /* G3D4 -- set quaternary charset G3 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2338 term.icharset = ascii - '(';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2339 term.esc |= ESC_ALTCHARSET;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2340 return 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2341 case 'D': /* IND -- Linefeed */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2342 if (term.c.y == term.bot) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2343 tscrollup(term.top, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2344 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2345 tmoveto(term.c.x, term.c.y+1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2346 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2347 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2348 case 'E': /* NEL -- Next line */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2349 tnewline(1); /* always go to first col */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2350 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2351 case 'H': /* HTS -- Horizontal tab stop */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2352 term.tabs[term.c.x] = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2353 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2354 case 'M': /* RI -- Reverse index */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2355 if (term.c.y == term.top) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2356 tscrolldown(term.top, 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2357 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2358 tmoveto(term.c.x, term.c.y-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2359 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2360 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2361 case 'Z': /* DECID -- Identify Terminal */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2362 ttywrite(vtiden, strlen(vtiden), 0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2363 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2364 case 'c': /* RIS -- Reset to initial state */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2365 treset();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2366 resettitle();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2367 xloadcols();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2368 xsetmode(0, MODE_HIDE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2369 xsetmode(0, MODE_BRCKTPASTE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2370 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2371 case '=': /* DECPAM -- Application keypad */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2372 xsetmode(1, MODE_APPKEYPAD);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2373 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2374 case '>': /* DECPNM -- Normal keypad */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2375 xsetmode(0, MODE_APPKEYPAD);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2376 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2377 case '7': /* DECSC -- Save Cursor */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2378 tcursor(CURSOR_SAVE);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2379 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2380 case '8': /* DECRC -- Restore Cursor */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2381 tcursor(CURSOR_LOAD);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2382 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2383 case '\\': /* ST -- String Terminator */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2384 if (term.esc & ESC_STR_END)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2385 strhandle();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2386 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2387 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2388 fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2389 (uchar) ascii, isprint(ascii)? ascii:'.');
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2390 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2391 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2392 return 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2393 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2394
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2395 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2396 tputc(Rune u)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2397 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2398 char c[UTF_SIZ];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2399 int control;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2400 int width, len;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2401 Glyph *gp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2402
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2403 control = ISCONTROL(u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2404 if (u < 127 || !IS_SET(MODE_UTF8)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2405 c[0] = u;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2406 width = len = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2407 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2408 len = utf8encode(u, c);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2409 if (!control && (width = wcwidth(u)) == -1)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2410 width = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2411 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2412
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2413 if (IS_SET(MODE_PRINT))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2414 tprinter(c, len);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2415
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2416 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2417 * STR sequence must be checked before anything else
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2418 * because it uses all following characters until it
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2419 * receives a ESC, a SUB, a ST or any other C1 control
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2420 * character.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2421 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2422 if (term.esc & ESC_STR) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2423 if (u == '\a' || u == 030 || u == 032 || u == 033 ||
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2424 ISCONTROLC1(u)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2425 term.esc &= ~(ESC_START|ESC_STR);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2426 term.esc |= ESC_STR_END;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2427 goto check_control_code;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2428 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2429
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2430 if (strescseq.len+len >= strescseq.siz) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2431 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2432 * Here is a bug in terminals. If the user never sends
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2433 * some code to stop the str or esc command, then st
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2434 * will stop responding. But this is better than
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2435 * silently failing with unknown characters. At least
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2436 * then users will report back.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2437 *
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2438 * In the case users ever get fixed, here is the code:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2439 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2440 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2441 * term.esc = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2442 * strhandle();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2443 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2444 if (strescseq.siz > (SIZE_MAX - UTF_SIZ) / 2)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2445 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2446 strescseq.siz *= 2;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2447 strescseq.buf = xrealloc(strescseq.buf, strescseq.siz);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2448 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2449
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2450 memmove(&strescseq.buf[strescseq.len], c, len);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2451 strescseq.len += len;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2452 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2453 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2454
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2455 check_control_code:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2456 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2457 * Actions of control codes must be performed as soon they arrive
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2458 * because they can be embedded inside a control sequence, and
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2459 * they must not cause conflicts with sequences.
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2460 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2461 if (control) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2462 /* in UTF-8 mode ignore handling C1 control characters */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2463 if (IS_SET(MODE_UTF8) && ISCONTROLC1(u))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2464 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2465 tcontrolcode(u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2466 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2467 * control codes are not shown ever
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2468 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2469 if (!term.esc)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2470 term.lastc = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2471 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2472 } else if (term.esc & ESC_START) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2473 if (term.esc & ESC_CSI) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2474 csiescseq.buf[csiescseq.len++] = u;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2475 if (BETWEEN(u, 0x40, 0x7E)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2476 || csiescseq.len >= \
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2477 sizeof(csiescseq.buf)-1) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2478 term.esc = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2479 csiparse();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2480 csihandle();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2481 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2482 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2483 } else if (term.esc & ESC_UTF8) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2484 tdefutf8(u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2485 } else if (term.esc & ESC_ALTCHARSET) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2486 tdeftran(u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2487 } else if (term.esc & ESC_TEST) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2488 tdectest(u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2489 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2490 if (!eschandle(u))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2491 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2492 /* sequence already finished */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2493 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2494 term.esc = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2495 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2496 * All characters which form part of a sequence are not
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2497 * printed
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2498 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2499 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2500 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2501 if (selected(term.c.x, term.c.y))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2502 selclear();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2503
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2504 gp = &term.line[term.c.y][term.c.x];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2505 if (IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2506 gp->mode |= ATTR_WRAP;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2507 tnewline(1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2508 gp = &term.line[term.c.y][term.c.x];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2509 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2510
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2511 if (IS_SET(MODE_INSERT) && term.c.x+width < term.col) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2512 memmove(gp+width, gp, (term.col - term.c.x - width) * sizeof(Glyph));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2513 gp->mode &= ~ATTR_WIDE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2514 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2515
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2516 if (term.c.x+width > term.col) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2517 if (IS_SET(MODE_WRAP))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2518 tnewline(1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2519 else
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2520 tmoveto(term.col - width, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2521 gp = &term.line[term.c.y][term.c.x];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2522 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2523
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2524 tsetchar(u, &term.c.attr, term.c.x, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2525 term.lastc = u;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2526
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2527 if (width == 2) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2528 gp->mode |= ATTR_WIDE;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2529 if (term.c.x+1 < term.col) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2530 if (gp[1].mode == ATTR_WIDE && term.c.x+2 < term.col) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2531 gp[2].u = ' ';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2532 gp[2].mode &= ~ATTR_WDUMMY;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2533 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2534 gp[1].u = '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2535 gp[1].mode = ATTR_WDUMMY;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2536 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2537 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2538 if (term.c.x+width < term.col) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2539 tmoveto(term.c.x+width, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2540 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2541 term.c.state |= CURSOR_WRAPNEXT;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2542 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2543 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2544
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2545 int
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2546 twrite(const char *buf, int buflen, int show_ctrl)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2547 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2548 int charsize;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2549 Rune u;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2550 int n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2551
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2552 for (n = 0; n < buflen; n += charsize) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2553 if (IS_SET(MODE_UTF8)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2554 /* process a complete utf8 char */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2555 charsize = utf8decode(buf + n, &u, buflen - n);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2556 if (charsize == 0)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2557 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2558 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2559 u = buf[n] & 0xFF;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2560 charsize = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2561 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2562 if (show_ctrl && ISCONTROL(u)) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2563 if (u & 0x80) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2564 u &= 0x7f;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2565 tputc('^');
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2566 tputc('[');
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2567 } else if (u != '\n' && u != '\r' && u != '\t') {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2568 u ^= 0x40;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2569 tputc('^');
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2570 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2571 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2572 tputc(u);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2573 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2574 return n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2575 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2576
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2577 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2578 tresize(int col, int row)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2579 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2580 int i;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2581 int minrow = MIN(row, term.row);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2582 int mincol = MIN(col, term.col);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2583 int *bp;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2584 TCursor c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2585
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2586 if (col < 1 || row < 1) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2587 fprintf(stderr,
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2588 "tresize: error resizing to %dx%d\n", col, row);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2589 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2590 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2591
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2592 /*
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2593 * slide screen to keep cursor where we expect it -
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2594 * tscrollup would work here, but we can optimize to
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2595 * memmove because we're freeing the earlier lines
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2596 */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2597 for (i = 0; i <= term.c.y - row; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2598 free(term.line[i]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2599 free(term.alt[i]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2600 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2601 /* ensure that both src and dst are not NULL */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2602 if (i > 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2603 memmove(term.line, term.line + i, row * sizeof(Line));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2604 memmove(term.alt, term.alt + i, row * sizeof(Line));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2605 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2606 for (i += row; i < term.row; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2607 free(term.line[i]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2608 free(term.alt[i]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2609 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2610
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2611 /* resize to new height */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2612 term.line = xrealloc(term.line, row * sizeof(Line));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2613 term.alt = xrealloc(term.alt, row * sizeof(Line));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2614 term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2615 term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2616
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2617 /* resize each row to new width, zero-pad if needed */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2618 for (i = 0; i < minrow; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2619 term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2620 term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2621 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2622
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2623 /* allocate any new rows */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2624 for (/* i = minrow */; i < row; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2625 term.line[i] = xmalloc(col * sizeof(Glyph));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2626 term.alt[i] = xmalloc(col * sizeof(Glyph));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2627 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2628 if (col > term.col) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2629 bp = term.tabs + term.col;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2630
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2631 memset(bp, 0, sizeof(*term.tabs) * (col - term.col));
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2632 while (--bp > term.tabs && !*bp)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2633 /* nothing */ ;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2634 for (bp += tabspaces; bp < term.tabs + col; bp += tabspaces)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2635 *bp = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2636 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2637 /* update terminal size */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2638 term.col = col;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2639 term.row = row;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2640 /* reset scrolling region */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2641 tsetscroll(0, row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2642 /* make use of the LIMIT in tmoveto */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2643 tmoveto(term.c.x, term.c.y);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2644 /* Clearing both screens (it makes dirty all lines) */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2645 c = term.c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2646 for (i = 0; i < 2; i++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2647 if (mincol < col && 0 < minrow) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2648 tclearregion(mincol, 0, col - 1, minrow - 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2649 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2650 if (0 < col && minrow < row) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2651 tclearregion(0, minrow, col - 1, row - 1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2652 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2653 tswapscreen();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2654 tcursor(CURSOR_LOAD);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2655 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2656 term.c = c;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2657 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2658
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2659 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2660 resettitle(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2661 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2662 xsettitle(NULL);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2663 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2664
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2665 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2666 drawregion(int x1, int y1, int x2, int y2)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2667 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2668 int y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2669
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2670 for (y = y1; y < y2; y++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2671 if (!term.dirty[y])
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2672 continue;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2673
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2674 term.dirty[y] = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2675 xdrawline(term.line[y], x1, y, x2);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2676 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2677 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2678
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2679 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2680 draw(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2681 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2682 int cx = term.c.x, ocx = term.ocx, ocy = term.ocy;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2683
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2684 if (!xstartdraw())
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2685 return;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2686
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2687 /* adjust cursor position */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2688 LIMIT(term.ocx, 0, term.col-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2689 LIMIT(term.ocy, 0, term.row-1);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2690 if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2691 term.ocx--;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2692 if (term.line[term.c.y][cx].mode & ATTR_WDUMMY)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2693 cx--;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2694
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2695 drawregion(0, 0, term.col, term.row);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2696 xdrawcursor(cx, term.c.y, term.line[term.c.y][cx],
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2697 term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2698 term.ocx = cx;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2699 term.ocy = term.c.y;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2700 xfinishdraw();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2701 if (ocx != term.ocx || ocy != term.ocy)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2702 xximspot(term.ocx, term.ocy);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2703 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2704
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2705 void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2706 redraw(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2707 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2708 tfulldirt();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2709 draw();
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2710 }