aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.h22
-rw-r--r--st.c168
2 files changed, 89 insertions, 101 deletions
diff --git a/config.h b/config.h
index c01354d..5d91627 100644
--- a/config.h
+++ b/config.h
@@ -6,7 +6,7 @@
6#define LINESPACE 1 /* additional pixel between each line */ 6#define LINESPACE 1 /* additional pixel between each line */
7 7
8/* Terminal colors */ 8/* Terminal colors */
9static char* colorname[] = { 9static const char *colorname[] = {
10 "black", 10 "black",
11 "red", 11 "red",
12 "green", 12 "green",
@@ -26,14 +26,14 @@ static char* colorname[] = {
26 26
27 27
28/* special keys */ 28/* special keys */
29static Key key[] = { 29static const char *key[] = {
30 { XK_Delete, "\033[3~" }, 30 [XK_Delete] = "\033[3~",
31 { XK_Home, "\033[1~" }, 31 [XK_Home] = "\033[1~",
32 { XK_End, "\033[4~" }, 32 [XK_End] = "\033[4~",
33 { XK_Prior, "\033[5~" }, 33 [XK_Prior] = "\033[5~",
34 { XK_Next, "\033[6~" }, 34 [XK_Next] = "\033[6~",
35 { XK_Left, "\033[D" }, 35 [XK_Left] = "\033[D",
36 { XK_Right, "\033[C" }, 36 [XK_Right] = "\033[C",
37 { XK_Up, "\033[A" }, 37 [XK_Up] = "\033[A",
38 { XK_Down, "\033[B" }, 38 [XK_Down] = "\033[B",
39}; 39};
diff --git a/st.c b/st.c
index a7f957b..559dcda 100644
--- a/st.c
+++ b/st.c
@@ -1,5 +1,5 @@
1/* See LICENSE for licence details. */ 1/* See LICENSE for licence details. */
2#define _XOPEN_SOURCE 2#define _XOPEN_SOURCE 600
3#include <ctype.h> 3#include <ctype.h>
4#include <errno.h> 4#include <errno.h>
5#include <fcntl.h> 5#include <fcntl.h>
@@ -107,61 +107,68 @@ typedef struct {
107 GC gc; 107 GC gc;
108} DC; 108} DC;
109 109
110void die(const char *errstr, ...); 110static void die(const char *errstr, ...);
111void draw(int); 111static void draw(int);
112void execsh(void); 112static void execsh(void);
113void sigchld(int); 113static void sigchld(int);
114char* kmap(KeySym); 114static void run(void);
115void kpress(XKeyEvent *); 115
116void resize(XEvent *); 116static int escaddc(char);
117void run(void); 117static int escfinal(char);
118 118static void escdump(void);
119int escaddc(char); 119static void eschandle(void);
120int escfinal(char); 120static void escparse(void);
121void escdump(void); 121static void escreset(void);
122void eschandle(void); 122
123void escparse(void); 123static void tclearregion(int, int, int, int);
124void escreset(void); 124static void tcpos(int);
125 125static void tcursor(int);
126void tclearregion(int, int, int, int); 126static void tdeletechar(int);
127void tcpos(int); 127static void tdeleteline(int);
128void tcursor(int); 128static void tdump(void);
129void tdeletechar(int); 129static void tinsertblank(int);
130void tdeleteline(int); 130static void tinsertblankline(int);
131void tdump(void); 131static void tmoveto(int, int);
132void tinsertblank(int); 132static void tnew(int, int);
133void tinsertblankline(int); 133static void tnewline(void);
134void tmoveto(int, int); 134static void tputc(char);
135void tnew(int, int); 135static void tputs(char*, int);
136void tnewline(void); 136static void tresize(int, int);
137void tputc(char); 137static void tscroll(void);
138void tputs(char*, int); 138static void tsetattr(int*, int);
139void tresize(int, int); 139static void tsetchar(char);
140void tscroll(void); 140static void tsetscroll(int, int);
141void tsetattr(int*, int); 141
142void tsetchar(char); 142static void ttynew(void);
143void tsetscroll(int, int); 143static void ttyread(void);
144 144static void ttyresize(int, int);
145void ttynew(void); 145static void ttywrite(const char *, size_t);
146void ttyread(void); 146
147void ttyresize(int, int); 147static unsigned long xgetcol(const char *);
148void ttywrite(char *, size_t); 148static void xclear(int, int, int, int);
149 149static void xcursor(int);
150unsigned long xgetcol(const char *); 150static void xdrawc(int, int, Glyph);
151void xclear(int, int, int, int); 151static void xinit(void);
152void xcursor(int); 152static void xscroll(void);
153void xdrawc(int, int, Glyph); 153
154void xinit(void); 154static void expose(XEvent *);
155void xscroll(void); 155static void kpress(XEvent *);
156static void resize(XEvent *);
157
158static void (*handler[LASTEvent])(XEvent *) = {
159 [KeyPress] = kpress,
160 [Expose] = expose,
161 [ConfigureNotify] = resize
162};
156 163
157/* Globals */ 164/* Globals */
158DC dc; 165static DC dc;
159XWindow xw; 166static XWindow xw;
160Term term; 167static Term term;
161Escseq escseq; 168static Escseq escseq;
162int cmdfd; 169static int cmdfd;
163pid_t pid; 170static pid_t pid;
164int running; 171static int running;
165 172
166void 173void
167die(const char *errstr, ...) { 174die(const char *errstr, ...) {
@@ -259,7 +266,7 @@ ttyread(void) {
259} 266}
260 267
261void 268void
262ttywrite(char *s, size_t n) { 269ttywrite(const char *s, size_t n) {
263 if(write(cmdfd, s, n) == -1) 270 if(write(cmdfd, s, n) == -1)
264 die("write error on tty: %s\n", SERRNO); 271 die("write error on tty: %s\n", SERRNO);
265} 272}
@@ -997,29 +1004,25 @@ draw(int redraw_all) {
997 xcursor(CSdraw); 1004 xcursor(CSdraw);
998} 1005}
999 1006
1000char* 1007void
1001kmap(KeySym k) { 1008expose(XEvent *ev) {
1002 int i; 1009 draw(SCredraw);
1003 for(i = 0; i < LEN(key); i++)
1004 if(key[i].k == k)
1005 return (char*)key[i].s;
1006 return NULL;
1007} 1010}
1008 1011
1009void 1012void
1010kpress(XKeyEvent *e) { 1013kpress(XEvent *ev) {
1014 XKeyEvent *e = &ev->xkey;
1011 KeySym ksym; 1015 KeySym ksym;
1012 char buf[32]; 1016 char buf[32];
1013 int len; 1017 int len;
1014 int meta; 1018 int meta;
1015 int shift; 1019 int shift;
1016 char* skmap;
1017 1020
1018 meta = e->state & Mod1Mask; 1021 meta = e->state & Mod1Mask;
1019 shift = e->state & ShiftMask; 1022 shift = e->state & ShiftMask;
1020 len = XLookupString(e, buf, sizeof(buf), &ksym, NULL); 1023 len = XLookupString(e, buf, sizeof(buf), &ksym, NULL);
1021 if(skmap = kmap(ksym)) 1024 if(key[ksym])
1022 ttywrite(skmap, strlen(skmap)); 1025 ttywrite(key[ksym], strlen(key[ksym]));
1023 else if(len > 0) { 1026 else if(len > 0) {
1024 buf[sizeof(buf)-1] = '\0'; 1027 buf[sizeof(buf)-1] = '\0';
1025 if(meta && len == 1) 1028 if(meta && len == 1)
@@ -1054,7 +1057,6 @@ resize(XEvent *e) {
1054 1057
1055void 1058void
1056run(void) { 1059run(void) {
1057 int ret;
1058 XEvent ev; 1060 XEvent ev;
1059 fd_set rfd; 1061 fd_set rfd;
1060 int xfd = XConnectionNumber(xw.dis); 1062 int xfd = XConnectionNumber(xw.dis);
@@ -1062,39 +1064,25 @@ run(void) {
1062 running = 1; 1064 running = 1;
1063 XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask); 1065 XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask);
1064 XResizeWindow(xw.dis, xw.win, xw.w , xw.h); /* fix resize bug in wmii (?) */ 1066 XResizeWindow(xw.dis, xw.win, xw.w , xw.h); /* fix resize bug in wmii (?) */
1065 1067
1066 while(running) { 1068 while(running) {
1067 FD_ZERO(&rfd); 1069 FD_ZERO(&rfd);
1068 FD_SET(cmdfd, &rfd); 1070 FD_SET(cmdfd, &rfd);
1069 FD_SET(xfd, &rfd); 1071 FD_SET(xfd, &rfd);
1070 XFlush(xw.dis); 1072 if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) == -1) {
1071 ret = select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL); 1073 if(errno == EINTR)
1072 1074 continue;
1073 if(ret < 0)
1074 die("select failed: %s\n", SERRNO); 1075 die("select failed: %s\n", SERRNO);
1075
1076 if(FD_ISSET(xfd, &rfd)) {
1077 while(XPending(xw.dis)) {
1078 XNextEvent(xw.dis, &ev);
1079 switch (ev.type) {
1080 default:
1081 break;
1082 case KeyPress:
1083 kpress(&ev.xkey);
1084 break;
1085 case Expose:
1086 draw(SCredraw);
1087 break;
1088 case ConfigureNotify:
1089 resize(&ev);
1090 break;
1091 }
1092 }
1093 } 1076 }
1094 if(FD_ISSET(cmdfd, &rfd)) { 1077 if(FD_ISSET(cmdfd, &rfd)) {
1095 ttyread(); 1078 ttyread();
1096 draw(SCupdate); 1079 draw(SCupdate);
1097 } 1080 }
1081 while(XPending(xw.dis)) {
1082 XNextEvent(xw.dis, &ev);
1083 if(handler[ev.type])
1084 (handler[ev.type])(&ev);
1085 }
1098 } 1086 }
1099} 1087}
1100 1088