Introduction
Introduction Statistics Contact Development Disclaimer Help
tmade kpress() more flexible, removed st.h, added config.h. - st - [fork] custo…
git clone git://src.adamsgaard.dk/st
Log
Files
Refs
README
LICENSE
---
commit 8b4bfe31ec1075316dbb2e7d21753771ae3e5590
parent 5d8aa08ba5a13b20166f21540370b01e239819b1
Author: AurĂ©lien Aptel <[email protected]>
Date: Tue, 16 Jun 2009 02:23:46 +0200
made kpress() more flexible, removed st.h, added config.h.
Diffstat:
M st.c | 210 ++++++++++++++++++++++++++---…
1 file changed, 181 insertions(+), 29 deletions(-)
---
diff --git a/st.c b/st.c
t@@ -1,5 +1,160 @@
/* See LICENSE for licence details. */
-#include "st.h"
+/* See LICENSE for licence details. */
+#define _XOPEN_SOURCE
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+#include <sys/select.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
+
+#define TNAME "st"
+
+/* Arbitrary sizes */
+#define ESCSIZ 256
+#define ESCARG 16
+
+#define SERRNO strerror(errno)
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#define MAX(a, b) ((a) < (b) ? (b) : (a))
+#define LEN(a) (sizeof(a) / sizeof(a[0]))
+#define DEFAULT(a, b) (a) = (a) ? (a) : (b)
+#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b))
+#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
+
+/* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */
+enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 };
+enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload };
+enum { CRset=1 , CRupdate=2 };
+enum { TMwrap=1 , TMinsert=2, TMaltcharset };
+enum { SCupdate, SCredraw };
+
+typedef int Color;
+
+typedef struct {
+ KeySym k;
+ char s[ESCSIZ];
+} Key;
+
+typedef struct {
+ char c; /* character code */
+ char mode; /* attribute flags */
+ Color fg; /* foreground */
+ Color bg; /* background */
+ char state; /* state flag */
+} Glyph;
+
+typedef Glyph* Line;
+
+typedef struct {
+ Glyph attr; /* current char attributes */
+ char hidden;
+ int x;
+ int y;
+} TCursor;
+
+/* Escape sequence structs */
+/* ESC <pre> [[ [<priv>] <arg> [;]] <mode>] */
+typedef struct {
+ char buf[ESCSIZ+1]; /* raw string */
+ int len; /* raw string length */
+ char pre;
+ char priv;
+ int arg[ESCARG+1];
+ int narg; /* nb of args */
+ char mode;
+} Escseq;
+
+/* Internal representation of the screen */
+typedef struct {
+ int row; /* nb row */
+ int col; /* nb col */
+ Line* line; /* screen */
+ TCursor c; /* cursor */
+ int top; /* top scroll limit */
+ int bot; /* bottom scroll limit */
+ int mode; /* terminal mode */
+} Term;
+
+/* Purely graphic info */
+typedef struct {
+ Display* dis;
+ Window win;
+ int scr;
+ int w; /* window width */
+ int h; /* window height */
+ int ch; /* char height */
+ int cw; /* char width */
+} XWindow;
+
+#include "config.h"
+
+/* Drawing Context */
+typedef struct {
+ unsigned long col[LEN(colorname)];
+ XFontStruct* font;
+ GC gc;
+} DC;
+
+void die(const char *errstr, ...);
+void draw(int);
+void execsh(void);
+void sigchld(int);
+char* kmap(KeySym);
+void kpress(XKeyEvent *);
+void resize(XEvent *);
+void run(void);
+
+int escaddc(char);
+int escfinal(char);
+void escdump(void);
+void eschandle(void);
+void escparse(void);
+void escreset(void);
+
+void tclearregion(int, int, int, int);
+void tcpos(int);
+void tcursor(int);
+void tdeletechar(int);
+void tdeleteline(int);
+void tdump(void);
+void tinsertblank(int);
+void tinsertblankline(int);
+void tmoveto(int, int);
+void tnew(int, int);
+void tnewline(void);
+void tputc(char);
+void tputs(char*, int);
+void tresize(int, int);
+void tscroll(void);
+void tsetattr(int*, int);
+void tsetchar(char);
+void tsetscroll(int, int);
+
+void ttynew(void);
+void ttyread(void);
+void ttyresize(int, int);
+void ttywrite(char *, size_t);
+
+unsigned long xgetcol(const char *);
+void xclear(int, int, int, int);
+void xcursor(int);
+void xdrawc(int, int, Glyph);
+void xinit(void);
+void xscroll(void);
+
/* Globals */
DC dc;
t@@ -725,11 +880,11 @@ xinit(void) {
xw.dis = XOpenDisplay(NULL);
xw.scr = XDefaultScreen(xw.dis);
if(!xw.dis)
- die("can not open display");
+ die("Can't open display\n");
/* font */
if(!(dc.font = XLoadQueryFont(xw.dis, FONT)))
- die("can not find font " FONT);
+ die("Can't load font %s\n", FONT);
xw.cw = dc.font->max_bounds.rbearing - dc.font->min_bounds.lbearing;
xw.ch = dc.font->ascent + dc.font->descent + LINESPACE;
t@@ -834,6 +989,15 @@ draw(int redraw_all) {
xcursor(CSdraw);
}
+char*
+kmap(KeySym k) {
+ int i;
+ for(i = 0; i < LEN(key); i++)
+ if(key[i].k == k)
+ return (char*)key[i].s;
+ return NULL;
+}
+
void
kpress(XKeyEvent *e) {
KeySym ksym;
t@@ -841,39 +1005,28 @@ kpress(XKeyEvent *e) {
int len;
int meta;
int shift;
+ char* skmap;
meta = e->state & Mod1Mask;
shift = e->state & ShiftMask;
len = XLookupString(e, buf, sizeof(buf), &ksym, NULL);
- if(len > 0) {
+ if(skmap = kmap(ksym))
+ ttywrite(skmap, strlen(skmap));
+ else if(len > 0) {
buf[sizeof(buf)-1] = '\0';
if(meta && len == 1)
ttywrite("\033", 1);
ttywrite(buf, len);
- return;
- }
- switch(ksym) {
- default:
- fprintf(stderr, "errkey: %d\n", (int)ksym);
- break;
- case XK_Up:
- case XK_Down:
- case XK_Left:
- case XK_Right:
- sprintf(buf, "\033[%c", "DACB"[ksym - XK_Left]);
- ttywrite(buf, 3);
- break;
- case XK_Delete: ttywrite(KEYDELETE, sizeof(KEYDELETE)-1); break;
- case XK_Home: ttywrite(KEYHOME, sizeof(KEYHOME)-1); break;
- case XK_End: ttywrite(KEYEND, sizeof(KEYEND) -1); break;
- case XK_Prior: ttywrite(KEYPREV, sizeof(KEYPREV)-1); break;
- case XK_Next: ttywrite(KEYNEXT, sizeof(KEYNEXT)-1); break;
- case XK_Insert:
- /* XXX: paste X clipboard */
- if(shift)
- ;
- break;
- }
+ } else
+ switch(ksym) {
+ case XK_Insert:
+ if(shift)
+ /* XXX: paste X clipboard */;
+ break;
+ default:
+ fprintf(stderr, "errkey: %d\n", (int)ksym);
+ break;
+ }
}
void
t@@ -891,7 +1044,6 @@ resize(XEvent *e) {
}
}
-
void
run(void) {
int ret;
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.