Xinqi Bao's Git
projects
/
st.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
Getbuttoninfo is always used the same and just a helper function. Shrinking it
[st.git]
/
st.c
diff --git
a/st.c
b/st.c
index
14408c5
..
6dc20fb
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-59,13
+59,12
@@
#define STR_ARG_SIZ 16
#define DRAW_BUF_SIZ 20*1024
#define UTF_SIZ 4
#define STR_ARG_SIZ 16
#define DRAW_BUF_SIZ 20*1024
#define UTF_SIZ 4
-#define XK_
NO_MOD
UINT_MAX
-#define XK_
ANY_MOD
0
+#define XK_
ANY_MOD
UINT_MAX
+#define XK_
NO_MOD
0
#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
/* macros */
#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
/* macros */
-#define CLEANMASK(mask) (mask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
#define SERRNO strerror(errno)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) < (b) ? (b) : (a))
#define SERRNO strerror(errno)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) < (b) ? (b) : (a))
@@
-90,10
+89,6
@@
enum glyph_attribute {
};
enum cursor_movement {
};
enum cursor_movement {
- CURSOR_UP,
- CURSOR_DOWN,
- CURSOR_LEFT,
- CURSOR_RIGHT,
CURSOR_SAVE,
CURSOR_LOAD
};
CURSOR_SAVE,
CURSOR_LOAD
};
@@
-329,6
+324,7
@@
static void tsetmode(bool, bool, int *, int);
static void tfulldirt(void);
static void techo(char *, int);
static void tfulldirt(void);
static void techo(char *, int);
+static inline bool match(uint, uint);
static void ttynew(void);
static void ttyread(void);
static void ttyresize(void);
static void ttynew(void);
static void ttyread(void);
static void ttyresize(void);
@@
-625,12
+621,9
@@
selected(int x, int y) {
}
void
}
void
-getbuttoninfo(XEvent *e, int *b, int *x, int *y) {
- if(b)
- *b = e->xbutton.button;
-
- *x = x2col(e->xbutton.x);
- *y = y2row(e->xbutton.y);
+getbuttoninfo(XEvent *e) {
+ sel.ex = x2col(e->xbutton.x);
+ sel.ey = y2row(e->xbutton.y);
sel.b.x = sel.by < sel.ey ? sel.bx : sel.ex;
sel.b.y = MIN(sel.by, sel.ey);
sel.b.x = sel.by < sel.ey ? sel.bx : sel.ex;
sel.b.y = MIN(sel.by, sel.ey);
@@
-828,7
+821,7
@@
brelease(XEvent *e) {
selpaste(NULL);
} else if(e->xbutton.button == Button1) {
sel.mode = 0;
selpaste(NULL);
} else if(e->xbutton.button == Button1) {
sel.mode = 0;
- getbuttoninfo(e
, NULL, &sel.ex, &sel.ey
);
+ getbuttoninfo(e);
term.dirty[sel.ey] = 1;
if(sel.bx == sel.ex && sel.by == sel.ey) {
sel.bx = -1;
term.dirty[sel.ey] = 1;
if(sel.bx == sel.ex && sel.by == sel.ey) {
sel.bx = -1;
@@
-877,7
+870,7
@@
bmotion(XEvent *e) {
if(sel.mode) {
oldey = sel.ey;
oldex = sel.ex;
if(sel.mode) {
oldey = sel.ey;
oldex = sel.ex;
- getbuttoninfo(e
, NULL, &sel.ex, &sel.ey
);
+ getbuttoninfo(e);
if(oldey != sel.ey || oldex != sel.ex) {
starty = MIN(oldey, sel.ey);
if(oldey != sel.ey || oldex != sel.ex) {
starty = MIN(oldey, sel.ey);
@@
-2086,7
+2079,7
@@
tputc(char *c, int len) {
}
}
/*
}
}
/*
- * All characters which form
s
part of a sequence are not
+ * All characters which form part of a sequence are not
* printed
*/
return;
* printed
*/
return;
@@
-2100,11
+2093,19
@@
tputc(char *c, int len) {
sel.bx = -1;
if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
tnewline(1); /* always go to first col */
sel.bx = -1;
if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
tnewline(1); /* always go to first col */
+
+ if(IS_SET(MODE_INSERT) && term.c.x+1 < term.col) {
+ memmove(&term.line[term.c.y][term.c.x+1],
+ &term.line[term.c.y][term.c.x],
+ (term.col - term.c.x - 1) * sizeof(Glyph));
+ }
+
tsetchar(c, &term.c.attr, term.c.x, term.c.y);
tsetchar(c, &term.c.attr, term.c.x, term.c.y);
- if(term.c.x+1 < term.col)
+ if(term.c.x+1 < term.col)
{
tmoveto(term.c.x+1, term.c.y);
tmoveto(term.c.x+1, term.c.y);
- else
+ } else {
term.c.state |= CURSOR_WRAPNEXT;
term.c.state |= CURSOR_WRAPNEXT;
+ }
}
int
}
int
@@
-2688,32
+2689,60
@@
focus(XEvent *ev) {
}
}
}
}
+inline bool
+match(uint mask, uint state) {
+ if(mask == XK_NO_MOD && state)
+ return false;
+ if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
+ return false;
+ if((state & mask) != state)
+ return false;
+ return true;
+}
+
char*
kmap(KeySym k, uint state) {
uint mask;
Key *kp;
char*
kmap(KeySym k, uint state) {
uint mask;
Key *kp;
+ int i;
+
+ /* Check for mapped keys out of X11 function keys. */
+ for(i = 0; i < LEN(mappedkeys); i++) {
+ if(mappedkeys[i] == k)
+ break;
+ }
+ if(i == LEN(mappedkeys)) {
+ if((k & 0xFFFF) < 0xFF00)
+ return NULL;
+ }
- state &= ~Mod2Mask;
for(kp = key; kp < key + LEN(key); kp++) {
mask = kp->mask;
if(kp->k != k)
continue;
for(kp = key; kp < key + LEN(key); kp++) {
mask = kp->mask;
if(kp->k != k)
continue;
- if((state & mask) != mask &&
-
(mask == XK_NO_MOD &&
state))
+
+
if(!match(mask,
state))
continue;
continue;
+
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
- (kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD)))
+ (kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD))) {
continue;
continue;
+ }
+
if((kp->appcursor < 0 && IS_SET(MODE_APPCURSOR)) ||
if((kp->appcursor < 0 && IS_SET(MODE_APPCURSOR)) ||
- (kp->appcursor > 0 && !IS_SET(MODE_APPCURSOR)))
+ (kp->appcursor > 0 && !IS_SET(MODE_APPCURSOR))) {
continue;
continue;
+ }
+
if((kp->crlf < 0 && IS_SET(MODE_CRLF)) ||
if((kp->crlf < 0 && IS_SET(MODE_CRLF)) ||
- (kp->crlf > 0 && !IS_SET(MODE_CRLF)))
+ (kp->crlf > 0 && !IS_SET(MODE_CRLF))) {
continue;
continue;
+ }
return kp->s;
}
return kp->s;
}
+
return NULL;
}
return NULL;
}
@@
-2722,21
+2751,20
@@
kpress(XEvent *ev) {
XKeyEvent *e = &ev->xkey;
KeySym ksym;
char xstr[31], buf[32], *customkey, *cp = buf;
XKeyEvent *e = &ev->xkey;
KeySym ksym;
char xstr[31], buf[32], *customkey, *cp = buf;
- int len
, i
;
+ int len;
Status status;
Status status;
+ Shortcut *bp;
if (IS_SET(MODE_KBDLOCK))
return;
len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
if (IS_SET(MODE_KBDLOCK))
return;
len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
-
+ e->state &= ~Mod2Mask;
/* 1. shortcuts */
/* 1. shortcuts */
- for(i = 0; i < LEN(shortcuts); i++) {
- if((ksym == shortcuts[i].keysym)
- && (CLEANMASK(shortcuts[i].mod) == \
- CLEANMASK(e->state))
- && shortcuts[i].func) {
- shortcuts[i].func(&(shortcuts[i].arg));
+ for(bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) {
+ if(ksym == bp->keysym && match(bp->mod, e->state)) {
+ bp->func(&(bp->arg));
+ return;
}
}
}
}
@@
-2755,6
+2783,7
@@
kpress(XEvent *ev) {
memcpy(cp, xstr, len);
len = cp - buf + len;
}
memcpy(cp, xstr, len);
len = cp - buf + len;
}
+
ttywrite(buf, len);
if(IS_SET(MODE_ECHO))
techo(buf, len);
ttywrite(buf, len);
if(IS_SET(MODE_ECHO))
techo(buf, len);
@@
-2869,7
+2898,7
@@
main(int argc, char *argv[]) {
opt_class = argv[i];
break;
case 'e':
opt_class = argv[i];
break;
case 'e':
- /* eat
every
remaining arguments */
+ /* eat
all
remaining arguments */
if(++i < argc)
opt_cmd = &argv[i];
goto run;
if(++i < argc)
opt_cmd = &argv[i];
goto run;
@@
-2924,6
+2953,7
@@
run:
ttynew();
selinit();
run();
ttynew();
selinit();
run();
+
return 0;
}
return 0;
}