#define XK_SWITCH_MOD (1<<13)
/* macros */
-#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 ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177')
-#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
-#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
-#define ISDELIM(u) (utf8strchr(worddelimiters, u) != NULL)
-#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
-#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg)
-#define IS_SET(flag) ((term.mode & (flag)) != 0)
-#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + (t1.tv_nsec-t2.tv_nsec)/1E6)
-#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit)))
-
-#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b))
-#define IS_TRUECOL(x) (1 << 24 & (x))
-#define TRUERED(x) (((x) & 0xff0000) >> 8)
-#define TRUEGREEN(x) (((x) & 0xff00))
-#define TRUEBLUE(x) (((x) & 0xff) << 8)
+#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 ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177')
+#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
+#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
+#define ISDELIM(u) (utf8strchr(worddelimiters, u) != NULL)
+#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
+#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || \
+ (a).bg != (b).bg)
+#define IS_SET(flag) ((term.mode & (flag)) != 0)
+#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \
+ (t1.tv_nsec-t2.tv_nsec)/1E6)
+#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit)))
+
+#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b))
+#define IS_TRUECOL(x) (1 << 24 & (x))
+#define TRUERED(x) (((x) & 0xff0000) >> 8)
+#define TRUEGREEN(x) (((x) & 0xff00))
+#define TRUEBLUE(x) (((x) & 0xff) << 8)
enum glyph_attribute {
ssize_t
xwrite(int fd, const char *s, size_t len)
{
- size_t aux = len;
+ size_t aux = len, r;
while (len > 0) {
- ssize_t r = write(fd, s, len);
+ r = write(fd, s, len);
if (r < 0)
return r;
len -= r;
s += r;
}
+
return aux;
}
return 0;
*u = udecoded;
utf8validate(u, len);
+
return len;
}
for (*i = 0; *i < LEN(utfmask); ++(*i))
if (((uchar)c & utfmask[*i]) == utfbyte[*i])
return (uchar)c & ~utfmask[*i];
+
return 0;
}
len = utf8validate(&u, 0);
if (len > UTF_SIZ)
return 0;
+
for (i = len - 1; i != 0; --i) {
c[i] = utf8encodebyte(u, 0);
u >>= 6;
}
c[0] = utf8encodebyte(u, len);
+
return len;
}
if (r == u)
return &(s[i]);
}
+
return NULL;
}
*u = UTF_INVALID;
for (i = 1; *u > utfmax[i]; ++i)
;
+
return i;
}
if (xpev->state == PropertyNewValue &&
(xpev->atom == XA_PRIMARY ||
xpev->atom == clipboard)) {
- slenotify(e);
+ selnotify(e);
}
}
uchar *data, *last, *repl;
Atom type, incratom, property;
+ incratom = XInternAtom(xw.dpy, "INCR", 0);
+
ofs = 0;
if (e->type == SelectionNotify) {
property = e->xselection.property;
void
ttywrite(const char *s, size_t n)
{
- if (xwrite(cmdfd, s, n) == -1)
- die("write error on tty: %s\n", strerror(errno));
+ fd_set wfd;
+ struct timespec tv;
+ ssize_t r;
+
+ /*
+ * Remember that we are using a pty, which might be a modem line.
+ * Writing too much will clog the line. That's why we are doing this
+ * dance.
+ * FIXME: Migrate the world to Plan 9.
+ */
+ while (n > 0) {
+ FD_ZERO(&wfd);
+ FD_SET(cmdfd, &wfd);
+ tv.tv_sec = 0;
+ tv.tv_nsec = 0;
+
+ /* Check if we can write. */
+ if (pselect(cmdfd+1, NULL, &wfd, NULL, &tv, NULL) < 0) {
+ if (errno == EINTR)
+ continue;
+ die("select failed: %s\n", strerror(errno));
+ }
+ if(!FD_ISSET(cmdfd, &wfd)) {
+ /* No, then free some buffer space. */
+ ttyread();
+ } else {
+ /*
+ * Only write 256 bytes at maximum. This seems to be a
+ * reasonable value for a serial line. Bigger values
+ * might clog the I/O.
+ */
+ r = write(cmdfd, s, (n < 256)? n : 256);
+ if (r < 0) {
+ die("write error on tty: %s\n",
+ strerror(errno));
+ }
+ if (r < n) {
+ /*
+ * We weren't able to write out everything.
+ * This means the buffer is getting full
+ * again. Empty it.
+ */
+ ttyread();
+ n -= r;
+ s += r;
+ } else {
+ /* All bytes have been written. */
+ break;
+ }
+ }
+ }
}
void
} else
name = colorname[i];
}
+
return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
}
XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
dc.col[x] = ncolor;
+
return 0;
}
case YNegative:
return SouthWestGravity;
}
+
return SouthEastGravity;
}
return 0;
}
+