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
b8b2bbf
..
6dc20fb
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-65,7
+65,6
@@
#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,23
+2689,40
@@
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(mask == XK_NO_MOD && state)
- continue;
- if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
- continue;
- if((state & mask) != state)
+ if(!match(mask, state))
continue;
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
continue;
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
@@
-2733,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;
}
}
}
}