made kpress() more flexible, removed st.h, added config.h.
This commit is contained in:
parent
5d8aa08ba5
commit
8b4bfe31ec
1 changed files with 181 additions and 29 deletions
200
st.c
200
st.c
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -841,38 +1005,27 @@ 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;
|
||||
}
|
||||
} else
|
||||
switch(ksym) {
|
||||
case XK_Insert:
|
||||
if(shift)
|
||||
/* XXX: paste X clipboard */;
|
||||
break;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -891,7 +1044,6 @@ resize(XEvent *e) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
run(void) {
|
||||
int ret;
|
||||
|
|
Loading…
Reference in a new issue