tMerge remote-tracking branch 'upstream/master' - st - [fork] customized build … | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c1be1c8e8e8c2de3a37d95c3d37c5dd48dc59ea0 | |
parent b7e4c4548f3d1bc794446b74cf56e8ff373babd1 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Fri, 18 Mar 2022 17:43:39 +0100 | |
Merge remote-tracking branch 'upstream/master' | |
Diffstat: | |
M LICENSE | 4 ++-- | |
M config.mk | 2 +- | |
M st.c | 32 ++++++++++++-----------------… | |
M x.c | 90 ++++++++++++++++++-----------… | |
4 files changed, 68 insertions(+), 60 deletions(-) | |
--- | |
diff --git a/LICENSE b/LICENSE | |
t@@ -1,7 +1,7 @@ | |
MIT/X Consortium License | |
-© 2019-2020 Anders Damsgaard <anders at adamsgaard dot dk> | |
-© 2014-2020 Hiltjo Posthuma <hiltjo at codemadness dot org> | |
+© 2019-2022 Anders Damsgaard <anders at adamsgaard dot dk> | |
+© 2014-2022 Hiltjo Posthuma <hiltjo at codemadness dot org> | |
© 2018 Devin J. Pohly <djpohly at gmail dot com> | |
© 2014-2017 Quentin Rameau <quinq at fifth dot space> | |
© 2009-2012 Aurélien APTEL <aurelien dot aptel at gmail dot com> | |
diff --git a/config.mk b/config.mk | |
t@@ -1,5 +1,5 @@ | |
# st version | |
-VERSION = 0.8.4 | |
+VERSION = 0.8.5 | |
# Customize below to fit your system | |
diff --git a/st.c b/st.c | |
t@@ -349,25 +349,10 @@ utf8validate(Rune *u, size_t i) | |
return i; | |
} | |
-static const char base64_digits[] = { | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, | |
- 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, -1, 0, 0, 0, 0, 1, | |
- 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
- 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, | |
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
-}; | |
- | |
char | |
base64dec_getc(const char **src) | |
{ | |
- while (**src && !isprint(**src)) | |
+ while (**src && !isprint((unsigned char)**src)) | |
(*src)++; | |
return **src ? *((*src)++) : '='; /* emulate padding if string ends */ | |
} | |
t@@ -377,6 +362,13 @@ base64dec(const char *src) | |
{ | |
size_t in_len = strlen(src); | |
char *result, *dst; | |
+ static const char base64_digits[256] = { | |
+ [43] = 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, | |
+ 0, 0, 0, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, | |
+ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, | |
+ 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, | |
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 | |
+ }; | |
if (in_len % 4) | |
in_len += 4 - (in_len % 4); | |
t@@ -1927,7 +1919,7 @@ strhandle(void) | |
else if (xsetcolorname(defaultfg, p)) | |
fprintf(stderr, "erresc: invalid foreground co… | |
else | |
- redraw(); | |
+ tfulldirt(); | |
return; | |
case 11: | |
if (narg < 2) | |
t@@ -1940,7 +1932,7 @@ strhandle(void) | |
else if (xsetcolorname(defaultbg, p)) | |
fprintf(stderr, "erresc: invalid background co… | |
else | |
- redraw(); | |
+ tfulldirt(); | |
return; | |
case 12: | |
if (narg < 2) | |
t@@ -1953,7 +1945,7 @@ strhandle(void) | |
else if (xsetcolorname(defaultcs, p)) | |
fprintf(stderr, "erresc: invalid cursor color:… | |
else | |
- redraw(); | |
+ tfulldirt(); | |
return; | |
case 4: /* color set */ | |
if (narg < 3) | |
t@@ -1975,7 +1967,7 @@ strhandle(void) | |
* TODO if defaultbg color is changed, borders | |
* are dirty | |
*/ | |
- redraw(); | |
+ tfulldirt(); | |
} | |
return; | |
} | |
diff --git a/x.c b/x.c | |
t@@ -254,7 +254,7 @@ static char *opt_name = NULL; | |
static char *opt_title = NULL; | |
static int invertcolors = 0; | |
-static int oldbutton = 3; /* button event on startup: 3 = release */ | |
+static uint buttons; /* bit field of pressed buttons */ | |
void | |
invert(const Arg *dummy) | |
t@@ -392,61 +392,68 @@ mousesel(XEvent *e, int done) | |
void | |
mousereport(XEvent *e) | |
{ | |
- int len, x = evcol(e), y = evrow(e), | |
- button = e->xbutton.button, state = e->xbutton.state; | |
+ int len, btn, code; | |
+ int x = evcol(e), y = evrow(e); | |
+ int state = e->xbutton.state; | |
char buf[40]; | |
static int ox, oy; | |
- /* from urxvt */ | |
- if (e->xbutton.type == MotionNotify) { | |
+ if (e->type == MotionNotify) { | |
if (x == ox && y == oy) | |
return; | |
if (!IS_SET(MODE_MOUSEMOTION) && !IS_SET(MODE_MOUSEMANY)) | |
return; | |
- /* MOUSE_MOTION: no reporting if no button is pressed */ | |
- if (IS_SET(MODE_MOUSEMOTION) && oldbutton == 3) | |
+ /* MODE_MOUSEMOTION: no reporting if no button is pressed */ | |
+ if (IS_SET(MODE_MOUSEMOTION) && buttons == 0) | |
return; | |
- | |
- button = oldbutton + 32; | |
- ox = x; | |
- oy = y; | |
+ /* Set btn to lowest-numbered pressed button, or 12 if no | |
+ * buttons are pressed. */ | |
+ for (btn = 1; btn <= 11 && !(buttons & (1<<(btn-1))); btn++) | |
+ ; | |
+ code = 32; | |
} else { | |
- if (!IS_SET(MODE_MOUSESGR) && e->xbutton.type == ButtonRelease… | |
- button = 3; | |
- } else { | |
- button -= Button1; | |
- if (button >= 7) | |
- button += 128 - 7; | |
- else if (button >= 3) | |
- button += 64 - 3; | |
- } | |
- if (e->xbutton.type == ButtonPress) { | |
- oldbutton = button; | |
- ox = x; | |
- oy = y; | |
- } else if (e->xbutton.type == ButtonRelease) { | |
- oldbutton = 3; | |
+ btn = e->xbutton.button; | |
+ /* Only buttons 1 through 11 can be encoded */ | |
+ if (btn < 1 || btn > 11) | |
+ return; | |
+ if (e->type == ButtonRelease) { | |
/* MODE_MOUSEX10: no button release reporting */ | |
if (IS_SET(MODE_MOUSEX10)) | |
return; | |
- if (button == 64 || button == 65) | |
+ /* Don't send release events for the scroll wheel */ | |
+ if (btn == 4 || btn == 5) | |
return; | |
} | |
+ code = 0; | |
} | |
+ ox = x; | |
+ oy = y; | |
+ | |
+ /* Encode btn into code. If no button is pressed for a motion event in | |
+ * MODE_MOUSEMANY, then encode it as a release. */ | |
+ if ((!IS_SET(MODE_MOUSESGR) && e->type == ButtonRelease) || btn == 12) | |
+ code += 3; | |
+ else if (btn >= 8) | |
+ code += 128 + btn - 8; | |
+ else if (btn >= 4) | |
+ code += 64 + btn - 4; | |
+ else | |
+ code += btn - 1; | |
+ | |
if (!IS_SET(MODE_MOUSEX10)) { | |
- button += ((state & ShiftMask ) ? 4 : 0) | |
- + ((state & Mod4Mask ) ? 8 : 0) | |
- + ((state & ControlMask) ? 16 : 0); | |
+ code += ((state & ShiftMask ) ? 4 : 0) | |
+ + ((state & Mod1Mask ) ? 8 : 0) /* meta key: alt */ | |
+ + ((state & ControlMask) ? 16 : 0); | |
} | |
if (IS_SET(MODE_MOUSESGR)) { | |
len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", | |
- button, x+1, y+1, | |
- e->xbutton.type == ButtonRelease ? 'm' : 'M'); | |
+ code, x+1, y+1, | |
+ e->type == ButtonRelease ? 'm' : 'M'); | |
} else if (x < 223 && y < 223) { | |
len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", | |
- 32+button, 32+x+1, 32+y+1); | |
+ 32+code, 32+x+1, 32+y+1); | |
} else { | |
return; | |
} | |
t@@ -489,9 +496,13 @@ mouseaction(XEvent *e, uint release) | |
void | |
bpress(XEvent *e) | |
{ | |
+ int btn = e->xbutton.button; | |
struct timespec now; | |
int snap; | |
+ if (1 <= btn && btn <= 11) | |
+ buttons |= 1 << (btn-1); | |
+ | |
if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { | |
mousereport(e); | |
return; | |
t@@ -500,7 +511,7 @@ bpress(XEvent *e) | |
if (mouseaction(e, 0)) | |
return; | |
- if (e->xbutton.button == Button1) { | |
+ if (btn == Button1) { | |
/* | |
* If the user clicks below predefined timeouts specific | |
* snapping behaviour is exposed. | |
t@@ -714,6 +725,11 @@ xsetsel(char *str) | |
void | |
brelease(XEvent *e) | |
{ | |
+ int btn = e->xbutton.button; | |
+ | |
+ if (1 <= btn && btn <= 11) | |
+ buttons &= ~(1 << (btn-1)); | |
+ | |
if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { | |
mousereport(e); | |
return; | |
t@@ -721,7 +737,7 @@ brelease(XEvent *e) | |
if (mouseaction(e, 1)) | |
return; | |
- if (e->xbutton.button == Button1) | |
+ if (btn == Button1) | |
mousesel(e, 1); | |
} | |
t@@ -1517,12 +1533,12 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Gly… | |
/* Render underline and strikethrough. */ | |
if (base.mode & ATTR_UNDERLINE) { | |
- XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, | |
+ XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale… | |
width, 1); | |
} | |
if (base.mode & ATTR_STRUCK) { | |
- XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, | |
+ XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chs… | |
width, 1); | |
} | |