Xinqi Bao's Git
projects
/
st.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
make underlines and strikethroughs respect `chscale`
[st.git]
/
x.c
diff --git
a/x.c
b/x.c
index
248d505
..
2a3bd38
100644
(file)
--- a/
x.c
+++ b/
x.c
@@
-252,7
+252,7
@@
static char *opt_line = NULL;
static char *opt_name = NULL;
static char *opt_title = NULL;
static char *opt_name = NULL;
static char *opt_title = NULL;
-static
int oldbutton = 3; /* button event on startup: 3 = release
*/
+static
uint buttons; /* bit field of pressed buttons
*/
void
clipcopy(const Arg *dummy)
void
clipcopy(const Arg *dummy)
@@
-364,61
+364,68
@@
mousesel(XEvent *e, int done)
void
mousereport(XEvent *e)
{
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;
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;
if (x == ox && y == oy)
return;
if (!IS_SET(MODE_MOUSEMOTION) && !IS_SET(MODE_MOUSEMANY))
return;
- /* MO
USE_
MOTION: no reporting if no button is pressed */
- if (IS_SET(MODE_MOUSEMOTION) &&
oldbutton == 3
)
+ /* MO
DE_MOUSE
MOTION: no reporting if no button is pressed */
+ if (IS_SET(MODE_MOUSEMOTION) &&
buttons == 0
)
return;
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 {
} 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;
/* 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;
}
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)) {
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",
}
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",
} 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;
}
} else {
return;
}
@@
-461,9
+468,13
@@
mouseaction(XEvent *e, uint release)
void
bpress(XEvent *e)
{
void
bpress(XEvent *e)
{
+ int btn = e->xbutton.button;
struct timespec now;
int snap;
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;
if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) {
mousereport(e);
return;
@@
-472,7
+483,7
@@
bpress(XEvent *e)
if (mouseaction(e, 0))
return;
if (mouseaction(e, 0))
return;
- if (
e->xbutton.butto
n == Button1) {
+ if (
bt
n == Button1) {
/*
* If the user clicks below predefined timeouts specific
* snapping behaviour is exposed.
/*
* If the user clicks below predefined timeouts specific
* snapping behaviour is exposed.
@@
-686,6
+697,11
@@
xsetsel(char *str)
void
brelease(XEvent *e)
{
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;
if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) {
mousereport(e);
return;
@@
-693,7
+709,7
@@
brelease(XEvent *e)
if (mouseaction(e, 1))
return;
if (mouseaction(e, 1))
return;
- if (
e->xbutton.butto
n == Button1)
+ if (
bt
n == Button1)
mousesel(e, 1);
}
mousesel(e, 1);
}
@@
-799,6
+815,19
@@
xloadcols(void)
loaded = 1;
}
loaded = 1;
}
+int
+xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b)
+{
+ if (!BETWEEN(x, 0, dc.collen))
+ return 1;
+
+ *r = dc.col[x].color.red >> 8;
+ *g = dc.col[x].color.green >> 8;
+ *b = dc.col[x].color.blue >> 8;
+
+ return 0;
+}
+
int
xsetcolorname(int x, const char *name)
{
int
xsetcolorname(int x, const char *name)
{
@@
-1464,12
+1493,12
@@
xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
/* Render underline and strikethrough. */
if (base.mode & ATTR_UNDERLINE) {
/* 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
+ 1,
width, 1);
}
if (base.mode & ATTR_STRUCK) {
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
* chscale
/ 3,
width, 1);
}
width, 1);
}
@@
-1588,8
+1617,9
@@
xseticontitle(char *p)
XTextProperty prop;
DEFAULT(p, opt_title);
XTextProperty prop;
DEFAULT(p, opt_title);
- Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
- &prop);
+ if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
+ &prop) != Success)
+ return;
XSetWMIconName(xw.dpy, xw.win, &prop);
XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname);
XFree(prop.value);
XSetWMIconName(xw.dpy, xw.win, &prop);
XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname);
XFree(prop.value);
@@
-1601,8
+1631,9
@@
xsettitle(char *p)
XTextProperty prop;
DEFAULT(p, opt_title);
XTextProperty prop;
DEFAULT(p, opt_title);
- Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
- &prop);
+ if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
+ &prop) != Success)
+ return;
XSetWMName(xw.dpy, xw.win, &prop);
XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname);
XFree(prop.value);
XSetWMName(xw.dpy, xw.win, &prop);
XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname);
XFree(prop.value);